diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/CentralClubApiController.java b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/CentralClubApiController.java index 3c4ec732..4208b598 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/CentralClubApiController.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/CentralClubApiController.java @@ -4,6 +4,7 @@ import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE; import ddingdong.ddingdongBE.auth.PrincipalDetails; +import ddingdong.ddingdongBE.domain.club.controller.dto.request.UpdateClubMemberRequest; import ddingdong.ddingdongBE.domain.club.controller.dto.request.UpdateClubRequest; import ddingdong.ddingdongBE.domain.club.controller.dto.response.DetailClubResponse; import ddingdong.ddingdongBE.domain.club.service.ClubMemberService; @@ -13,6 +14,7 @@ import java.util.List; +import java.util.Optional; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,9 +23,7 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @@ -63,11 +63,12 @@ public void updateClub(@AuthenticationPrincipal PrincipalDetails principalDetail } } - @PutMapping("/club-members") + @PutMapping(value = "/club-members") public void updateClubMembers(@AuthenticationPrincipal PrincipalDetails principalDetails, - @RequestParam MultipartFile clubMemberListFile) { + @RequestPart(value = "data", required = false) UpdateClubMemberRequest request, + @RequestPart(name = "file", required = false) Optional clubMemberListFile) { User user = principalDetails.getUser(); - clubMemberService.updateClubMembers(user.getId(), clubMemberListFile); + clubMemberService.updateClubMembers(user.getId(), request, clubMemberListFile); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/ClubMemberDto.java b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/ClubMemberDto.java index 5cc21da2..14b22900 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/ClubMemberDto.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/controller/dto/request/ClubMemberDto.java @@ -9,6 +9,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; @Getter @@ -63,9 +64,16 @@ public static ClubMemberDto fromExcelRow(Row row) { Iterator cellIterator = row.cellIterator(); while (cellIterator.hasNext()) { Cell cell = cellIterator.next(); - if (cell.getStringCellValue() != null) { - clubMemberDto.setValueByCell(cell.getStringCellValue(), cell.getColumnIndex()); + if (cell.getCellType() == CellType.STRING) { + if (cell.getStringCellValue() != null) { + clubMemberDto.setValueByCell(cell.getStringCellValue(), cell.getColumnIndex()); + } + } else if (cell.getCellType() == CellType.NUMERIC) { + if (cell.getNumericCellValue() != 0) { + clubMemberDto.setValueByCell(String.valueOf(cell.getNumericCellValue()), cell.getColumnIndex()); + } } + } return clubMemberDto; } @@ -84,7 +92,7 @@ private void setValueByCell(String stringCellValue, int columnIndex) { } private void validatePositionValue(String stringCellValue) { - if (Arrays.stream(Position.values()).noneMatch(position -> position.getName().equals(stringCellValue))) { + if (Arrays.stream(Position.values()).noneMatch(position-> position.name().equals(stringCellValue))) { throw new IllegalArgumentException("동아리원의 역할은 LEADER, EXECUTIVE, MEMBER 중 하나입니다. "); } } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubMemberRepository.java b/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubMemberRepository.java index 4b26a234..08b29eda 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubMemberRepository.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/repository/ClubMemberRepository.java @@ -4,6 +4,7 @@ import ddingdong.ddingdongBE.domain.club.entity.ClubMember; +import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -11,6 +12,8 @@ public interface ClubMemberRepository extends JpaRepository { + List findClubMembersByClubId(Long clubId); + @Modifying @Query("delete from ClubMember c where c.club = :club") void deleteAllByClub(@Param("club") Club club); diff --git a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubMemberService.java b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubMemberService.java index aef494c9..cbd0d5aa 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubMemberService.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/club/service/ClubMemberService.java @@ -3,6 +3,7 @@ import static ddingdong.ddingdongBE.common.exception.ErrorMessage.NO_SUCH_CLUB; import ddingdong.ddingdongBE.domain.club.controller.dto.request.ClubMemberDto; +import ddingdong.ddingdongBE.domain.club.controller.dto.request.UpdateClubMemberRequest; import ddingdong.ddingdongBE.domain.club.entity.Club; import ddingdong.ddingdongBE.domain.club.entity.ClubMember; import ddingdong.ddingdongBE.domain.club.repository.ClubMemberRepository; @@ -10,6 +11,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import javax.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.apache.poi.ss.usermodel.CellType; @@ -28,21 +30,44 @@ public class ClubMemberService { private final ClubRepository clubRepository; private final ClubMemberRepository clubMemberRepository; - public void updateClubMembers(Long userId, MultipartFile clubMemberListFile) { - isExcelFile(clubMemberListFile); + public void updateClubMembers(Long userId, UpdateClubMemberRequest request, + Optional clubMemberListFile) { + if (clubMemberListFile.isPresent()) { + MultipartFile file = clubMemberListFile.get(); + isExcelFile(file); + + Club club = clubRepository.findByUserId(userId) + .orElseThrow(() -> new IllegalArgumentException(NO_SUCH_CLUB.getText())); + List requestedClubMemberDtos = parsingClubMemberListFile(file); + List requestedClubMembers = requestedClubMemberDtos.stream() + .map(clubMemberDto -> clubMemberDto.toEntity(club)) + .toList(); + + clubMemberRepository.deleteAllByClub(club); + clubMemberRepository.saveAll(requestedClubMembers); + return; + } Club club = clubRepository.findByUserId(userId) .orElseThrow(() -> new IllegalArgumentException(NO_SUCH_CLUB.getText())); - List requestedClubMemberDtos = parsingClubMemberListFile( - clubMemberListFile); - List requestedClubMembers = requestedClubMemberDtos.stream() + + List memberIds = clubMemberRepository.findClubMembersByClubId(club.getId()) + .stream() + .map(ClubMember::getId) + .toList(); + + List requestedClubMembers = request.getClubMemberList().stream() .map(clubMemberDto -> clubMemberDto.toEntity(club)) .toList(); - clubMemberRepository.deleteAllByClub(club); + if (!memberIds.isEmpty()) { + clubMemberRepository.deleteAllById(memberIds); + } + clubMemberRepository.saveAll(requestedClubMembers); } + private void isExcelFile(MultipartFile file) { String fileName = file.getOriginalFilename(); if (fileName != null && !(fileName.endsWith(".xls") || fileName.endsWith(".xlsx"))) { @@ -61,7 +86,7 @@ private static List parsingClubMemberListFile(MultipartFile clubM } } } catch (IOException e) { - throw new IllegalArgumentException(e); + throw new IllegalArgumentException("올바른 엑셀 양식을 사용해주세요."); } return requestedClubMemberDtos; } diff --git a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/ClubStamp.java b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/ClubStamp.java index 95695291..2744b1de 100644 --- a/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/ClubStamp.java +++ b/src/main/java/ddingdong/ddingdongBE/domain/qrstamp/entity/ClubStamp.java @@ -28,7 +28,7 @@ public enum ClubStamp { 그림패시만화("그림패시만화", "EVENTPIC"), 포토랩("포토랩", "EVENTPHO"), 디비전("디비전", "EVENTDIV"), - 코아("코아", "EVENTCOA"), + 코아("코아", "EVENTCOAD"), 씨네메이션("씨네메이션", "EVENTCINE"), 실로암("실로암", "EVENTSIL"), CCC("ccc", "EVENTCCC"), @@ -50,7 +50,7 @@ public enum ClubStamp { MJTA("MJTA", "EVENTMJTA"), 콕콕콕("콕콕콕", "EVENTCOK"), 바다이야기("바다이야기", "EVENTSEA"), - 파인("파인", "EVENTFINE"), + 파인("파인", "EVENTPINE"), TIME("TIME", "EVENTTIME"), 명지서법("명지서법", "EVENTWORD"), MIRS("MIRS", "EVENTMIRS");