From ade4bf9e49f3c03782db9ca15ae0bb1063f1704f Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Tue, 9 Sep 2025 16:19:52 +0900 Subject: [PATCH 1/3] =?UTF-8?q?[MOD/#14]=20=20-=20=EC=BB=A8=ED=8A=B8?= =?UTF-8?q?=EB=A1=A4=EB=9F=AC=20=EB=B2=84=EC=A0=80=EB=8B=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SuggestionController.java | 21 ++++++++++++-- .../converter/SuggestionConverter.java | 16 +++++++---- .../suggestion/dto/SuggestionResponseDTO.java | 22 +++++++++++---- .../suggestion/service/SuggestionService.java | 5 +--- .../service/SuggestionServiceImpl.java | 28 +++++++++++++------ 5 files changed, 65 insertions(+), 27 deletions(-) diff --git a/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java b/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java index 7fd5b206..f711ab59 100644 --- a/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java +++ b/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java @@ -7,12 +7,14 @@ import com.assu.server.global.apiPayload.code.status.SuccessStatus; import com.assu.server.global.util.PrincipalDetails; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.util.List; +@Tag(name = "Suggestion", description = "제휴 건의 API") @RestController @RequiredArgsConstructor // 파라미터가 있어야만 하는 생성자 @RequestMapping("/suggestion") // suggestion 아래에서 시작 @@ -20,11 +22,12 @@ public class SuggestionController { private final SuggestionService suggestionService; + + @PostMapping @Operation( summary = "제휴 건의 API", - description = "건의대상, 제휴 희망 가게, 희망 혜택을 입력하세요." + description = "[v1.0 (2025-09-03)](https://www.notion.so/_-2241197c19ed81e68840d565af59b534) 관리자에게 제휴를 건의합니다.\n" ) - @PostMapping public BaseResponse writeSuggestion( @RequestBody SuggestionRequestDTO.WriteSuggestionRequestDTO suggestionRequestDTO, @AuthenticationPrincipal PrincipalDetails pd @@ -33,11 +36,23 @@ public BaseResponse writeSugge return BaseResponse.onSuccess(SuccessStatus._OK, suggestionService.writeSuggestion(suggestionRequestDTO, userId)); } + @GetMapping("/admin") + @Operation( + summary = "제휴 건의대상 조회 API", + description = "[v1.0 (2025-09-03)](https://www.notion.so/_-2241197c19ed81e68840d565af59b534) 현재 로그인한 학생(User)이 제휴를 건의할 수 있는 학생회(Admin)을 조회합니다.\n" + ) + public BaseResponse getSuggestionAdmins( + @AuthenticationPrincipal PrincipalDetails pd + ) { + Long userId = pd.getMember().getId(); + return BaseResponse.onSuccess(SuccessStatus._OK, suggestionService.getSuggestionAdmins(userId)); + } + + @GetMapping("/list") @Operation( summary = "제휴 건의 조회 API", description = "모든 제휴 건의를 조회합니다." ) - @GetMapping("/list") public BaseResponse> getSuggestions( @AuthenticationPrincipal PrincipalDetails pd ) { diff --git a/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java b/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java index 381f4df1..37575311 100644 --- a/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java +++ b/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java @@ -1,7 +1,6 @@ package com.assu.server.domain.suggestion.converter; import com.assu.server.domain.admin.entity.Admin; -import com.assu.server.domain.store.entity.Store; import com.assu.server.domain.suggestion.dto.SuggestionRequestDTO; import com.assu.server.domain.suggestion.dto.SuggestionResponseDTO; import com.assu.server.domain.suggestion.entity.Suggestion; @@ -15,10 +14,9 @@ public class SuggestionConverter { public static SuggestionResponseDTO.WriteSuggestionResponseDTO writeSuggestionResultDTO(Suggestion suggestion){ return SuggestionResponseDTO.WriteSuggestionResponseDTO.builder() .suggestionId(suggestion.getId()) - .memberId(suggestion.getStudent().getId()) - .studentNumber(suggestion.getStudent().getStudentNumber()) - .suggestionSubjectId(suggestion.getAdmin().getId()) - .suggestionStore(suggestion.getStoreName()) + .userId(suggestion.getStudent().getId()) + .adminId(suggestion.getAdmin().getId()) + .storeName(suggestion.getStoreName()) .suggestionBenefit(suggestion.getContent()) .build(); } @@ -38,8 +36,8 @@ public static SuggestionResponseDTO.GetSuggestionResponseDTO GetSuggestionResult return SuggestionResponseDTO.GetSuggestionResponseDTO.builder() .suggestionId(s.getId()) .createdAt(s.getCreatedAt()) + .storeName(s.getStoreName()) .content(s.getContent()) - .studentNumber(student.getStudentNumber()) .enrollmentStatus(student.getEnrollmentStatus()) .studentMajor(student.getMajor()) .build(); @@ -50,4 +48,10 @@ public static List toGetSuggesti .map(SuggestionConverter::GetSuggestionResultDTO) .collect(Collectors.toList()); } + + public static SuggestionResponseDTO.GetSuggestionAdminsDTO GetSuggestionAdminsResultDTO(Student student) { + return SuggestionResponseDTO.GetSuggestionAdminsDTO.builder() + .adminId() + .build() + } } diff --git a/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionResponseDTO.java b/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionResponseDTO.java index 51de446f..5a4772fa 100644 --- a/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionResponseDTO.java +++ b/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionResponseDTO.java @@ -1,6 +1,5 @@ package com.assu.server.domain.suggestion.dto; - import com.assu.server.domain.admin.entity.Admin; import com.assu.server.domain.user.entity.enums.EnrollmentStatus; import com.assu.server.domain.user.entity.enums.Major; import lombok.AllArgsConstructor; @@ -18,10 +17,9 @@ public class SuggestionResponseDTO { @Builder public static class WriteSuggestionResponseDTO { private Long suggestionId; // 제안 번호 - private Long memberId; // 제안인 아이디 - private Long studentNumber; // 제안인 학번 - private Long suggestionSubjectId; // 건의 대상 아이디 - private String suggestionStore; // 희망 가게 이름 + private Long userId; // 제안인 아이디 + private Long adminId; // 건의 대상 아이디 + private String storeName; // 희망 가게 이름 private String suggestionBenefit; // 희망 혜택 } @@ -32,9 +30,23 @@ public static class WriteSuggestionResponseDTO { public static class GetSuggestionResponseDTO { private Long suggestionId; private LocalDateTime createdAt; + private String storeName; private String content; private Major studentMajor; private Long studentNumber; private EnrollmentStatus enrollmentStatus; } + + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class GetSuggestionAdminsDTO { + private Long adminId; + private String adminName; + private Long departId; + private String departName; + private Long majorId; + private String majorName; + } } diff --git a/src/main/java/com/assu/server/domain/suggestion/service/SuggestionService.java b/src/main/java/com/assu/server/domain/suggestion/service/SuggestionService.java index 716ccd37..d5b9365b 100644 --- a/src/main/java/com/assu/server/domain/suggestion/service/SuggestionService.java +++ b/src/main/java/com/assu/server/domain/suggestion/service/SuggestionService.java @@ -1,12 +1,8 @@ package com.assu.server.domain.suggestion.service; -import com.assu.server.domain.partnership.dto.PartnershipRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipResponseDTO; import com.assu.server.domain.suggestion.dto.SuggestionRequestDTO; import com.assu.server.domain.suggestion.dto.SuggestionResponseDTO; -import com.assu.server.domain.suggestion.entity.Suggestion; import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; @@ -19,4 +15,5 @@ SuggestionResponseDTO.WriteSuggestionResponseDTO writeSuggestion( List getSuggestions(Long adminId); + SuggestionResponseDTO.GetSuggestionAdminsDTO getSuggestionAdmins(Long userId); } diff --git a/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java b/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java index 1508dc5a..2a345ff2 100644 --- a/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java +++ b/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java @@ -2,14 +2,6 @@ import com.assu.server.domain.admin.entity.Admin; import com.assu.server.domain.admin.repository.AdminRepository; -import com.assu.server.domain.partnership.converter.PartnershipConverter; -import com.assu.server.domain.partnership.dto.PartnershipResponseDTO; -import com.assu.server.domain.partnership.entity.Goods; -import com.assu.server.domain.partnership.entity.Paper; -import com.assu.server.domain.partnership.entity.PaperContent; -import com.assu.server.domain.partnership.repository.PaperContentRepository; -import com.assu.server.domain.partnership.repository.PaperRepository; -import com.assu.server.domain.store.entity.Store; import com.assu.server.domain.suggestion.converter.SuggestionConverter; import com.assu.server.domain.suggestion.dto.SuggestionRequestDTO; import com.assu.server.domain.suggestion.dto.SuggestionResponseDTO; @@ -22,7 +14,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.Collections; import java.util.List; @Service @@ -55,4 +46,23 @@ public List getSuggestions(Long return SuggestionConverter.toGetSuggestionDTOList(list); } + + @Override + public SuggestionResponseDTO.GetSuggestionAdminsDTO getSuggestionAdmins(Long userId) { + + Student student = studentRepository.findById(userId) + .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_STUDENT)); + + List adminList = adminRepository.findMatchingAdmins( + student.getUniversity().toString(), + student.getDepartment().toString(), + student.getMajor() + ); + + Admin universityAdmin = null; + Admin departmentAdmin = null; + Admin majorAdmin = null; + + return null; + } } From 18f8ac9a8a681ba44ccd1b2379e7abbb65fc2564 Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Sun, 14 Sep 2025 20:13:43 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[MOD/#24]=20=20-=20=EC=A0=9C=ED=9C=B4=20API?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/PartnershipController.java | 77 ++++++++-- .../converter/PartnershipConverter.java | 77 ++++++---- .../dto/PartnershipRequestDTO.java | 8 +- .../dto/PartnershipResponseDTO.java | 43 ++++++ .../domain/partnership/entity/Paper.java | 4 + .../repository/GoodsRepository.java | 9 ++ .../repository/PaperRepository.java | 7 + .../service/PartnershipService.java | 22 ++- .../service/PartnershipServiceImpl.java | 143 +++++++++++++++--- .../controller/SuggestionController.java | 6 +- .../converter/SuggestionConverter.java | 15 +- .../service/SuggestionServiceImpl.java | 23 ++- .../server/global/config/SecurityConfig.java | 3 +- 13 files changed, 361 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/assu/server/domain/partnership/controller/PartnershipController.java b/src/main/java/com/assu/server/domain/partnership/controller/PartnershipController.java index ff376346..d6e628fd 100644 --- a/src/main/java/com/assu/server/domain/partnership/controller/PartnershipController.java +++ b/src/main/java/com/assu/server/domain/partnership/controller/PartnershipController.java @@ -46,18 +46,16 @@ public ResponseEntity> finalPa return ResponseEntity.ok(BaseResponse.onSuccessWithoutData(SuccessStatus.USER_PAPER_REQUEST_SUCCESS)); } - + @PatchMapping("/proposal") @Operation( - summary = "제휴 제안서 작성 API", + summary = "제휴 제안서 내용 수정 API", description = "제공 서비스 종류(SERVICE, DISCOUNT), 서비스 제공 기준(PRICE, HEADCOUNT), 서비스 제공 항목, 카테고리, 할인율을 상황에 맞게 작성해주세요." ) - @PostMapping("/proposal") - public BaseResponse writePartnership( + public BaseResponse updatePartnership( @RequestBody PartnershipRequestDTO.WritePartnershipRequestDTO request, @AuthenticationPrincipal PrincipalDetails pd ){ - Long memberId = pd.getMember().getId(); - return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.writePartnershipAsPartner(request, memberId)); + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.updatePartnership(request, pd.getId())); } @Operation( @@ -76,8 +74,7 @@ public BaseResponse createM MultipartFile contractImage, @AuthenticationPrincipal PrincipalDetails pd ) { - Long memberId = pd.getMember().getId(); - return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.createManualPartnership(request, memberId, contractImage)); + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.createManualPartnership(request, pd.getId(), contractImage)); } @Operation( @@ -89,8 +86,7 @@ public BaseResponse> li @RequestParam(name = "all", defaultValue = "false") boolean all, @AuthenticationPrincipal PrincipalDetails pd ) { - Long memberId = pd.getMember().getId(); - return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForAdmin(all, memberId)); + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForAdmin(all, pd.getId())); } @Operation( @@ -102,8 +98,7 @@ public BaseResponse> li @RequestParam(name = "all", defaultValue = "false") boolean all, @AuthenticationPrincipal PrincipalDetails pd ) { - Long memberId = pd.getMember().getId(); - return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForPartner(all, memberId)); + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForPartner(all, pd.getId())); } @Operation( @@ -129,4 +124,62 @@ public BaseResponse updatePartnershipS return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.updatePartnershipStatus(partnershipId, request)); } + @PostMapping("/proposal/draft") + @Operation( + summary = "제휴 제안서 초안 생성 API", + description = "현재 로그인한 관리자(Admin)가 내용이 비어있는 제휴 제안서를 초안 상태로 생성합니다." + ) + public BaseResponse createDraftPartnership( + @RequestBody PartnershipRequestDTO.CreateDraftRequestDTO request, + @AuthenticationPrincipal PrincipalDetails pd + ) { + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.createDraftPartnership(request, pd.getId())); + } + + @DeleteMapping("/proposal/delete/{paperId}") + @Operation( + summary = "제휴 제안서 삭제 API", + description = "특정 제휴 제안서(paperId)와 관련된 모든 데이터를 삭제합니다." + ) + public BaseResponse deletePartnership( + @PathVariable Long paperId + ) { + partnershipService.deletePartnership(paperId); + return BaseResponse.onSuccess(SuccessStatus._OK, null); + } + + @GetMapping("/suspended") + @Operation( + summary = "대기 중인 제휴 계약서 조회 API", + description = "현재 로그인한 관리자(Admin)가 대기 중인 제휴 계약서를 모두 조회하여 리스트로 반환합니다." + ) + public BaseResponse> suspendPartnership( + @AuthenticationPrincipal PrincipalDetails pd + ) { + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.getSuspendedPapers(pd.getId())); + } + + @GetMapping("/check/admin") + @Operation( + summary = "관리자 채팅방 내 제휴 확인 API", + description = "현재 로그인한 관리자(Admin)가 파라미터로 받은 partnerId를 가진 상대 제휴업체(Partner)와 맺고 있는 제휴를 조회합니다. 비활성화되지 않은 가장 최근 제휴 1건을 조회합니다." + ) + public BaseResponse checkAdminPartnership( + @RequestParam("partnerId") Long partnerId, + @AuthenticationPrincipal PrincipalDetails pd + ) { + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.checkPartnershipWithPartner(pd.getId(), partnerId)); + } + + @GetMapping("/check/partner") + @Operation( + summary = "제휴업체 채팅방 내 제휴 확인 API", + description = "현재 로그인한 제휴업체(Partner)가 파라미터로 받은 AdminId를 가진 상대 관리자(Admin)과 맺고 있는 제휴를 조회합니다. 비활성화되지 않은 가장 최근 제휴 1건을 조회합니다." + ) + public BaseResponse checkPartnerPartnership( + @RequestParam("adminId") Long adminId, + @AuthenticationPrincipal PrincipalDetails pd + ) { + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.checkPartnershipWithAdmin(pd.getId(), adminId)); + } } 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 c8b8fb14..09679ac2 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 @@ -53,6 +53,18 @@ public static Paper toPaperEntity( .build(); } + public static Paper toDraftPaperEntity(Admin admin, Partner partner, Store store) { + return Paper.builder() + .admin(admin) + .partner(partner) + .store(store) + .partnershipPeriodStart(null) + .partnershipPeriodEnd(null) + .isActivated(ActivationStatus.SUSPEND) + .contractImageKey(null) + .build(); + } + public static List toPaperContents( PartnershipRequestDTO.WritePartnershipRequestDTO partnershipRequestDTO, Paper paper @@ -60,20 +72,17 @@ public static List toPaperContents( if (partnershipRequestDTO.getOptions() == null || partnershipRequestDTO.getOptions().isEmpty()) { return Collections.emptyList(); } - List contents = new ArrayList<>(partnershipRequestDTO.getOptions().size()); - for (var o : partnershipRequestDTO.getOptions()) { - PaperContent content = PaperContent.builder() - .paper(paper) - .criterionType(o.getCriterionType()) - .optionType(o.getOptionType()) - .people(o.getPeople()) - .cost(o.getCost()) - .category(o.getCategory()) - .discount(o.getDiscountRate()) - .build(); - contents.add(content); - } - return contents; + return partnershipRequestDTO.getOptions().stream() + .map(optionDto -> PaperContent.builder() + .paper(paper) // 어떤 Paper에 속하는지 연결 + .optionType(optionDto.getOptionType()) + .criterionType(optionDto.getCriterionType()) + .people(optionDto.getPeople()) + .cost(optionDto.getCost()) + .category(optionDto.getCategory()) + .discount(optionDto.getDiscountRate()) // DTO의 discountRate를 Entity의 discount에 매핑 + .build()) + .toList(); } @@ -83,22 +92,20 @@ public static List> toGoodsBatches( PartnershipRequestDTO.WritePartnershipRequestDTO partnershipRequestDTO ) { if (partnershipRequestDTO == null || partnershipRequestDTO.getOptions().isEmpty()) { - return List.of(); - } - List> batches = new ArrayList<>(partnershipRequestDTO.getOptions().size()); - for (var o : partnershipRequestDTO.getOptions()) { - if (o.getGoods() == null || o.getGoods().isEmpty()) { - batches.add(List.of()); - continue; - } - List goodsList = o.getGoods().stream() - .map(g -> Goods.builder() - .belonging(g.getGoodsName()) - .build()) - .collect(Collectors.toList()); - batches.add(goodsList); + return Collections.emptyList(); } - return batches; + return partnershipRequestDTO.getOptions().stream() + .map(optionDto -> { + if (optionDto.getGoods() == null || optionDto.getGoods().isEmpty()) { + return Collections.emptyList(); + } + return optionDto.getGoods().stream() + .map(goodsDto -> Goods.builder() + .belonging(goodsDto.getGoodsName()) // DTO의 goodsName을 엔티티의 belonging에 매핑 + .build()) + .toList(); + }) + .toList(); } @@ -270,6 +277,7 @@ public static PartnershipResponseDTO.WritePartnershipResponseDTO writePartnershi .adminId(paper.getAdmin() != null ? paper.getAdmin().getId() : null) .partnerId(paper.getPartner()!= null ? paper.getPartner().getId() : null) // 수동등록이면 null .storeId(paper.getStore() != null ? paper.getStore().getId() : null) + .isActivated(paper.getIsActivated()) .options(optionDTOS) .build(); } @@ -283,4 +291,15 @@ public static List goodsResu .build()) .toList(); } + + public static PartnershipResponseDTO.CreateDraftResponseDTO toCreateDraftResponseDTO(Paper paper) { + return PartnershipResponseDTO.CreateDraftResponseDTO.builder() + .paperId(paper.getId()) + .build(); + } + + public static void updatePaperFromDto(Paper paper, PartnershipRequestDTO.WritePartnershipRequestDTO dto) { + paper.setPartnershipPeriodStart(dto.getPartnershipPeriodStart()); + paper.setPartnershipPeriodEnd(dto.getPartnershipPeriodEnd()); + } } diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipRequestDTO.java index 1d9344cb..924e84b1 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipRequestDTO.java @@ -21,9 +21,10 @@ public static class finalRequest{ Long discount; List userIds; } + @Getter public static class WritePartnershipRequestDTO { - private Long adminId; // 제안 학생회 아이디 + private Long paperId; // 제휴 제안서 아이디 private LocalDate partnershipPeriodStart; private LocalDate partnershipPeriodEnd; private List options; // 동적으로 받는 제안 항목 @@ -64,4 +65,9 @@ public static class ManualPartnershipRequestDTO { private LocalDate partnershipPeriodEnd; private List options; } + + @Getter + public static class CreateDraftRequestDTO { + private Long partnerId; // 제안서를 보낼 제휴업체 ID + } } diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipResponseDTO.java index 60ad89bf..4bf7d2b1 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipResponseDTO.java @@ -1,6 +1,7 @@ package com.assu.server.domain.partnership.dto; +import com.assu.server.domain.common.enums.ActivationStatus; import com.assu.server.domain.partnership.entity.enums.CriterionType; import com.assu.server.domain.partnership.entity.enums.OptionType; import lombok.*; @@ -12,6 +13,7 @@ public class PartnershipResponseDTO { @Getter + @Setter @NoArgsConstructor @AllArgsConstructor @Builder @@ -22,6 +24,7 @@ public static class WritePartnershipResponseDTO { private Long adminId; private Long partnerId; private Long storeId; + private ActivationStatus isActivated; private List options; } @@ -76,4 +79,44 @@ public static class ManualPartnershipResponseDTO { private String contractImageUrl; private WritePartnershipResponseDTO partnership; } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class CreateDraftResponseDTO { + private Long paperId; // 생성된 빈 제안서의 ID + } + + @Getter + @Builder + @NoArgsConstructor + @AllArgsConstructor + public static class SuspendedPaperDTO { + private Long paperId; + private String partnerName; + private LocalDateTime createdAt; + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class AdminPartnershipWithPartnerResponseDTO { + private Long paperId; + private boolean isPartnered; // 제휴 여부 + private String status; // 제휴 상태 + } + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class PartnerPartnershipWithAdminResponseDTO { + private Long paperId; + private boolean isPartnered; // 제휴 여부 + private String status; // 제휴 상태 + } } diff --git a/src/main/java/com/assu/server/domain/partnership/entity/Paper.java b/src/main/java/com/assu/server/domain/partnership/entity/Paper.java index 3c4c284d..eea1810e 100644 --- a/src/main/java/com/assu/server/domain/partnership/entity/Paper.java +++ b/src/main/java/com/assu/server/domain/partnership/entity/Paper.java @@ -22,8 +22,12 @@ public class Paper extends BaseEntity { private Long id; + @Setter private LocalDate partnershipPeriodStart; // LocalDate vs String + + @Setter private LocalDate partnershipPeriodEnd; + @Setter @Enumerated(EnumType.STRING) private ActivationStatus isActivated; diff --git a/src/main/java/com/assu/server/domain/partnership/repository/GoodsRepository.java b/src/main/java/com/assu/server/domain/partnership/repository/GoodsRepository.java index bede0456..cf961dfe 100644 --- a/src/main/java/com/assu/server/domain/partnership/repository/GoodsRepository.java +++ b/src/main/java/com/assu/server/domain/partnership/repository/GoodsRepository.java @@ -2,6 +2,15 @@ import com.assu.server.domain.partnership.entity.Goods; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; public interface GoodsRepository extends JpaRepository { + + @Modifying + @Query("delete from Goods g where g.content.id in :contentIds") + void deleteAllByContentIds(@Param("contentIds") List contentIds); } diff --git a/src/main/java/com/assu/server/domain/partnership/repository/PaperRepository.java b/src/main/java/com/assu/server/domain/partnership/repository/PaperRepository.java index f317790b..4f9fdf3a 100644 --- a/src/main/java/com/assu/server/domain/partnership/repository/PaperRepository.java +++ b/src/main/java/com/assu/server/domain/partnership/repository/PaperRepository.java @@ -33,6 +33,13 @@ Optional findTopByAdmin_IdAndPartner_IdAndIsActivatedOrderByIdDesc( Long adminId, Long partnerId, ActivationStatus isActivated ); + boolean existsByAdmin_IdAndPartner_IdAndIsActivatedIn(Long adminId, Long partnerId, List statuses); + Optional findTopByAdmin_IdAndPartner_IdAndIsActivatedInOrderByIdDesc(Long adminId, Long partnerId, List statuses); + + // Admin 기준 (SUSPEND) + @Query("select p from Paper p join fetch p.partner where p.isActivated = :status order by p.createdAt desc") + List findAllByIsActivatedWithPartner(@Param("status") ActivationStatus status); + // Partner 기준 (ACTIVE) List findByPartner_IdAndIsActivated(Long partnerId, ActivationStatus status, Sort sort); Page findByPartner_IdAndIsActivated(Long partnerId, ActivationStatus status, Pageable pageable); diff --git a/src/main/java/com/assu/server/domain/partnership/service/PartnershipService.java b/src/main/java/com/assu/server/domain/partnership/service/PartnershipService.java index fcc135af..2e58750e 100644 --- a/src/main/java/com/assu/server/domain/partnership/service/PartnershipService.java +++ b/src/main/java/com/assu/server/domain/partnership/service/PartnershipService.java @@ -13,25 +13,39 @@ public interface PartnershipService { - PartnershipResponseDTO.WritePartnershipResponseDTO writePartnershipAsPartner( - @RequestBody PartnershipRequestDTO.WritePartnershipRequestDTO request, + // 제휴 제안서 수정 + PartnershipResponseDTO.WritePartnershipResponseDTO updatePartnership( + PartnershipRequestDTO.WritePartnershipRequestDTO request, Long memberId ); void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Member member); - + + // 제휴업체/관리자 맺은 제휴 리스트 List listPartnershipsForAdmin(boolean all, Long partnerId); List listPartnershipsForPartner(boolean all, Long adminId); - + // 제휴 제안서 조회 PartnershipResponseDTO.WritePartnershipResponseDTO getPartnership(Long partnershipId); + List getSuspendedPapers(Long adminId); + // 제휴 상태 업데이트 PartnershipResponseDTO.UpdateResponseDTO updatePartnershipStatus(Long partnershipId, PartnershipRequestDTO.UpdateRequestDTO request); + // 제휴 수동 등록 PartnershipResponseDTO.ManualPartnershipResponseDTO createManualPartnership( PartnershipRequestDTO.ManualPartnershipRequestDTO request, Long adminId, MultipartFile contractImage ); + // 빈 제휴제안서 만들기 + PartnershipResponseDTO.CreateDraftResponseDTO createDraftPartnership(PartnershipRequestDTO.CreateDraftRequestDTO request, Long adminId); + + // 제휴 계약서 삭제 + void deletePartnership(Long paperId); + + // 채팅방 내 제휴 계약서 상태 확인 + PartnershipResponseDTO.AdminPartnershipWithPartnerResponseDTO checkPartnershipWithPartner(Long adminId, Long partnerId); // 관리자가 조회 + PartnershipResponseDTO.PartnerPartnershipWithAdminResponseDTO checkPartnershipWithAdmin(Long partnerId, Long adminId); // 제휴업체가 조회 } 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 8a18d2fa..9d91a82c 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 @@ -88,7 +88,8 @@ public void recordPartnershipUsage(PartnershipRequestDTO.finalRequest dto, Membe private final AmazonS3Manager amazonS3Manager; @Override - public PartnershipResponseDTO.WritePartnershipResponseDTO writePartnershipAsPartner( + @Transactional + public PartnershipResponseDTO.WritePartnershipResponseDTO updatePartnership( PartnershipRequestDTO.WritePartnershipRequestDTO request, Long memberId ) { @@ -96,37 +97,40 @@ public PartnershipResponseDTO.WritePartnershipResponseDTO writePartnershipAsPart throw new DatabaseException(ErrorStatus._BAD_REQUEST); } + Paper paper = paperRepository.findById(request.getPaperId()) + .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_PAPER)); + Partner partner = partnerRepository.findById(memberId) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_PARTNER)); - Admin admin = adminRepository.findById(request.getAdminId()) + Admin admin = adminRepository.findById(paper.getAdmin().getId()) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_ADMIN)); Store store = storeRepository.findByPartner(partner) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_STORE)); - return writePartnership(request, admin, partner, store); - } - - public PartnershipResponseDTO.WritePartnershipResponseDTO writePartnership(PartnershipRequestDTO.WritePartnershipRequestDTO request, Admin admin, Partner partner, Store store) { + PartnershipConverter.updatePaperFromDto(paper, request); - Paper paper = PartnershipConverter.toPaperEntity(request, admin, partner, store); - paper = paperRepository.save(paper); + List existingContents = paperContentRepository.findByPaperId(request.getPaperId()); + if (!existingContents.isEmpty()) { + List contentIds = existingContents.stream().map(PaperContent::getId).toList(); + goodsRepository.deleteAllByContentIds(contentIds); + paperContentRepository.deleteAll(existingContents); + } - List contents = PartnershipConverter.toPaperContents(request, paper); - contents = contents.isEmpty() ? contents : paperContentRepository.saveAll(contents); + List newContents = PartnershipConverter.toPaperContents(request, paper); + newContents = newContents.isEmpty() ? newContents : paperContentRepository.saveAll(newContents); List> requestGoodsBatches = PartnershipConverter.toGoodsBatches(request); List> attachedGoodsBatches = new ArrayList<>(); List toPersist = new ArrayList<>(); - for(int i = 0;i < contents.size();i++){ - PaperContent content = contents.get(i); + for (int i = 0; i < newContents.size(); i++) { + PaperContent content = newContents.get(i); List batch = (requestGoodsBatches.size() > i) ? requestGoodsBatches.get(i) : Collections.emptyList(); - - List attached = new ArrayList<>(batch.size()); - for(Goods g : batch){ + List attached = new ArrayList<>(); + for (Goods g : batch) { Goods entity = Goods.builder() .content(content) .belonging(g.getBelonging()) @@ -136,11 +140,11 @@ public PartnershipResponseDTO.WritePartnershipResponseDTO writePartnership(Partn } attachedGoodsBatches.add(attached); } - - if(!toPersist.isEmpty()){ + if (!toPersist.isEmpty()) { goodsRepository.saveAll(toPersist); } - return PartnershipConverter.writePartnershipResultDTO(paper, contents, attachedGoodsBatches); + + return PartnershipConverter.writePartnershipResultDTO(paper, newContents, attachedGoodsBatches); } @Override @@ -172,6 +176,7 @@ public List listPartnerships } @Override + @Transactional public PartnershipResponseDTO.WritePartnershipResponseDTO getPartnership(Long partnershipId) { Paper paper = paperRepository.findById(partnershipId) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_PAPER)); @@ -185,6 +190,20 @@ public PartnershipResponseDTO.WritePartnershipResponseDTO getPartnership(Long pa return PartnershipConverter.writePartnershipResultDTO(paper, contents, goodsBatches); } + @Override + @Transactional + public List getSuspendedPapers(Long adminId) { + List suspendedPapers = paperRepository.findAllByIsActivatedWithPartner(ActivationStatus.SUSPEND); + + return suspendedPapers.stream() + .map(paper -> PartnershipResponseDTO.SuspendedPaperDTO.builder() + .paperId(paper.getId()) + .partnerName(paper.getPartner().getName()) + .createdAt(paper.getCreatedAt()) + .build()) + .toList(); + } + @Override @Transactional public PartnershipResponseDTO.UpdateResponseDTO updatePartnershipStatus(Long partnershipId, PartnershipRequestDTO.UpdateRequestDTO request) { @@ -300,6 +319,94 @@ public PartnershipResponseDTO.ManualPartnershipResponseDTO createManualPartnersh .build(); } + @Override + @Transactional + public PartnershipResponseDTO.CreateDraftResponseDTO createDraftPartnership(PartnershipRequestDTO.CreateDraftRequestDTO request, Long adminId) { + Admin admin = adminRepository.findById(adminId) + .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_ADMIN)); + Partner partner = partnerRepository.findById(request.getPartnerId()) + .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_PARTNER)); + Store store = storeRepository.findByPartner(partner) + .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_STORE)); + + Paper draftPaper = PartnershipConverter.toDraftPaperEntity(admin, partner, store); + paperRepository.save(draftPaper); + + return PartnershipConverter.toCreateDraftResponseDTO(draftPaper); + } + + @Override + @Transactional + public void deletePartnership(Long paperId) { + Paper paper = paperRepository.findById(paperId) + .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_PAPER)); + + List contentsToDelete = paperContentRepository.findByPaperId(paperId); + + if (contentsToDelete != null && !contentsToDelete.isEmpty()) { + List contentIds = contentsToDelete.stream().map(PaperContent::getId).toList(); + goodsRepository.deleteAllByContentIds(contentIds); + + paperContentRepository.deleteAll(contentsToDelete); + } + + paperRepository.delete(paper); + } + + @Override + @Transactional + public PartnershipResponseDTO.AdminPartnershipWithPartnerResponseDTO checkPartnershipWithPartner(Long adminId, Long partnerId) { + List targetStatuses = List.of(ActivationStatus.ACTIVE, ActivationStatus.SUSPEND); + boolean isPartnered = paperRepository.existsByAdmin_IdAndPartner_IdAndIsActivatedIn(adminId, partnerId, targetStatuses); + + Long paperId = null; + String status = "NONE"; + + if (isPartnered) { + Optional latestActiveOrSuspendPaper = paperRepository + .findTopByAdmin_IdAndPartner_IdAndIsActivatedInOrderByIdDesc(adminId, partnerId, targetStatuses); + + if (latestActiveOrSuspendPaper.isPresent()) { + Paper paper = latestActiveOrSuspendPaper.get(); + paperId = paper.getId(); + status = paper.getIsActivated().name(); + } + } + + return PartnershipResponseDTO.AdminPartnershipWithPartnerResponseDTO.builder() + .paperId(paperId) + .isPartnered(isPartnered) + .status(status) + .build(); + } + + @Override + @Transactional + public PartnershipResponseDTO.PartnerPartnershipWithAdminResponseDTO checkPartnershipWithAdmin(Long partnerId, Long adminId) { + List targetStatuses = List.of(ActivationStatus.ACTIVE, ActivationStatus.SUSPEND); + boolean isPartnered = paperRepository.existsByAdmin_IdAndPartner_IdAndIsActivatedIn(adminId, partnerId, targetStatuses); + + Long paperId = null; + String status = "NONE"; + + if (isPartnered) { + Optional latestActiveOrSuspendPaper = paperRepository + .findTopByAdmin_IdAndPartner_IdAndIsActivatedInOrderByIdDesc(adminId, partnerId, targetStatuses); + + if (latestActiveOrSuspendPaper.isPresent()) { + Paper paper = latestActiveOrSuspendPaper.get(); + paperId = paper.getId(); + status = paper.getIsActivated().name(); + } + } + + return PartnershipResponseDTO.PartnerPartnershipWithAdminResponseDTO.builder() + .paperId(paperId) + .isPartnered(isPartnered) + .status(status) + .build(); + } + private List buildPartnershipDTOs(List papers) { if (papers == null || papers.isEmpty()) return List.of(); diff --git a/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java b/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java index 83b3d293..1a973246 100644 --- a/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java +++ b/src/main/java/com/assu/server/domain/suggestion/controller/SuggestionController.java @@ -26,7 +26,7 @@ public class SuggestionController { @PostMapping @Operation( summary = "제휴 건의 API", - description = "[v1.0 (2025-09-03)](https://www.notion.so/_-2241197c19ed81e68840d565af59b534) 관리자에게 제휴를 건의합니다.\n" + description = "[v1.0 (2025-09-03)](https://www.notion.so/_-2241197c19ed81e68840d565af59b534) 현재 로그인한 학생(User)이 관리자에게 제휴를 건의합니다.\n" ) public BaseResponse writeSuggestion( @RequestBody SuggestionRequestDTO.WriteSuggestionRequestDTO suggestionRequestDTO, @@ -38,7 +38,7 @@ public BaseResponse writeSugge @GetMapping("/admin") @Operation( summary = "제휴 건의대상 조회 API", - description = "[v1.0 (2025-09-03)](https://www.notion.so/_-2241197c19ed81e68840d565af59b534) 현재 로그인한 학생(User)이 제휴를 건의할 수 있는 학생회(Admin)을 조회합니다.\n" + description = "[v1.0 (2025-09-03)](https://www.notion.so/_-2241197c19ed81e68840d565af59b534) 현재 로그인한 학생(User)이 제휴를 건의할 수 있는 학생회(Admin)를 조회합니다.\n" ) public BaseResponse getSuggestionAdmins( @AuthenticationPrincipal PrincipalDetails pd @@ -49,7 +49,7 @@ public BaseResponse getSuggestionA @GetMapping("/list") @Operation( summary = "제휴 건의 조회 API", - description = "모든 제휴 건의를 조회합니다." + description = "[v1.0 (2025-09-03)](https://www.notion.so/_-24c1197c19ed8083bf8be4b6a6a43f18) 현재 로그인한 학생회(Admin)가 받은 모든 제휴 건의를 조회합니다." ) public BaseResponse> getSuggestions( @AuthenticationPrincipal PrincipalDetails pd diff --git a/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java b/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java index b33e44a7..f5ca5912 100644 --- a/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java +++ b/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java @@ -53,9 +53,14 @@ public static List toGetSuggesti .collect(Collectors.toList()); } -// public static SuggestionResponseDTO.GetSuggestionAdminsDTO GetSuggestionAdminsResultDTO(Student student) { -// return SuggestionResponseDTO.GetSuggestionAdminsDTO.builder() -// .adminId() -// .build() -// } + public static SuggestionResponseDTO.GetSuggestionAdminsDTO toGetSuggestionAdmins(Admin universityAdmin, Admin departmentAdmin, Admin majorAdmin) { + return SuggestionResponseDTO.GetSuggestionAdminsDTO.builder() + .adminId(universityAdmin != null ? universityAdmin.getId() : null) + .adminName(universityAdmin != null ? universityAdmin.getName() : null) + .departId(departmentAdmin != null ? departmentAdmin.getId() : null) + .departName(departmentAdmin != null ? departmentAdmin.getName() : null) + .majorId(majorAdmin != null ? majorAdmin.getId() : null) + .majorName(majorAdmin != null ? majorAdmin.getName() : null) + .build(); + } } diff --git a/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java b/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java index 2a345ff2..2995ff62 100644 --- a/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java +++ b/src/main/java/com/assu/server/domain/suggestion/service/SuggestionServiceImpl.java @@ -2,6 +2,7 @@ import com.assu.server.domain.admin.entity.Admin; import com.assu.server.domain.admin.repository.AdminRepository; +import com.assu.server.domain.notification.service.NotificationCommandService; import com.assu.server.domain.suggestion.converter.SuggestionConverter; import com.assu.server.domain.suggestion.dto.SuggestionRequestDTO; import com.assu.server.domain.suggestion.dto.SuggestionResponseDTO; @@ -11,6 +12,7 @@ import com.assu.server.domain.user.repository.StudentRepository; import com.assu.server.global.apiPayload.code.status.ErrorStatus; import com.assu.server.global.exception.DatabaseException; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -23,8 +25,10 @@ public class SuggestionServiceImpl implements SuggestionService { private final SuggestionRepository suggestionRepository; private final AdminRepository adminRepository; private final StudentRepository studentRepository; + private final NotificationCommandService notificationCommandService; @Override + @Transactional public SuggestionResponseDTO.WriteSuggestionResponseDTO writeSuggestion(SuggestionRequestDTO.WriteSuggestionRequestDTO request, Long userId) { Admin admin = adminRepository.findById(request.getAdminId()) @@ -35,6 +39,7 @@ public SuggestionResponseDTO.WriteSuggestionResponseDTO writeSuggestion(Suggesti Suggestion suggestion = SuggestionConverter.toSuggestionEntity(request, admin, student); suggestionRepository.save(suggestion); + notificationCommandService.sendPartnerSuggestion(suggestion.getAdmin().getId(), suggestion.getId()); return SuggestionConverter.writeSuggestionResultDTO(suggestion); } @@ -54,8 +59,8 @@ public SuggestionResponseDTO.GetSuggestionAdminsDTO getSuggestionAdmins(Long use .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_STUDENT)); List adminList = adminRepository.findMatchingAdmins( - student.getUniversity().toString(), - student.getDepartment().toString(), + student.getUniversity(), + student.getDepartment(), student.getMajor() ); @@ -63,6 +68,18 @@ public SuggestionResponseDTO.GetSuggestionAdminsDTO getSuggestionAdmins(Long use Admin departmentAdmin = null; Admin majorAdmin = null; - return null; + for (Admin admin : adminList) { + if (admin.getMajor() != null) { + majorAdmin = admin; + } + else if (admin.getDepartment() != null) { + departmentAdmin = admin; + } + else { + universityAdmin = admin; + } + } + + return SuggestionConverter.toGetSuggestionAdmins(universityAdmin, departmentAdmin, majorAdmin); } } diff --git a/src/main/java/com/assu/server/global/config/SecurityConfig.java b/src/main/java/com/assu/server/global/config/SecurityConfig.java index 62263533..ac01dc51 100644 --- a/src/main/java/com/assu/server/global/config/SecurityConfig.java +++ b/src/main/java/com/assu/server/global/config/SecurityConfig.java @@ -38,7 +38,8 @@ public SecurityFilterChain filterChain(HttpSecurity http, JwtAuthFilter jwtAuthF "/auth/admins/signup", "/auth/commons/login", "/auth/students/login", - "/auth/students/ssu-verify" + "/auth/students/ssu-verify", + "/map/place" // 주소 입력용 장소 검색 API 제외ㅕ ).permitAll() // 나머지 요청은 JwtAuthFilter가 화이트리스트/보호자원 판별 From 8ceb131ec0bbbcf4223ec21015ffc251b3234d45 Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Wed, 17 Sep 2025 02:13:25 +0900 Subject: [PATCH 3/3] =?UTF-8?q?[MOD/#24]=20=20-=20=EC=B1=84=ED=8C=85?= =?UTF-8?q?=EB=B0=A9=20=EB=82=B4=20=EC=A0=9C=ED=9C=B4=20=ED=99=95=EC=9D=B8?= =?UTF-8?q?=20(=EC=A0=9C=ED=9C=B4=EC=97=85=EC=B2=B4)=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/partnership/service/PartnershipServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 dccdc76e..b25201b9 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 @@ -413,7 +413,7 @@ public PartnershipResponseDTO.PartnerPartnershipWithAdminResponseDTO checkPartne Admin admin = adminRepository.findById(adminId) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_ADMIN)); - List targetStatuses = List.of(ActivationStatus.ACTIVE, ActivationStatus.SUSPEND); + List targetStatuses = List.of(ActivationStatus.ACTIVE, ActivationStatus.SUSPEND, ActivationStatus.BLANK); boolean isPartnered = paperRepository.existsByAdmin_IdAndPartner_IdAndIsActivatedIn(adminId, partnerId, targetStatuses); Long paperId = null;