diff --git a/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java b/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java index 79f6526..65f9244 100644 --- a/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java +++ b/src/main/java/com/assu/server/domain/certification/service/CertificationServiceImpl.java @@ -71,7 +71,7 @@ public CertificationResponseDTO.getSessionIdResponse getSessionId( sessionManager.openSession(sessionId); // 세션 생성 직후 만료 시간을 5분으로 설정 - timeoutManager.scheduleTimeout(sessionId, Duration.ofMinutes(100));// TODO: 나중에 5분으로 변경 + timeoutManager.scheduleTimeout(sessionId, Duration.ofMinutes(10));// TODO: 나중에 5분으로 변경 // 세션 여는 대표자는 제일 먼저 인증 sessionManager.addUserToSession(sessionId, userId); diff --git a/src/main/java/com/assu/server/domain/partnership/converter/PartnershipConverter.java b/src/main/java/com/assu/server/domain/partnership/converter/PartnershipConverter.java index c2f0a26..7823df4 100644 --- a/src/main/java/com/assu/server/domain/partnership/converter/PartnershipConverter.java +++ b/src/main/java/com/assu/server/domain/partnership/converter/PartnershipConverter.java @@ -38,21 +38,6 @@ public static PartnershipUsage toPartnershipUsage(PartnershipRequestDTO.finalReq .partnershipContent(dto.getPartnershipContent()) .build(); } - public static Paper toPaperEntity( - PartnershipRequestDTO.WritePartnershipRequestDTO partnershipRequestDTO, - Admin admin, - Partner partner, - Store store - ) { - return Paper.builder() - .partnershipPeriodStart(partnershipRequestDTO.getPartnershipPeriodStart()) - .partnershipPeriodEnd(partnershipRequestDTO.getPartnershipPeriodEnd()) - .isActivated(ActivationStatus.SUSPEND) - .admin(admin) - .store(store) - .partner(partner) - .build(); - } public static Paper toDraftPaperEntity(Admin admin, Partner partner, Store store) { return Paper.builder() @@ -305,5 +290,6 @@ public static PartnershipResponseDTO.CreateDraftResponseDTO toCreateDraftRespons public static void updatePaperFromDto(Paper paper, PartnershipRequestDTO.WritePartnershipRequestDTO dto) { paper.setPartnershipPeriodStart(dto.getPartnershipPeriodStart()); paper.setPartnershipPeriodEnd(dto.getPartnershipPeriodEnd()); + paper.setIsActivated(ActivationStatus.SUSPEND); } } diff --git a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java index a7c936a..8418f44 100644 --- a/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java +++ b/src/main/java/com/assu/server/domain/partnership/service/PartnershipServiceImpl.java @@ -59,48 +59,80 @@ public class PartnershipServiceImpl implements PartnershipService { @Override @Transactional - public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Member member){ - - Student requestStudent = studentRepository.findById(member.getId()).orElseThrow( - () -> new GeneralException(ErrorStatus.NO_SUCH_STUDENT) // 혹은 적절한 예외 처리 - ); - - List usages = new ArrayList<>(); - + public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Member member) { + // 1. 제휴 내용(PaperContent) 조회 PaperContent content = contentRepository.findById(dto.getContentId()).orElseThrow( () -> new GeneralException(ErrorStatus.NO_SUCH_CONTENT) ); Long paperId = content.getPaper().getId(); - // 1) 요청한 member 본인 - usages.add(PartnershipConverter.toPartnershipUsage(dto, requestStudent, paperId)); - requestStudent.setStamp(); - System.out.println("update 된 stamp : "+requestStudent.getStamp()); - - List userIds = Optional.ofNullable(dto.getUserIds()).orElse(Collections.emptyList()); - // 2) dto의 userIds에 있는 다른 사용자들 - for (Long userId : userIds) { - if(userId != member.getId()){ - Student student = studentRepository.getReferenceById(userId); - usages.add(PartnershipConverter.toPartnershipUsage(dto, student, paperId)); + + // 2. 중복을 허용하지 않는 Set을 사용하여 모든 사용자 ID를 수집 + Set uniqueUserIds = new HashSet<>(); + // 요청자 본인 ID 추가 + uniqueUserIds.add(member.getId()); + // DTO에 포함된 사용자 ID들 추가 (null일 경우 무시) + if (dto.getUserIds() != null) { + uniqueUserIds.addAll(dto.getUserIds()); + } + + // 3. 모든 학생 정보를 DB에서 한 번의 쿼리로 조회 (N+1 문제 해결) + List studentsToUpdate = studentRepository.findAllById(uniqueUserIds); + + // 4. 조회된 학생들에 대해 PartnershipUsage 생성 및 스탬프 업데이트 + List usages = studentsToUpdate.stream() + .map(student -> { student.setStamp(); - } + return PartnershipConverter.toPartnershipUsage(dto, student, paperId); + }) + .collect(Collectors.toList()); - } + // 5. 생성된 모든 Usage 기록을 한 번에 저장 + partnershipUsageRepository.saveAll(usages); - Store store = storeRepository.findById(dto.getStoreId()).orElseThrow( - () -> new GeneralException(ErrorStatus.NO_SUCH_STORE) - ); - Partner partner = store.getPartner(); - System.out.println("✨partnerId✨ = "+partner.getId()); - // if (partner != null) { - // Long partnerId = partner.getId(); - // System.out.println("알림 요청이 들어갑니다."); - // notificationService.sendOrder(partnerId, 0L, dto.getTableNumber(), dto.getPartnershipContent()); - // partnershipUsageRepository.saveAll(usages); - // } else { - // throw new GeneralException(ErrorStatus.NO_SUCH_PARTNER); - // } - } + // @Transactional 환경에서는 studentsToUpdate의 변경 사항(스탬프)이 자동으로 DB에 반영됩니다. + } + // public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Member member){ + // + // Student requestStudent = studentRepository.findById(member.getId()).orElseThrow( + // () -> new GeneralException(ErrorStatus.NO_SUCH_STUDENT) // 혹은 적절한 예외 처리 + // ); + // + // List usages = new ArrayList<>(); + // + // PaperContent content = contentRepository.findById(dto.getContentId()).orElseThrow( + // () -> new GeneralException(ErrorStatus.NO_SUCH_CONTENT) + // ); + // Long paperId = content.getPaper().getId(); + // // 1) 요청한 member 본인 + // usages.add(PartnershipConverter.toPartnershipUsage(dto, requestStudent, paperId)); + // requestStudent.setStamp(); + // System.out.println("update 된 stamp : "+requestStudent.getStamp()); + // + // List userIds = Optional.ofNullable(dto.getUserIds()).orElse(Collections.emptyList()); + // // 2) dto의 userIds에 있는 다른 사용자들 + // for (Long userId : userIds) { + // if(userId != member.getId()){ + // Student student = studentRepository.getReferenceById(userId); + // usages.add(PartnershipConverter.toPartnershipUsage(dto, student, paperId)); + // student.setStamp(); + // } + // + // } + // partnershipUsageRepository.saveAll(usages); + // + // // Store store = storeRepository.findById(dto.getStoreId()).orElseThrow( + // // () -> new GeneralException(ErrorStatus.NO_SUCH_STORE) + // // ); + // // Partner partner = store.getPartner(); + // // if (partner != null) { + // // Long partnerId = partner.getId(); + // // System.out.println("알림 요청이 들어갑니다."); + // // notificationService.sendOrder(partnerId, 0L, dto.getTableNumber(), dto.getPartnershipContent()); + // // + // // } else { + // // throw new GeneralException(ErrorStatus.NO_SUCH_PARTNER); + // // } + // }