From 66fc1e8a5c96066317e5d0925643a14f40659c2f Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Mon, 23 Feb 2026 01:19:17 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[Refactor/#233]=20-=20adminrepository=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=EB=84=A4=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20dto=EC=97=90=20schema=EC=99=80=20notnu?= =?UTF-8?q?ll=20=EC=A0=9C=EC=95=BD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/repository/AdminRepository.java | 6 ++- .../domain/map/dto/AdminMapResponseDTO.java | 35 ++++++++++++--- .../server/domain/map/dto/MapRequestDTO.java | 16 +++---- .../domain/map/dto/PartnerMapResponseDTO.java | 35 ++++++++++++--- .../domain/map/dto/PlaceSuggestionDTO.java | 21 +++++++++ .../domain/map/dto/SelectedPlacePayload.java | 12 ++++++ .../domain/map/dto/StoreMapResponseDTO.java | 43 ++++++++++++++++--- .../domain/map/service/MapServiceImpl.java | 5 ++- .../dto/AdminPartnershipCheckResponseDTO.java | 12 ++++++ .../dto/ManualPartnershipRequestDTO.java | 12 ++++++ .../dto/ManualPartnershipResponseDTO.java | 12 ++++++ .../PartnerPartnershipCheckResponseDTO.java | 12 ++++++ .../dto/PartnershipDetailResponseDTO.java | 16 +++++++ .../dto/PartnershipDraftRequestDTO.java | 2 + .../dto/PartnershipDraftResponseDTO.java | 2 + .../dto/PartnershipGoodsRequestDTO.java | 3 ++ .../dto/PartnershipGoodsResponseDTO.java | 4 ++ .../dto/PartnershipOptionRequestDTO.java | 18 ++++++++ .../dto/PartnershipOptionResponseDTO.java | 18 ++++++++ .../PartnershipStatusUpdateRequestDTO.java | 3 ++ .../PartnershipStatusUpdateResponseDTO.java | 8 ++++ .../dto/SuspendedPaperResponseDTO.java | 6 +++ .../dto/WritePartnershipRequestDTO.java | 8 ++++ .../dto/WritePartnershipResponseDTO.java | 20 +++++++++ 24 files changed, 299 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java index 21fc458d..73472f57 100644 --- a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java +++ b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java @@ -4,6 +4,7 @@ import java.util.Optional; import com.assu.server.domain.admin.entity.Admin; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -65,7 +66,7 @@ List findPartnerWithOffset(@Param("partnerId") Long partnerId, WHERE a.point IS NOT NULL AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), a.point) = true """) - List findAllWithinViewportWithMember(@Param("wkt") String wkt); + List findAllWithinViewportWithMember(@Param("wkt") String wkt, Pageable pageable); @Query(""" SELECT DISTINCT a @@ -74,6 +75,7 @@ AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), a.point) = WHERE LOWER(a.name) LIKE LOWER(CONCAT('%', :keyword, '%')) """) List searchAdminByKeywordWithMember( - @Param("keyword") String keyword + @Param("keyword") String keyword, + Pageable pageable ); } diff --git a/src/main/java/com/assu/server/domain/map/dto/AdminMapResponseDTO.java b/src/main/java/com/assu/server/domain/map/dto/AdminMapResponseDTO.java index 30ba6b8d..2d4ca8de 100644 --- a/src/main/java/com/assu/server/domain/map/dto/AdminMapResponseDTO.java +++ b/src/main/java/com/assu/server/domain/map/dto/AdminMapResponseDTO.java @@ -3,20 +3,43 @@ import com.assu.server.domain.admin.entity.Admin; import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.infra.s3.AmazonS3Manager; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; public record AdminMapResponseDTO( - Long adminId, - String name, - String address, - boolean isPartnered, + @Schema(description = "관리자 ID", example = "101") + @NotNull Long adminId, + + @Schema(description = "관리자 이름", example = "숭실대학교 총학생회") + @NotNull String name, + + @Schema(description = "관리자 주소", example = "서울특별시 동작구 상도로") + @NotNull String address, + + @Schema(description = "제휴업체와 제휴여부", example = "true") + @NotNull boolean isPartnered, + + @Schema(description = "제휴 ID", example = "101") Long partnershipId, + + @Schema(description = "제휴 시작일", example = "2024-01-01") LocalDate partnershipStartDate, + + @Schema(description = "제휴 마감일", example = "2024-12-31") LocalDate partnershipEndDate, - Double latitude, - Double longitude, + + @Schema(description = "관리자 위도", example = "57.56") + @NotNull Double latitude, + + @Schema(description = "관리자 경도", example = "37.38") + @NotNull Double longitude, + + @Schema(description = "관리자 카카오맵 Url", example = "https://www.beer.co.kr") String profileUrl, + + @Schema(description = "관리자 전화번호", example = "010-1234-5678") String phoneNumber ) { public static AdminMapResponseDTO of(Admin admin, Paper activePaper, AmazonS3Manager s3Manager) { diff --git a/src/main/java/com/assu/server/domain/map/dto/MapRequestDTO.java b/src/main/java/com/assu/server/domain/map/dto/MapRequestDTO.java index 7d71ac24..700e4667 100644 --- a/src/main/java/com/assu/server/domain/map/dto/MapRequestDTO.java +++ b/src/main/java/com/assu/server/domain/map/dto/MapRequestDTO.java @@ -4,35 +4,35 @@ import jakarta.validation.constraints.NotNull; public record MapRequestDTO( - @Schema(description = "화면 좌상단 경도") + @Schema(description = "화면 좌상단 경도", example = "126.95") @NotNull(message = "경도를 입력해주세요.") double lng1, - @Schema(description = "화면 좌상단 위도") + @Schema(description = "화면 좌상단 위도", example = "37.51") @NotNull(message = "위도를 입력해주세요.") double lat1, - @Schema(description = "화면 우상단 경도") + @Schema(description = "화면 우상단 경도", example = "126.97") @NotNull(message = "경도를 입력해주세요.") double lng2, - @Schema(description = "화면 우상단 위도") + @Schema(description = "화면 우상단 위도", example = "37.51") @NotNull(message = "위도를 입력해주세요.") double lat2, - @Schema(description = "화면 우하단 경도") + @Schema(description = "화면 우하단 경도", example = "126.97") @NotNull(message = "경도를 입력해주세요.") double lng3, - @Schema(description = "화면 우하단 위도") + @Schema(description = "화면 우하단 위도", example = "37.49") @NotNull(message = "위도를 입력해주세요.") double lat3, - @Schema(description = "화면 좌하단 경도") + @Schema(description = "화면 좌하단 경도", example = "126.95") @NotNull(message = "경도를 입력해주세요.") double lng4, - @Schema(description = "화면 좌하단 위도") + @Schema(description = "화면 좌하단 위도", example = "37.49") @NotNull(message = "위도를 입력해주세요.") double lat4 ) {} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/map/dto/PartnerMapResponseDTO.java b/src/main/java/com/assu/server/domain/map/dto/PartnerMapResponseDTO.java index f53315b6..66063d83 100644 --- a/src/main/java/com/assu/server/domain/map/dto/PartnerMapResponseDTO.java +++ b/src/main/java/com/assu/server/domain/map/dto/PartnerMapResponseDTO.java @@ -3,20 +3,43 @@ import com.assu.server.domain.partner.entity.Partner; import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.infra.s3.AmazonS3Manager; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; public record PartnerMapResponseDTO( - Long partnerId, - String name, - String address, - boolean isPartnered, + @Schema(description = "파트너 ID", example = "101") + @NotNull Long partnerId, + + @Schema(description = "제휴업체 이름", example = "역전할머니맥주 숭실대점") + @NotNull String name, + + @Schema(description = "제휴업체 주소", example = "서울특별시 동작구 상도로") + @NotNull String address, + + @Schema(description = "제휴업체와 제휴여부", example = "true") + @NotNull boolean isPartnered, + + @Schema(description = "제휴 ID", example = "101") Long partnershipId, + + @Schema(description = "제휴 시작일", example = "2024-01-01") LocalDate partnershipStartDate, + + @Schema(description = "제휴 마감일", example = "2024-12-31") LocalDate partnershipEndDate, - Double latitude, - Double longitude, + + @Schema(description = "제휴업체 위도", example = "37.50") + @NotNull Double latitude, + + @Schema(description = "제휴업체 경도", example = "126.96") + @NotNull Double longitude, + + @Schema(description = "제휴업체 프로필 Url", example = "https://www.beer.co.kr") String profileUrl, + + @Schema(description = "제휴업체 전화번호", example = "010-1234-5678") String phoneNumber ) { public static PartnerMapResponseDTO of(Partner partner, Paper activePaper, AmazonS3Manager s3Manager) { diff --git a/src/main/java/com/assu/server/domain/map/dto/PlaceSuggestionDTO.java b/src/main/java/com/assu/server/domain/map/dto/PlaceSuggestionDTO.java index 5708d907..7114d3cc 100644 --- a/src/main/java/com/assu/server/domain/map/dto/PlaceSuggestionDTO.java +++ b/src/main/java/com/assu/server/domain/map/dto/PlaceSuggestionDTO.java @@ -1,14 +1,35 @@ package com.assu.server.domain.map.dto; +import io.swagger.v3.oas.annotations.media.Schema; + public record PlaceSuggestionDTO( + @Schema(description = "장소 ID", example = "12345678") String placeId, + + @Schema(description = "장소 이름", example = "숭실대학교") String name, + + @Schema(description = "장소 카테고리", example = "대학교") String category, + + @Schema(description = "장소 지번 주소", example = "서울특별시 동작구 상도로 369") String address, + + @Schema(description = "장소 도로명 주소", example = "서울특별시 동작구 상도로 369") String roadAddress, + + @Schema(description = "장소 전화번호", example = "02-820-0114") String phone, + + @Schema(description = "카카오맵 장소 Url", example = "https://place.map.kakao.com/12345678") String placeUrl, + + @Schema(description = "장소 위도", example = "37.50") Double latitude, + + @Schema(description = "장소 경도", example = "126.96") Double longitude, + + @Schema(description = "현재 위치로부터의 거리 (m)", example = "100") Integer distance ) {} diff --git a/src/main/java/com/assu/server/domain/map/dto/SelectedPlacePayload.java b/src/main/java/com/assu/server/domain/map/dto/SelectedPlacePayload.java index 9837f544..23e786fa 100644 --- a/src/main/java/com/assu/server/domain/map/dto/SelectedPlacePayload.java +++ b/src/main/java/com/assu/server/domain/map/dto/SelectedPlacePayload.java @@ -1,5 +1,6 @@ package com.assu.server.domain.map.dto; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; @Getter @@ -8,10 +9,21 @@ @AllArgsConstructor @Builder public class SelectedPlacePayload { + @Schema(description = "장소 ID", example = "12345678") private String placeId; + + @Schema(description = "장소 이름", example = "숭실대학교") private String name; + + @Schema(description = "장소 지번 주소", example = "서울특별시 동작구 상도로 369") private String address; + + @Schema(description = "장소 도로명 주소", example = "서울특별시 동작구 상도로 369") private String roadAddress; + + @Schema(description = "장소 위도", example = "37.50") private Double latitude; + + @Schema(description = "장소 경도", example = "126.96") private Double longitude; } diff --git a/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java b/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java index 2a4dafad..8f00cb3a 100644 --- a/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java +++ b/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java @@ -2,22 +2,53 @@ import com.assu.server.domain.store.entity.Store; import com.assu.server.infra.s3.AmazonS3Manager; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; public record StoreMapResponseDTO( - Long storeId, - String name, - String address, + @Schema(description = "가게 ID", example = "201") + @NotNull Long storeId, + + @Schema(description = "가게 이름", example = "숭실마트") + @NotNull String name, + + @Schema(description = "가게 주소", example = "서울특별시 동작구 상도로") + @NotNull String address, + + @Schema(description = "가게 평점", example = "4") Integer rate, - boolean hasPartner, - Double latitude, - Double longitude, + + @Schema(description = "제휴업체인지 여부 (관련 Paper가 없으면 false)", example = "true") + @NotNull boolean hasPartner, + + @Schema(description = "가게 위도", example = "37.50") + @NotNull Double latitude, + + @Schema(description = "가게 경도", example = "126.96") + @NotNull Double longitude, + + @Schema(description = "가게 프로필 Url", example = "https://www.beer.co.kr") String profileUrl, + + @Schema(description = "가게 전화번호", example = "010-1234-5678") String phoneNumber, + + @Schema(description = "관리자1 ID", example = "101") Long adminId1, + + @Schema(description = "관리자2 ID", example = "102") Long adminId2, + + @Schema(description = "관리자1 이름", example = "숭실대학교 총학생회") String adminName1, + + @Schema(description = "관리자2 이름", example = "숭실대학교 IT대학 학생회") String adminName2, + + @Schema(description = "제휴 혜택1", example = "음료 10% 할인") String benefit1, + + @Schema(description = "제휴 혜택2", example = "버터구이 오징어 제공") String benefit2 ) { public static StoreMapResponseDTO of( diff --git a/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java b/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java index c4f75d72..bb2d3d33 100644 --- a/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java +++ b/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java @@ -21,6 +21,7 @@ import com.assu.server.domain.user.repository.UserPaperRepository; import com.assu.server.infra.s3.AmazonS3Manager; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -69,7 +70,7 @@ public List getPartners(MapRequestDTO viewport, Long memb @Override public List getAdmins(MapRequestDTO viewport, Long memberId) { String wkt = toWKT(viewport); - List admins = adminRepository.findAllWithinViewportWithMember(wkt); + List admins = adminRepository.findAllWithinViewportWithMember(wkt, PageRequest.of(0, 200)); if (admins.isEmpty()) { return List.of(); @@ -292,7 +293,7 @@ public List searchPartner(String keyword, Long memberId) @Override public List searchAdmin(String keyword, Long memberId) { - List admins = adminRepository.searchAdminByKeywordWithMember(keyword); + List admins = adminRepository.searchAdminByKeywordWithMember(keyword, PageRequest.of(0, 50)); if (admins.isEmpty()) { return List.of(); diff --git a/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java index 7be633a1..79ce1aed 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java @@ -1,13 +1,25 @@ package com.assu.server.domain.partnership.dto; import com.assu.server.domain.partner.entity.Partner; +import io.swagger.v3.oas.annotations.media.Schema; public record AdminPartnershipCheckResponseDTO( + @Schema(description = "제안서 ID", example = "1001") Long paperId, + + @Schema(description = "제휴 여부", example = "true") boolean isPartnered, + + @Schema(description = "제휴 상태", example = "ACTIVE") String status, + + @Schema(description = "제휴업체 ID", example = "201") Long partnerId, + + @Schema(description = "제휴업체 이름", example = "역전할머니맥주 숭실대점") String partnerName, + + @Schema(description = "제휴업체 주소", example = "서울특별시 동작구 상도로") String partnerAddress ) { public static AdminPartnershipCheckResponseDTO of( diff --git a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java index b5194cb1..3aa251e7 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java @@ -6,6 +6,7 @@ import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.domain.partnership.entity.PaperContent; import com.assu.server.domain.store.entity.Store; +import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotNull; import java.time.LocalDate; @@ -13,11 +14,22 @@ import java.util.List; public record ManualPartnershipRequestDTO( + @Schema(description = "가게 이름", example = "역전할머니맥주 숭실대점") String storeName, + + @Schema(description = "선택된 장소 정보 (카카오맵 검색 결과)") @NotNull SelectedPlacePayload selectedPlace, + + @Schema(description = "가게 상세주소", example = "2층") String storeDetailAddress, + + @Schema(description = "제휴 시작일", example = "2024-01-01") LocalDate partnershipPeriodStart, + + @Schema(description = "제휴 마감일", example = "2024-12-31") LocalDate partnershipPeriodEnd, + + @Schema(description = "제휴 옵션 목록") List options ) { public Paper toPaper(Admin admin, Store store, ActivationStatus status) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java index f864a592..3c2d3737 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java @@ -1,13 +1,25 @@ package com.assu.server.domain.partnership.dto; import com.assu.server.domain.store.entity.Store; +import io.swagger.v3.oas.annotations.media.Schema; public record ManualPartnershipResponseDTO( + @Schema(description = "가게 ID", example = "201") Long storeId, + + @Schema(description = "가게가 DB에 신규 생성되었는지 여부", example = "false") boolean storeCreated, + + @Schema(description = "가게가 재활성화되었는지 여부", example = "false") boolean storeActivated, + + @Schema(description = "제휴 제안서의 상태", example = "SUSPEND") String status, + + @Schema(description = "계약서 파일 URL", example = "https://example.com/contract.jpg") String contractImageUrl, + + @Schema(description = "제휴 제안서 상세 정보") WritePartnershipResponseDTO partnership ) { public static ManualPartnershipResponseDTO of( diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java index 5b38ce7f..484937d0 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java @@ -1,13 +1,25 @@ package com.assu.server.domain.partnership.dto; import com.assu.server.domain.admin.entity.Admin; +import io.swagger.v3.oas.annotations.media.Schema; public record PartnerPartnershipCheckResponseDTO( + @Schema(description = "제안서 ID", example = "1001") Long paperId, + + @Schema(description = "제휴 여부", example = "true") boolean isPartnered, + + @Schema(description = "제휴 상태", example = "ACTIVE") String status, + + @Schema(description = "관리자 ID", example = "101") Long adminId, + + @Schema(description = "관리자 이름", example = "숭실대학교 총학생회") String adminName, + + @Schema(description = "관리자 주소", example = "서울특별시 동작구 상도로") String adminAddress ) { public static PartnerPartnershipCheckResponseDTO of( diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java index ed04f31a..6f348225 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java @@ -4,6 +4,7 @@ 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 io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import java.time.LocalDateTime; @@ -13,13 +14,28 @@ import java.util.Objects; public record PartnershipDetailResponseDTO( + @Schema(description = "제안서 ID", example = "1001") Long partnershipId, + + @Schema(description = "제안서 최종 수정 시간", example = "2024-06-15T10:30:00") LocalDateTime updatedAt, + + @Schema(description = "제휴 시작일", example = "2024-01-01") LocalDate partnershipPeriodStart, + + @Schema(description = "제휴 마감일", example = "2024-12-31") LocalDate partnershipPeriodEnd, + + @Schema(description = "관리자 ID", example = "101") Long adminId, + + @Schema(description = "제휴업체 ID", example = "201") Long partnerId, + + @Schema(description = "가게 ID", example = "301") Long storeId, + + @Schema(description = "제휴 옵션 목록") List options ) { public static PartnershipDetailResponseDTO of( diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java index 44b0a188..f63d6fba 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java @@ -5,8 +5,10 @@ import com.assu.server.domain.partner.entity.Partner; import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.domain.store.entity.Store; +import io.swagger.v3.oas.annotations.media.Schema; public record PartnershipDraftRequestDTO( + @Schema(description = "제휴 제안서를 작성할 제휴업체 ID", example = "101") Long partnerId ) { public Paper toDraftPaper(Admin admin, Partner partner, Store store) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java index 197c3118..58f1f18e 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java @@ -1,8 +1,10 @@ package com.assu.server.domain.partnership.dto; import com.assu.server.domain.partnership.entity.Paper; +import io.swagger.v3.oas.annotations.media.Schema; public record PartnershipDraftResponseDTO( + @Schema(description = "생성된 제안서 ID", example = "1001") Long paperId ) { public static PartnershipDraftResponseDTO of(Paper paper) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsRequestDTO.java index faaca6f8..b3a9dccf 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsRequestDTO.java @@ -1,6 +1,9 @@ package com.assu.server.domain.partnership.dto; +import io.swagger.v3.oas.annotations.media.Schema; + public record PartnershipGoodsRequestDTO( + @Schema(description = "서비스 제공 항목명", example = "아메리카노") String goodsName ) { } diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java index 37b864c7..23c6a6fe 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java @@ -1,11 +1,15 @@ package com.assu.server.domain.partnership.dto; import com.assu.server.domain.partnership.entity.Goods; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; public record PartnershipGoodsResponseDTO( + @Schema(description = "서비스 제공 항목 ID", example = "501") Long goodsId, + + @Schema(description = "서비스 제공 항목명", example = "아메리카노") String goodsName ) { public static PartnershipGoodsResponseDTO of(Goods goods) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java index 940aa8fa..57ff5d08 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java @@ -5,19 +5,37 @@ import com.assu.server.domain.partnership.entity.PaperContent; import com.assu.server.domain.partnership.entity.enums.CriterionType; import com.assu.server.domain.partnership.entity.enums.OptionType; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.ArrayList; import java.util.List; public record PartnershipOptionRequestDTO( + @Schema(description = "제공 서비스 종류 (SERVICE: 서비스 제공, DISCOUNT: 할인)", example = "SERVICE") OptionType optionType, + + @Schema(description = "서비스 제공 기준 (PRICE: 금액, HEADCOUNT: 인원)", example = "HEADCOUNT") CriterionType criterionType, + + @Schema(description = "기타 제공 서비스 여부", example = "false") Boolean anotherType, + + @Schema(description = "서비스 제공 기준 인원 수", example = "2") Integer people, + + @Schema(description = "서비스 제공 기준 금액", example = "10000") Long cost, + + @Schema(description = "서비스 카테고리 (서비스 제공 항목이 여러 개일 때 작성)", example = "음료") String category, + + @Schema(description = "할인율", example = "10") Long discountRate, + + @Schema(description = "기타 유형 제휴 옵션 문구", example = "웰컴 드링크 제공") String note, + + @Schema(description = "서비스 제공 항목 목록") List goods ) { public PaperContent toPaperContent(Paper paper) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java index 4bb036ee..f2571d03 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java @@ -4,18 +4,36 @@ import com.assu.server.domain.partnership.entity.PaperContent; import com.assu.server.domain.partnership.entity.enums.CriterionType; import com.assu.server.domain.partnership.entity.enums.OptionType; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.List; public record PartnershipOptionResponseDTO( + @Schema(description = "제공 서비스 종류 (SERVICE: 서비스 제공, DISCOUNT: 할인)", example = "SERVICE") OptionType optionType, + + @Schema(description = "서비스 제공 기준 (PRICE: 금액, HEADCOUNT: 인원)", example = "HEADCOUNT") CriterionType criterionType, + + @Schema(description = "기타 제공 서비스 여부", example = "false") Boolean anotherType, + + @Schema(description = "서비스 제공 기준 인원 수", example = "2") Integer people, + + @Schema(description = "서비스 제공 기준 금액", example = "10000") Long cost, + + @Schema(description = "기타 유형 제휴 옵션 문구", example = "웰컴 드링크 제공") String note, + + @Schema(description = "서비스 카테고리 (서비스 제공 항목이 여러 개일 때 작성)", example = "음료") String category, + + @Schema(description = "할인율", example = "10") Long discountRate, + + @Schema(description = "서비스 제공 항목 목록") List goods ) { public static PartnershipOptionResponseDTO of(PaperContent pc, List goods) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java index aa95ef9b..c22b84d8 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java @@ -1,6 +1,9 @@ package com.assu.server.domain.partnership.dto; +import io.swagger.v3.oas.annotations.media.Schema; + public record PartnershipStatusUpdateRequestDTO( + @Schema(description = "제안서에 적용할 상태 (ACTIVE/SUSPEND/INACTIVE)", example = "ACTIVE") String status ) { } diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java index 38835858..a1d982cd 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java @@ -2,13 +2,21 @@ import com.assu.server.domain.common.enums.ActivationStatus; import com.assu.server.domain.partnership.entity.Paper; +import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; public record PartnershipStatusUpdateResponseDTO( + @Schema(description = "제안서 ID", example = "1001") Long partnershipId, + + @Schema(description = "변경 전 제안서 상태", example = "SUSPEND") String prevStatus, + + @Schema(description = "변경 후 제안서 상태", example = "ACTIVE") String newStatus, + + @Schema(description = "상태 변경 시간", example = "2024-06-15T10:30:00") LocalDateTime changedAt ) { public static PartnershipStatusUpdateResponseDTO of( diff --git a/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java index 50d892ce..bcb6e8d1 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java @@ -1,12 +1,18 @@ package com.assu.server.domain.partnership.dto; import com.assu.server.domain.partnership.entity.Paper; +import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; public record SuspendedPaperResponseDTO( + @Schema(description = "제안서 ID", example = "1001") Long paperId, + + @Schema(description = "제휴업체 이름", example = "역전할머니맥주 숭실대점") String partnerName, + + @Schema(description = "제안서 생성 일자", example = "2024-01-01T09:00:00") LocalDateTime createdAt ) { public static SuspendedPaperResponseDTO of(Paper paper) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java index 6331de28..a08ed9b5 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java @@ -4,15 +4,23 @@ 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 io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import java.util.Collections; import java.util.List; public record WritePartnershipRequestDTO( + @Schema(description = "수정할 제안서 ID", example = "1001") Long paperId, + + @Schema(description = "제휴 시작일", example = "2024-01-01") LocalDate partnershipPeriodStart, + + @Schema(description = "제휴 마감일", example = "2024-12-31") LocalDate partnershipPeriodEnd, + + @Schema(description = "제휴 옵션 목록") List options ) { public void updatePaper(Paper paper) { diff --git a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java index 82609319..362141c8 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java @@ -4,21 +4,41 @@ 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 io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; public record WritePartnershipResponseDTO( + @Schema(description = "제안서 ID", example = "1001") Long partnershipId, + + @Schema(description = "제휴 시작일", example = "2024-01-01") LocalDate partnershipPeriodStart, + + @Schema(description = "제휴 마감일", example = "2024-12-31") LocalDate partnershipPeriodEnd, + + @Schema(description = "관리자 ID", example = "101") Long adminId, + + @Schema(description = "제휴업체 ID", example = "201") Long partnerId, + + @Schema(description = "가게 ID", example = "301") Long storeId, + + @Schema(description = "가게 이름", example = "역전할머니맥주 숭실대점") String storeName, + + @Schema(description = "관리자 이름", example = "숭실대학교 총학생회") String adminName, + + @Schema(description = "제안서 활성화 여부", example = "SUSPEND") ActivationStatus isActivated, + + @Schema(description = "제휴 옵션 목록") List options ) { public static WritePartnershipResponseDTO of( From 16241836d98082bf70b7be44626c774cb7594514 Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Mon, 23 Feb 2026 16:59:31 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[Refactor/#233]=20-=20UserPaperRepository?= =?UTF-8?q?=20=EC=BF=BC=EB=A6=AC=20=EC=A1=B0=EA=B1=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/assu/server/domain/map/dto/StoreMapResponseDTO.java | 6 +++--- .../server/domain/user/repository/UserPaperRepository.java | 2 -- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java b/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java index 8f00cb3a..ff1d7211 100644 --- a/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java +++ b/src/main/java/com/assu/server/domain/map/dto/StoreMapResponseDTO.java @@ -34,19 +34,19 @@ public record StoreMapResponseDTO( String phoneNumber, @Schema(description = "관리자1 ID", example = "101") - Long adminId1, + @NotNull Long adminId1, @Schema(description = "관리자2 ID", example = "102") Long adminId2, @Schema(description = "관리자1 이름", example = "숭실대학교 총학생회") - String adminName1, + @NotNull String adminName1, @Schema(description = "관리자2 이름", example = "숭실대학교 IT대학 학생회") String adminName2, @Schema(description = "제휴 혜택1", example = "음료 10% 할인") - String benefit1, + @NotNull String benefit1, @Schema(description = "제휴 혜택2", example = "버터구이 오징어 제공") String benefit2 diff --git a/src/main/java/com/assu/server/domain/user/repository/UserPaperRepository.java b/src/main/java/com/assu/server/domain/user/repository/UserPaperRepository.java index 511998f1..b9ec0bf2 100644 --- a/src/main/java/com/assu/server/domain/user/repository/UserPaperRepository.java +++ b/src/main/java/com/assu/server/domain/user/repository/UserPaperRepository.java @@ -17,8 +17,6 @@ public interface UserPaperRepository extends JpaRepository { LEFT JOIN FETCH p.admin a WHERE up.student.id = :studentId AND p.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE - AND p.partnershipPeriodStart <= :today - AND p.partnershipPeriodEnd >= :today ORDER BY p.id DESC """) List findActivePartnershipsByStudentId(@Param("studentId") Long studentId, From 2b9e4f59e768360006be0426a1541f744a89a559 Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Mon, 23 Feb 2026 17:29:02 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[Refactor/#233]=20-=20=EC=A0=9C=EC=95=BD=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EB=B0=8F=20=EA=B3=B5=ED=86=B5=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=20=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/AdminPartnershipCheckResponseDTO.java | 11 ++++++----- .../dto/ManualPartnershipRequestDTO.java | 8 ++++---- .../dto/ManualPartnershipResponseDTO.java | 9 +++++---- .../PartnerPartnershipCheckResponseDTO.java | 11 ++++++----- .../dto/PartnershipDetailResponseDTO.java | 15 ++++++++------- .../dto/PartnershipDraftRequestDTO.java | 3 ++- .../dto/PartnershipDraftResponseDTO.java | 3 ++- .../dto/PartnershipGoodsResponseDTO.java | 5 +++-- .../dto/PartnershipOptionRequestDTO.java | 7 ++++--- .../dto/PartnershipOptionResponseDTO.java | 7 ++++--- .../PartnershipStatusUpdateRequestDTO.java | 3 ++- .../PartnershipStatusUpdateResponseDTO.java | 9 +++++---- .../dto/SuspendedPaperResponseDTO.java | 7 ++++--- .../dto/WritePartnershipRequestDTO.java | 9 +++++---- .../dto/WritePartnershipResponseDTO.java | 19 ++++++++++--------- 15 files changed, 70 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java index 79ce1aed..d2f05ee3 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/AdminPartnershipCheckResponseDTO.java @@ -2,25 +2,26 @@ import com.assu.server.domain.partner.entity.Partner; import io.swagger.v3.oas.annotations.media.Schema; +import org.jetbrains.annotations.NotNull; public record AdminPartnershipCheckResponseDTO( @Schema(description = "제안서 ID", example = "1001") - Long paperId, + @NotNull Long paperId, @Schema(description = "제휴 여부", example = "true") boolean isPartnered, @Schema(description = "제휴 상태", example = "ACTIVE") - String status, + @NotNull String status, @Schema(description = "제휴업체 ID", example = "201") - Long partnerId, + @NotNull Long partnerId, @Schema(description = "제휴업체 이름", example = "역전할머니맥주 숭실대점") - String partnerName, + @NotNull String partnerName, @Schema(description = "제휴업체 주소", example = "서울특별시 동작구 상도로") - String partnerAddress + @NotNull String partnerAddress ) { public static AdminPartnershipCheckResponseDTO of( Partner partner, diff --git a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java index 3aa251e7..04a34d32 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipRequestDTO.java @@ -15,7 +15,7 @@ public record ManualPartnershipRequestDTO( @Schema(description = "가게 이름", example = "역전할머니맥주 숭실대점") - String storeName, + @NotNull String storeName, @Schema(description = "선택된 장소 정보 (카카오맵 검색 결과)") @NotNull SelectedPlacePayload selectedPlace, @@ -24,13 +24,13 @@ public record ManualPartnershipRequestDTO( String storeDetailAddress, @Schema(description = "제휴 시작일", example = "2024-01-01") - LocalDate partnershipPeriodStart, + @NotNull LocalDate partnershipPeriodStart, @Schema(description = "제휴 마감일", example = "2024-12-31") - LocalDate partnershipPeriodEnd, + @NotNull LocalDate partnershipPeriodEnd, @Schema(description = "제휴 옵션 목록") - List options + @NotNull List options ) { public Paper toPaper(Admin admin, Store store, ActivationStatus status) { return Paper.builder() diff --git a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java index 3c2d3737..d860bfc3 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/ManualPartnershipResponseDTO.java @@ -2,10 +2,11 @@ import com.assu.server.domain.store.entity.Store; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; public record ManualPartnershipResponseDTO( @Schema(description = "가게 ID", example = "201") - Long storeId, + @NotNull Long storeId, @Schema(description = "가게가 DB에 신규 생성되었는지 여부", example = "false") boolean storeCreated, @@ -14,13 +15,13 @@ public record ManualPartnershipResponseDTO( boolean storeActivated, @Schema(description = "제휴 제안서의 상태", example = "SUSPEND") - String status, + @NotNull String status, @Schema(description = "계약서 파일 URL", example = "https://example.com/contract.jpg") - String contractImageUrl, + @NotNull String contractImageUrl, @Schema(description = "제휴 제안서 상세 정보") - WritePartnershipResponseDTO partnership + @NotNull WritePartnershipResponseDTO partnership ) { public static ManualPartnershipResponseDTO of( Store store, diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java index 484937d0..54650fdc 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnerPartnershipCheckResponseDTO.java @@ -2,25 +2,26 @@ import com.assu.server.domain.admin.entity.Admin; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; public record PartnerPartnershipCheckResponseDTO( @Schema(description = "제안서 ID", example = "1001") - Long paperId, + @NotNull Long paperId, @Schema(description = "제휴 여부", example = "true") boolean isPartnered, @Schema(description = "제휴 상태", example = "ACTIVE") - String status, + @NotNull String status, @Schema(description = "관리자 ID", example = "101") - Long adminId, + @NotNull Long adminId, @Schema(description = "관리자 이름", example = "숭실대학교 총학생회") - String adminName, + @NotNull String adminName, @Schema(description = "관리자 주소", example = "서울특별시 동작구 상도로") - String adminAddress + @NotNull String adminAddress ) { public static PartnerPartnershipCheckResponseDTO of( Admin admin, diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java index 6f348225..163191b9 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDetailResponseDTO.java @@ -5,6 +5,7 @@ import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.domain.partnership.entity.PaperContent; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; import java.time.LocalDateTime; @@ -15,28 +16,28 @@ public record PartnershipDetailResponseDTO( @Schema(description = "제안서 ID", example = "1001") - Long partnershipId, + @NotNull Long partnershipId, @Schema(description = "제안서 최종 수정 시간", example = "2024-06-15T10:30:00") - LocalDateTime updatedAt, + @NotNull LocalDateTime updatedAt, @Schema(description = "제휴 시작일", example = "2024-01-01") - LocalDate partnershipPeriodStart, + @NotNull LocalDate partnershipPeriodStart, @Schema(description = "제휴 마감일", example = "2024-12-31") - LocalDate partnershipPeriodEnd, + @NotNull LocalDate partnershipPeriodEnd, @Schema(description = "관리자 ID", example = "101") - Long adminId, + @NotNull Long adminId, @Schema(description = "제휴업체 ID", example = "201") Long partnerId, @Schema(description = "가게 ID", example = "301") - Long storeId, + @NotNull Long storeId, @Schema(description = "제휴 옵션 목록") - List options + @NotNull List options ) { public static PartnershipDetailResponseDTO of( Paper paper, diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java index f63d6fba..9779fac8 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftRequestDTO.java @@ -6,10 +6,11 @@ import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.domain.store.entity.Store; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; public record PartnershipDraftRequestDTO( @Schema(description = "제휴 제안서를 작성할 제휴업체 ID", example = "101") - Long partnerId + @NotNull Long partnerId ) { public Paper toDraftPaper(Admin admin, Partner partner, Store store) { return Paper.builder() diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java index 58f1f18e..221a5fc2 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipDraftResponseDTO.java @@ -2,10 +2,11 @@ import com.assu.server.domain.partnership.entity.Paper; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; public record PartnershipDraftResponseDTO( @Schema(description = "생성된 제안서 ID", example = "1001") - Long paperId + @NotNull Long paperId ) { public static PartnershipDraftResponseDTO of(Paper paper) { return new PartnershipDraftResponseDTO(paper.getId()); diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java index 23c6a6fe..2e12b179 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipGoodsResponseDTO.java @@ -2,15 +2,16 @@ import com.assu.server.domain.partnership.entity.Goods; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.util.List; public record PartnershipGoodsResponseDTO( @Schema(description = "서비스 제공 항목 ID", example = "501") - Long goodsId, + @NotNull Long goodsId, @Schema(description = "서비스 제공 항목명", example = "아메리카노") - String goodsName + @NotNull String goodsName ) { public static PartnershipGoodsResponseDTO of(Goods goods) { return new PartnershipGoodsResponseDTO(goods.getId(), goods.getBelonging()); diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java index 57ff5d08..36d53fc3 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionRequestDTO.java @@ -6,19 +6,20 @@ import com.assu.server.domain.partnership.entity.enums.CriterionType; import com.assu.server.domain.partnership.entity.enums.OptionType; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.util.ArrayList; import java.util.List; public record PartnershipOptionRequestDTO( @Schema(description = "제공 서비스 종류 (SERVICE: 서비스 제공, DISCOUNT: 할인)", example = "SERVICE") - OptionType optionType, + @NotNull OptionType optionType, @Schema(description = "서비스 제공 기준 (PRICE: 금액, HEADCOUNT: 인원)", example = "HEADCOUNT") - CriterionType criterionType, + @NotNull CriterionType criterionType, @Schema(description = "기타 제공 서비스 여부", example = "false") - Boolean anotherType, + @NotNull Boolean anotherType, @Schema(description = "서비스 제공 기준 인원 수", example = "2") Integer people, diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java index f2571d03..1bc6b536 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipOptionResponseDTO.java @@ -5,18 +5,19 @@ import com.assu.server.domain.partnership.entity.enums.CriterionType; import com.assu.server.domain.partnership.entity.enums.OptionType; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.util.List; public record PartnershipOptionResponseDTO( @Schema(description = "제공 서비스 종류 (SERVICE: 서비스 제공, DISCOUNT: 할인)", example = "SERVICE") - OptionType optionType, + @NotNull OptionType optionType, @Schema(description = "서비스 제공 기준 (PRICE: 금액, HEADCOUNT: 인원)", example = "HEADCOUNT") - CriterionType criterionType, + @NotNull CriterionType criterionType, @Schema(description = "기타 제공 서비스 여부", example = "false") - Boolean anotherType, + @NotNull Boolean anotherType, @Schema(description = "서비스 제공 기준 인원 수", example = "2") Integer people, diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java index c22b84d8..f45c8adb 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateRequestDTO.java @@ -1,9 +1,10 @@ package com.assu.server.domain.partnership.dto; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; public record PartnershipStatusUpdateRequestDTO( @Schema(description = "제안서에 적용할 상태 (ACTIVE/SUSPEND/INACTIVE)", example = "ACTIVE") - String status + @NotNull String status ) { } diff --git a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java index a1d982cd..baf512ad 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/PartnershipStatusUpdateResponseDTO.java @@ -3,21 +3,22 @@ import com.assu.server.domain.common.enums.ActivationStatus; import com.assu.server.domain.partnership.entity.Paper; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.time.LocalDateTime; public record PartnershipStatusUpdateResponseDTO( @Schema(description = "제안서 ID", example = "1001") - Long partnershipId, + @NotNull Long partnershipId, @Schema(description = "변경 전 제안서 상태", example = "SUSPEND") - String prevStatus, + @NotNull String prevStatus, @Schema(description = "변경 후 제안서 상태", example = "ACTIVE") - String newStatus, + @NotNull String newStatus, @Schema(description = "상태 변경 시간", example = "2024-06-15T10:30:00") - LocalDateTime changedAt + @NotNull LocalDateTime changedAt ) { public static PartnershipStatusUpdateResponseDTO of( Paper paper, diff --git a/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java index bcb6e8d1..7a14dfda 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/SuspendedPaperResponseDTO.java @@ -2,18 +2,19 @@ import com.assu.server.domain.partnership.entity.Paper; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.time.LocalDateTime; public record SuspendedPaperResponseDTO( @Schema(description = "제안서 ID", example = "1001") - Long paperId, + @NotNull Long paperId, @Schema(description = "제휴업체 이름", example = "역전할머니맥주 숭실대점") - String partnerName, + @NotNull String partnerName, @Schema(description = "제안서 생성 일자", example = "2024-01-01T09:00:00") - LocalDateTime createdAt + @NotNull LocalDateTime createdAt ) { public static SuspendedPaperResponseDTO of(Paper paper) { return new SuspendedPaperResponseDTO( diff --git a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java index a08ed9b5..b5323af8 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipRequestDTO.java @@ -5,6 +5,7 @@ import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.domain.partnership.entity.PaperContent; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; import java.util.Collections; @@ -12,16 +13,16 @@ public record WritePartnershipRequestDTO( @Schema(description = "수정할 제안서 ID", example = "1001") - Long paperId, + @NotNull Long paperId, @Schema(description = "제휴 시작일", example = "2024-01-01") - LocalDate partnershipPeriodStart, + @NotNull LocalDate partnershipPeriodStart, @Schema(description = "제휴 마감일", example = "2024-12-31") - LocalDate partnershipPeriodEnd, + @NotNull LocalDate partnershipPeriodEnd, @Schema(description = "제휴 옵션 목록") - List options + @NotNull List options ) { public void updatePaper(Paper paper) { paper.setPartnershipPeriodStart(partnershipPeriodStart()); diff --git a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java index 362141c8..d76589cf 100644 --- a/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java +++ b/src/main/java/com/assu/server/domain/partnership/dto/WritePartnershipResponseDTO.java @@ -5,6 +5,7 @@ import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.domain.partnership.entity.PaperContent; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import java.time.LocalDate; import java.util.ArrayList; @@ -12,34 +13,34 @@ public record WritePartnershipResponseDTO( @Schema(description = "제안서 ID", example = "1001") - Long partnershipId, + @NotNull Long partnershipId, @Schema(description = "제휴 시작일", example = "2024-01-01") - LocalDate partnershipPeriodStart, + @NotNull LocalDate partnershipPeriodStart, @Schema(description = "제휴 마감일", example = "2024-12-31") - LocalDate partnershipPeriodEnd, + @NotNull LocalDate partnershipPeriodEnd, @Schema(description = "관리자 ID", example = "101") - Long adminId, + @NotNull Long adminId, @Schema(description = "제휴업체 ID", example = "201") Long partnerId, @Schema(description = "가게 ID", example = "301") - Long storeId, + @NotNull Long storeId, @Schema(description = "가게 이름", example = "역전할머니맥주 숭실대점") - String storeName, + @NotNull String storeName, @Schema(description = "관리자 이름", example = "숭실대학교 총학생회") - String adminName, + @NotNull String adminName, @Schema(description = "제안서 활성화 여부", example = "SUSPEND") - ActivationStatus isActivated, + @NotNull ActivationStatus isActivated, @Schema(description = "제휴 옵션 목록") - List options + @NotNull List options ) { public static WritePartnershipResponseDTO of( Paper paper, From a9f5e66ccb85e3fef0c0b0970c0a021fa63d1fc9 Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Mon, 23 Feb 2026 17:29:31 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[Refactor/#233]=20-=20=EC=A0=9C=EC=95=BD=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EB=B0=8F=20=EA=B3=B5=ED=86=B5=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=20=EC=82=AC=ED=95=AD=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/admin/service/AdminService.java | 6 +- .../admin/service/AdminServiceImpl.java | 10 +-- .../domain/map/controller/MapController.java | 6 +- .../domain/map/service/MapServiceImpl.java | 8 +- .../controller/PaperController.java | 12 ++- .../controller/PartnershipController.java | 39 ++------ .../repository/GoodsRepository.java | 8 +- .../repository/PaperContentRepository.java | 89 +------------------ .../repository/PaperRepository.java | 13 ++- .../service/PartnershipService.java | 14 +-- .../service/PartnershipServiceImpl.java | 23 +---- .../controller/SuggestionController.java | 14 +-- .../converter/SuggestionConverter.java | 66 -------------- .../dto/GetSuggestionAdminsDTO.java | 35 ++++++++ .../dto/GetSuggestionResponseDTO.java | 40 +++++++++ .../suggestion/dto/SuggestionRequestDTO.java | 13 --- .../suggestion/dto/SuggestionResponseDTO.java | 51 ----------- .../dto/WriteSuggestionRequestDTO.java | 27 ++++++ .../dto/WriteSuggestionResponseDTO.java | 32 +++++++ .../suggestion/service/SuggestionService.java | 14 +-- .../service/SuggestionServiceImpl.java | 25 +++--- 21 files changed, 198 insertions(+), 347 deletions(-) delete mode 100644 src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java create mode 100644 src/main/java/com/assu/server/domain/suggestion/dto/GetSuggestionAdminsDTO.java create mode 100644 src/main/java/com/assu/server/domain/suggestion/dto/GetSuggestionResponseDTO.java delete mode 100644 src/main/java/com/assu/server/domain/suggestion/dto/SuggestionRequestDTO.java delete mode 100644 src/main/java/com/assu/server/domain/suggestion/dto/SuggestionResponseDTO.java create mode 100644 src/main/java/com/assu/server/domain/suggestion/dto/WriteSuggestionRequestDTO.java create mode 100644 src/main/java/com/assu/server/domain/suggestion/dto/WriteSuggestionResponseDTO.java diff --git a/src/main/java/com/assu/server/domain/admin/service/AdminService.java b/src/main/java/com/assu/server/domain/admin/service/AdminService.java index b7dd3f11..03655080 100644 --- a/src/main/java/com/assu/server/domain/admin/service/AdminService.java +++ b/src/main/java/com/assu/server/domain/admin/service/AdminService.java @@ -1,13 +1,13 @@ package com.assu.server.domain.admin.service; -import com.assu.server.domain.admin.dto.AdminResponseDTO; - -import java.util.List; +import com.assu.server.domain.admin.dto.AdminResponseDTO; import com.assu.server.domain.admin.entity.Admin; import com.assu.server.domain.user.entity.enums.Department; import com.assu.server.domain.user.entity.enums.Major; import com.assu.server.domain.user.entity.enums.University; +import java.util.List; + public interface AdminService { List findMatchingAdmins(University university, Department department, Major major); diff --git a/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java b/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java index 3ccd57a9..a004f37b 100644 --- a/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java +++ b/src/main/java/com/assu/server/domain/admin/service/AdminServiceImpl.java @@ -1,20 +1,20 @@ package com.assu.server.domain.admin.service; -import java.util.List; -import org.springframework.stereotype.Service; import com.assu.server.domain.admin.dto.AdminResponseDTO; import com.assu.server.domain.admin.entity.Admin; import com.assu.server.domain.admin.repository.AdminRepository; -import com.assu.server.domain.user.entity.enums.Department; -import com.assu.server.domain.user.entity.enums.Major; -import lombok.RequiredArgsConstructor; import com.assu.server.domain.partner.entity.Partner; import com.assu.server.domain.partner.repository.PartnerRepository; +import com.assu.server.domain.user.entity.enums.Department; +import com.assu.server.domain.user.entity.enums.Major; import com.assu.server.domain.user.entity.enums.University; import com.assu.server.global.apiPayload.code.status.ErrorStatus; import com.assu.server.global.exception.DatabaseException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; import java.util.concurrent.ThreadLocalRandom; @Service diff --git a/src/main/java/com/assu/server/domain/map/controller/MapController.java b/src/main/java/com/assu/server/domain/map/controller/MapController.java index f090ee90..fcb47f76 100644 --- a/src/main/java/com/assu/server/domain/map/controller/MapController.java +++ b/src/main/java/com/assu/server/domain/map/controller/MapController.java @@ -1,11 +1,7 @@ package com.assu.server.domain.map.controller; import com.assu.server.domain.common.enums.UserRole; -import com.assu.server.domain.map.dto.AdminMapResponseDTO; -import com.assu.server.domain.map.dto.MapRequestDTO; -import com.assu.server.domain.map.dto.PartnerMapResponseDTO; -import com.assu.server.domain.map.dto.PlaceSuggestionDTO; -import com.assu.server.domain.map.dto.StoreMapResponseDTO; +import com.assu.server.domain.map.dto.*; import com.assu.server.domain.map.service.MapService; import com.assu.server.domain.map.service.PlaceSearchService; import com.assu.server.global.apiPayload.BaseResponse; diff --git a/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java b/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java index bb2d3d33..143c1dc1 100644 --- a/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java +++ b/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java @@ -26,13 +26,7 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; @Service diff --git a/src/main/java/com/assu/server/domain/partnership/controller/PaperController.java b/src/main/java/com/assu/server/domain/partnership/controller/PaperController.java index ee7b07b2..118dc3e1 100644 --- a/src/main/java/com/assu/server/domain/partnership/controller/PaperController.java +++ b/src/main/java/com/assu/server/domain/partnership/controller/PaperController.java @@ -1,22 +1,20 @@ package com.assu.server.domain.partnership.controller; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - import com.assu.server.domain.partnership.dto.PaperResponseDTO; import com.assu.server.domain.partnership.service.PaperQueryService; import com.assu.server.global.apiPayload.BaseResponse; import com.assu.server.global.apiPayload.code.status.SuccessStatus; import com.assu.server.global.util.PrincipalDetails; -import org.springframework.security.core.annotation.AuthenticationPrincipal; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.tags.Tag; - import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; @RestController @Tag(name = "Paper", description = "제휴 제안서 조회 api") 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 bf21a86b..47e71d76 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 @@ -1,46 +1,23 @@ package com.assu.server.domain.partnership.controller; -import java.util.List; - -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.PostMapping; -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; - -import com.assu.server.domain.partnership.dto.AdminPartnershipCheckResponseDTO; -import com.assu.server.domain.partnership.dto.ManualPartnershipRequestDTO; -import com.assu.server.domain.partnership.dto.ManualPartnershipResponseDTO; -import com.assu.server.domain.partnership.dto.PartnerPartnershipCheckResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipDetailResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipDraftRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipDraftResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipFinalRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipStatusUpdateRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipStatusUpdateResponseDTO; -import com.assu.server.domain.partnership.dto.SuspendedPaperResponseDTO; -import com.assu.server.domain.partnership.dto.WritePartnershipRequestDTO; -import com.assu.server.domain.partnership.dto.WritePartnershipResponseDTO; +import com.assu.server.domain.partnership.dto.*; import com.assu.server.domain.partnership.service.PartnershipService; import com.assu.server.global.apiPayload.BaseResponse; 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.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; @RestController @Tag(name = "Partnership", description = "제휴 제안 api") 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 ea05acfc..59665c53 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 @@ -1,21 +1,17 @@ package com.assu.server.domain.partnership.repository; -import java.util.List; - +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 com.assu.server.domain.partnership.entity.Goods; +import java.util.List; public interface GoodsRepository extends JpaRepository { List findByContentId(Long contentId); - @Query("SELECT g FROM Goods g WHERE g.content.id IN :contentIds") - List findByContentIdIn(@Param("contentIds") List contentIds); - @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/PaperContentRepository.java b/src/main/java/com/assu/server/domain/partnership/repository/PaperContentRepository.java index 25a3b287..d12262ff 100644 --- a/src/main/java/com/assu/server/domain/partnership/repository/PaperContentRepository.java +++ b/src/main/java/com/assu/server/domain/partnership/repository/PaperContentRepository.java @@ -1,13 +1,12 @@ package com.assu.server.domain.partnership.repository; -import java.util.List; -import java.util.Optional; - +import com.assu.server.domain.partnership.entity.PaperContent; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import com.assu.server.domain.partnership.entity.PaperContent; +import java.util.List; +import java.util.Optional; public interface PaperContentRepository extends JpaRepository { @@ -31,86 +30,8 @@ public interface PaperContentRepository extends JpaRepository findById(Long id); - @Query(value = """ -WITH ranked_content AS ( - SELECT pc.*, - ROW_NUMBER() OVER ( - PARTITION BY p.store_id - ORDER BY - CASE pc.option_type - WHEN :service THEN 0 ELSE 1 END, - CASE pc.criterion_type - WHEN :price THEN 0 - WHEN :headcount THEN 1 - ELSE 2 END, - pc.updated_at DESC, - pc.id DESC - ) AS rn - FROM paper_content pc - JOIN paper p ON p.id = pc.paper_id - WHERE p.store_id IN :storeIds - AND p.id IN :userPaperIds - AND p.is_activated = :active - AND CURRENT_DATE BETWEEN p.partnership_period_start AND p.partnership_period_end - AND ( - (pc.option_type = :service AND - ((pc.criterion_type = :price AND pc.cost IS NOT NULL) - OR (pc.criterion_type = :headcount AND pc.cost IS NOT NULL AND pc.people IS NOT NULL))) - OR (pc.option_type = :discount AND pc.discount IS NOT NULL) - ) -) -SELECT * FROM ranked_content WHERE rn <= 2 -""", nativeQuery = true) - List findLatestValidByStoreIdInNativeMax2( - @Param("storeIds") List storeIds, - @Param("active") String active, - @Param("service") String service, - @Param("discount") String discount, - @Param("price") String price, - @Param("headcount") String headcount, - @Param("userPaperIds") List userPaperIds // 수정된 부분: 이름과 타입 변경 - ); - Optional findTopByPaperIdOrderByIdDesc(Long paperId); - @Query(value = """ -WITH ranked_content AS ( - SELECT pc.*, - ROW_NUMBER() OVER ( - PARTITION BY p.store_id - ORDER BY - CASE pc.option_type - WHEN :service THEN 0 ELSE 1 END, - CASE pc.criterion_type - WHEN :price THEN 0 - WHEN :headcount THEN 1 - ELSE 2 END, - pc.updated_at DESC, - pc.id DESC - ) AS rn - FROM paper_content pc - JOIN paper p ON p.id = pc.paper_id - WHERE p.store_id IN :storeIds - AND p.is_activated = :active - AND CURRENT_DATE BETWEEN p.partnership_period_start AND p.partnership_period_end - AND ( - (pc.option_type = :service AND - ((pc.criterion_type = :price AND pc.cost IS NOT NULL) - OR (pc.criterion_type = :headcount AND pc.cost IS NOT NULL AND pc.people IS NOT NULL))) - OR (pc.option_type = :discount AND pc.discount IS NOT NULL) - ) -) -SELECT * FROM ranked_content WHERE rn = 1 -""", nativeQuery = true) - List findLatestValidByStoreIdInNative( - @Param("storeIds") List storeIds, - @Param("active") String active, - @Param("service") String service, - @Param("discount") String discount, - @Param("price") String price, - @Param("headcount") String headcount - ); - @Query(""" SELECT pc FROM PaperContent pc @@ -119,10 +40,6 @@ List findLatestValidByStoreIdInNative( """) List findTopByStoreIdIn(@Param("storeIds") List storeIds); - /** - * 주어진 paper_id 목록에서 각 paper의 가장 최신 PaperContent를 1건씩 반환. - * paper_id 컬럼 인덱스를 활용한 ROW_NUMBER() 윈도우 함수 사용. - */ @Query(value = """ WITH ranked AS ( SELECT pc.*, 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 e195e5d2..15e28921 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 @@ -1,9 +1,7 @@ package com.assu.server.domain.partnership.repository; -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - +import com.assu.server.domain.common.enums.ActivationStatus; +import com.assu.server.domain.partnership.entity.Paper; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -12,8 +10,9 @@ import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import com.assu.server.domain.common.enums.ActivationStatus; -import com.assu.server.domain.partnership.entity.Paper; +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; public interface PaperRepository extends JpaRepository { @@ -56,8 +55,6 @@ List findActivePapersByAdminIds(@Param("adminIds") List adminIds, @Param("today") LocalDate today, @Param("status") ActivationStatus status); - List findByStoreIdAndAdminIdAndIsActivated(Long storeId, Long adminId, ActivationStatus isActivated); - @Query(""" SELECT p FROM Paper p WHERE p.admin.id = :adminId 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 a9dd93ef..23de8149 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 @@ -1,19 +1,7 @@ package com.assu.server.domain.partnership.service; import com.assu.server.domain.member.entity.Member; -import com.assu.server.domain.partnership.dto.AdminPartnershipCheckResponseDTO; -import com.assu.server.domain.partnership.dto.ManualPartnershipRequestDTO; -import com.assu.server.domain.partnership.dto.ManualPartnershipResponseDTO; -import com.assu.server.domain.partnership.dto.PartnerPartnershipCheckResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipDetailResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipDraftRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipDraftResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipFinalRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipStatusUpdateRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipStatusUpdateResponseDTO; -import com.assu.server.domain.partnership.dto.SuspendedPaperResponseDTO; -import com.assu.server.domain.partnership.dto.WritePartnershipRequestDTO; -import com.assu.server.domain.partnership.dto.WritePartnershipResponseDTO; +import com.assu.server.domain.partnership.dto.*; import org.springframework.web.multipart.MultipartFile; import java.util.List; 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 482dde2e..ee152767 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 @@ -11,19 +11,7 @@ import com.assu.server.domain.notification.service.NotificationCommandService; import com.assu.server.domain.partner.entity.Partner; import com.assu.server.domain.partner.repository.PartnerRepository; -import com.assu.server.domain.partnership.dto.AdminPartnershipCheckResponseDTO; -import com.assu.server.domain.partnership.dto.ManualPartnershipRequestDTO; -import com.assu.server.domain.partnership.dto.ManualPartnershipResponseDTO; -import com.assu.server.domain.partnership.dto.PartnerPartnershipCheckResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipDetailResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipDraftRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipDraftResponseDTO; -import com.assu.server.domain.partnership.dto.PartnershipFinalRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipStatusUpdateRequestDTO; -import com.assu.server.domain.partnership.dto.PartnershipStatusUpdateResponseDTO; -import com.assu.server.domain.partnership.dto.SuspendedPaperResponseDTO; -import com.assu.server.domain.partnership.dto.WritePartnershipRequestDTO; -import com.assu.server.domain.partnership.dto.WritePartnershipResponseDTO; +import com.assu.server.domain.partnership.dto.*; import com.assu.server.domain.partnership.entity.Goods; import com.assu.server.domain.partnership.entity.Paper; import com.assu.server.domain.partnership.entity.PaperContent; @@ -123,15 +111,6 @@ public WritePartnershipResponseDTO updatePartnership( Paper paper = paperRepository.findById(request.paperId()) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_PAPER)); - Partner partner = partnerRepository.findById(memberId) - .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_PARTNER)); - - 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)); - request.updatePaper(paper); List existingContents = paperContentRepository.findByPaperId(request.paperId()); 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 a1614c24..3d23d7df 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 @@ -1,7 +1,9 @@ package com.assu.server.domain.suggestion.controller; -import com.assu.server.domain.suggestion.dto.SuggestionRequestDTO; -import com.assu.server.domain.suggestion.dto.SuggestionResponseDTO; +import com.assu.server.domain.suggestion.dto.GetSuggestionAdminsDTO; +import com.assu.server.domain.suggestion.dto.GetSuggestionResponseDTO; +import com.assu.server.domain.suggestion.dto.WriteSuggestionRequestDTO; +import com.assu.server.domain.suggestion.dto.WriteSuggestionResponseDTO; import com.assu.server.domain.suggestion.service.SuggestionService; import com.assu.server.global.apiPayload.BaseResponse; import com.assu.server.global.apiPayload.code.status.SuccessStatus; @@ -39,8 +41,8 @@ public class SuggestionController { " - `storeName` (String): 희망 가게 이름\n" + " - `suggestionBenefit` (String): 희망 혜택\n") @PostMapping - public BaseResponse writeSuggestion( - @RequestBody SuggestionRequestDTO.WriteSuggestionRequestDTO suggestionRequestDTO, + public BaseResponse writeSuggestion( + @RequestBody WriteSuggestionRequestDTO suggestionRequestDTO, @AuthenticationPrincipal PrincipalDetails pd ){ return BaseResponse.onSuccess(SuccessStatus._OK, suggestionService.writeSuggestion(suggestionRequestDTO, pd.getId())); @@ -59,7 +61,7 @@ public BaseResponse writeSugge " - `majorId` (Long): 학부/학과 학생회 ID\n" + " - `majorName` (String): 학부/학과 학생회 이름\n") @GetMapping("/admin") - public BaseResponse getSuggestionAdmins( + public BaseResponse getSuggestionAdmins( @AuthenticationPrincipal PrincipalDetails pd ) { return BaseResponse.onSuccess(SuccessStatus._OK, suggestionService.getSuggestionAdmins(pd.getId())); @@ -80,7 +82,7 @@ public BaseResponse getSuggestionA " - `studentMajor` (Long): 건의자의 학부/학과\n" + " - `enrollmentStatus` (EnrollmentStatus): 재학 상태\n") @GetMapping("/list") - public BaseResponse> getSuggestions( + public BaseResponse> getSuggestions( @AuthenticationPrincipal PrincipalDetails pd ) { return BaseResponse.onSuccess(SuccessStatus._OK, suggestionService.getSuggestions(pd.getId())); 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 deleted file mode 100644 index f5ca5912..00000000 --- a/src/main/java/com/assu/server/domain/suggestion/converter/SuggestionConverter.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.assu.server.domain.suggestion.converter; - -import com.assu.server.domain.admin.entity.Admin; -import com.assu.server.domain.auth.entity.SSUAuth; -import com.assu.server.domain.auth.exception.CustomAuthException; -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; -import com.assu.server.domain.user.entity.Student; -import com.assu.server.global.apiPayload.code.status.ErrorStatus; - -import java.util.List; -import java.util.stream.Collectors; - -public class SuggestionConverter { - - public static SuggestionResponseDTO.WriteSuggestionResponseDTO writeSuggestionResultDTO(Suggestion suggestion){ - return SuggestionResponseDTO.WriteSuggestionResponseDTO.builder() - .suggestionId(suggestion.getId()) - .userId(suggestion.getStudent().getId()) - .adminId(suggestion.getAdmin().getId()) - .storeName(suggestion.getStoreName()) - .suggestionBenefit(suggestion.getContent()) - .build(); - } - - public static Suggestion toSuggestionEntity(SuggestionRequestDTO.WriteSuggestionRequestDTO suggestionRequestDTO, Admin admin, Student student){ - return Suggestion.builder() - .admin(admin) - .student(student) - .storeName(suggestionRequestDTO.getStoreName()) - .content(suggestionRequestDTO.getBenefit()) - .build(); - } - - public static SuggestionResponseDTO.GetSuggestionResponseDTO GetSuggestionResultDTO(Suggestion s){ - - Student student = s.getStudent(); - return SuggestionResponseDTO.GetSuggestionResponseDTO.builder() - .suggestionId(s.getId()) - .createdAt(s.getCreatedAt()) - .storeName(s.getStoreName()) - .content(s.getContent()) - .enrollmentStatus(student.getEnrollmentStatus()) - .studentMajor(student.getMajor()) - .build(); - } - - public static List toGetSuggestionDTOList(List list) { - return list.stream() - .map(SuggestionConverter::GetSuggestionResultDTO) - .collect(Collectors.toList()); - } - - 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/dto/GetSuggestionAdminsDTO.java b/src/main/java/com/assu/server/domain/suggestion/dto/GetSuggestionAdminsDTO.java new file mode 100644 index 00000000..95250fae --- /dev/null +++ b/src/main/java/com/assu/server/domain/suggestion/dto/GetSuggestionAdminsDTO.java @@ -0,0 +1,35 @@ +package com.assu.server.domain.suggestion.dto; + +import com.assu.server.domain.admin.entity.Admin; +import io.swagger.v3.oas.annotations.media.Schema; + +public record GetSuggestionAdminsDTO( + @Schema(description = "총학생회 ID", example = "1") + Long adminId, + + @Schema(description = "총학생회 이름", example = "숭실대학교 총학생회") + String adminName, + + @Schema(description = "단과대학 학생회 ID", example = "2") + Long departId, + + @Schema(description = "단과대학 학생회 이름", example = "IT대학 학생회") + String departName, + + @Schema(description = "학부/학과 학생회 ID", example = "3") + Long majorId, + + @Schema(description = "학부/학과 학생회 이름", example = "컴퓨터학부 학생회") + String majorName +) { + public static GetSuggestionAdminsDTO of(Admin universityAdmin, Admin departmentAdmin, Admin majorAdmin) { + return new GetSuggestionAdminsDTO( + universityAdmin != null ? universityAdmin.getId() : null, + universityAdmin != null ? universityAdmin.getName() : null, + departmentAdmin != null ? departmentAdmin.getId() : null, + departmentAdmin != null ? departmentAdmin.getName() : null, + majorAdmin != null ? majorAdmin.getId() : null, + majorAdmin != null ? majorAdmin.getName() : null + ); + } +} diff --git a/src/main/java/com/assu/server/domain/suggestion/dto/GetSuggestionResponseDTO.java b/src/main/java/com/assu/server/domain/suggestion/dto/GetSuggestionResponseDTO.java new file mode 100644 index 00000000..9f798306 --- /dev/null +++ b/src/main/java/com/assu/server/domain/suggestion/dto/GetSuggestionResponseDTO.java @@ -0,0 +1,40 @@ +package com.assu.server.domain.suggestion.dto; + +import com.assu.server.domain.suggestion.entity.Suggestion; +import com.assu.server.domain.user.entity.enums.EnrollmentStatus; +import com.assu.server.domain.user.entity.enums.Major; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +import java.time.LocalDateTime; + +public record GetSuggestionResponseDTO( + @Schema(description = "건의 ID", example = "1") + @NotNull Long suggestionId, + + @Schema(description = "건의 작성일", example = "2026-01-04T12:00:00") + @NotNull LocalDateTime createdAt, + + @Schema(description = "희망 가게 이름", example = "스타벅스 숭실대점") + @NotNull String storeName, + + @Schema(description = "건의 내용", example = "아메리카노 10% 할인") + @NotNull String content, + + @Schema(description = "건의자의 학부/학과", example = "COM") + @NotNull Major studentMajor, + + @Schema(description = "재학 상태", example = "ENROLLED") + @NotNull EnrollmentStatus enrollmentStatus +) { + public static GetSuggestionResponseDTO of(Suggestion s) { + return new GetSuggestionResponseDTO( + s.getId(), + s.getCreatedAt(), + s.getStoreName(), + s.getContent(), + s.getStudent().getMajor(), + s.getStudent().getEnrollmentStatus() + ); + } +} diff --git a/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionRequestDTO.java b/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionRequestDTO.java deleted file mode 100644 index f3890f8e..00000000 --- a/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionRequestDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.assu.server.domain.suggestion.dto; - -import lombok.Getter; - -public class SuggestionRequestDTO { - - @Getter - public static class WriteSuggestionRequestDTO{ - private Long adminId; - private String storeName; - private String benefit; - } -} 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 deleted file mode 100644 index 299cc9d8..00000000 --- a/src/main/java/com/assu/server/domain/suggestion/dto/SuggestionResponseDTO.java +++ /dev/null @@ -1,51 +0,0 @@ - package com.assu.server.domain.suggestion.dto; - - import com.assu.server.domain.user.entity.enums.EnrollmentStatus; - import com.assu.server.domain.user.entity.enums.Major; - import lombok.AllArgsConstructor; - import lombok.Builder; - import lombok.Getter; - import lombok.NoArgsConstructor; - - import java.time.LocalDateTime; - - public class SuggestionResponseDTO { - - @Getter - @NoArgsConstructor - @AllArgsConstructor - @Builder - public static class WriteSuggestionResponseDTO { - private Long suggestionId; - private Long userId; - private Long adminId; - private String storeName; - private String suggestionBenefit; - } - - @Getter - @NoArgsConstructor - @AllArgsConstructor - @Builder - public static class GetSuggestionResponseDTO { - private Long suggestionId; - private LocalDateTime createdAt; - private String storeName; - private String content; - private Major studentMajor; - 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/dto/WriteSuggestionRequestDTO.java b/src/main/java/com/assu/server/domain/suggestion/dto/WriteSuggestionRequestDTO.java new file mode 100644 index 00000000..8ab7ae66 --- /dev/null +++ b/src/main/java/com/assu/server/domain/suggestion/dto/WriteSuggestionRequestDTO.java @@ -0,0 +1,27 @@ +package com.assu.server.domain.suggestion.dto; + +import com.assu.server.domain.admin.entity.Admin; +import com.assu.server.domain.suggestion.entity.Suggestion; +import com.assu.server.domain.user.entity.Student; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record WriteSuggestionRequestDTO( + @Schema(description = "건의 대상 관리자 ID", example = "1") + @NotNull Long adminId, + + @Schema(description = "희망 가게 이름", example = "스타벅스 숭실대점") + @NotNull String storeName, + + @Schema(description = "희망 혜택", example = "아메리카노 10% 할인") + @NotNull String benefit +) { + public Suggestion toEntity(Admin admin, Student student) { + return Suggestion.builder() + .admin(admin) + .student(student) + .storeName(storeName()) + .content(benefit()) + .build(); + } +} diff --git a/src/main/java/com/assu/server/domain/suggestion/dto/WriteSuggestionResponseDTO.java b/src/main/java/com/assu/server/domain/suggestion/dto/WriteSuggestionResponseDTO.java new file mode 100644 index 00000000..ecbe69b8 --- /dev/null +++ b/src/main/java/com/assu/server/domain/suggestion/dto/WriteSuggestionResponseDTO.java @@ -0,0 +1,32 @@ +package com.assu.server.domain.suggestion.dto; + +import com.assu.server.domain.suggestion.entity.Suggestion; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; + +public record WriteSuggestionResponseDTO( + @Schema(description = "건의 ID", example = "1") + @NotNull Long suggestionId, + + @Schema(description = "제안인 ID", example = "10") + @NotNull Long userId, + + @Schema(description = "건의 대상 관리자 ID", example = "1") + @NotNull Long adminId, + + @Schema(description = "희망 가게 이름", example = "스타벅스 숭실대점") + @NotNull String storeName, + + @Schema(description = "희망 혜택", example = "아메리카노 10% 할인") + @NotNull String suggestionBenefit +) { + public static WriteSuggestionResponseDTO of(Suggestion suggestion) { + return new WriteSuggestionResponseDTO( + suggestion.getId(), + suggestion.getStudent().getId(), + suggestion.getAdmin().getId(), + suggestion.getStoreName(), + suggestion.getContent() + ); + } +} 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 d5b9365b..b7cd52d3 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,19 +1,21 @@ package com.assu.server.domain.suggestion.service; -import com.assu.server.domain.suggestion.dto.SuggestionRequestDTO; -import com.assu.server.domain.suggestion.dto.SuggestionResponseDTO; +import com.assu.server.domain.suggestion.dto.GetSuggestionAdminsDTO; +import com.assu.server.domain.suggestion.dto.GetSuggestionResponseDTO; +import com.assu.server.domain.suggestion.dto.WriteSuggestionRequestDTO; +import com.assu.server.domain.suggestion.dto.WriteSuggestionResponseDTO; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; public interface SuggestionService { - SuggestionResponseDTO.WriteSuggestionResponseDTO writeSuggestion( - @RequestBody SuggestionRequestDTO.WriteSuggestionRequestDTO request, + WriteSuggestionResponseDTO writeSuggestion( + @RequestBody WriteSuggestionRequestDTO request, Long userId ); - List getSuggestions(Long adminId); + List getSuggestions(Long adminId); - SuggestionResponseDTO.GetSuggestionAdminsDTO getSuggestionAdmins(Long userId); + 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 8f1896e8..466cb1a4 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,15 +2,16 @@ import com.assu.server.domain.admin.entity.Admin; import com.assu.server.domain.admin.repository.AdminRepository; +import com.assu.server.domain.common.entity.enums.ReportedStatus; 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; +import com.assu.server.domain.suggestion.dto.GetSuggestionAdminsDTO; +import com.assu.server.domain.suggestion.dto.GetSuggestionResponseDTO; +import com.assu.server.domain.suggestion.dto.WriteSuggestionRequestDTO; +import com.assu.server.domain.suggestion.dto.WriteSuggestionResponseDTO; import com.assu.server.domain.suggestion.entity.Suggestion; import com.assu.server.domain.suggestion.repository.SuggestionRepository; import com.assu.server.domain.user.entity.Student; import com.assu.server.domain.user.repository.StudentRepository; -import com.assu.server.domain.common.entity.enums.ReportedStatus; import com.assu.server.global.apiPayload.code.status.ErrorStatus; import com.assu.server.global.exception.DatabaseException; import jakarta.transaction.Transactional; @@ -30,32 +31,32 @@ public class SuggestionServiceImpl implements SuggestionService { @Override @Transactional - public SuggestionResponseDTO.WriteSuggestionResponseDTO writeSuggestion(SuggestionRequestDTO.WriteSuggestionRequestDTO request, Long userId) { + public WriteSuggestionResponseDTO writeSuggestion(WriteSuggestionRequestDTO request, Long userId) { - Admin admin = adminRepository.findById(request.getAdminId()) + Admin admin = adminRepository.findById(request.adminId()) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_ADMIN)); Student student = studentRepository.findById(userId) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_STUDENT)); - Suggestion suggestion = SuggestionConverter.toSuggestionEntity(request, admin, student); + Suggestion suggestion = request.toEntity(admin, student); suggestionRepository.save(suggestion); notificationCommandService.sendPartnerSuggestion(suggestion.getAdmin().getId(), suggestion.getId()); - return SuggestionConverter.writeSuggestionResultDTO(suggestion); + return WriteSuggestionResponseDTO.of(suggestion); } @Override - public List getSuggestions(Long adminId) { + public List getSuggestions(Long adminId) { // 신고되지 않은 건의글과 신고되지 않은 학생이 작성한 건의글만 조회 List list = suggestionRepository .findAllSuggestionsWithStatus(adminId, ReportedStatus.NORMAL, ReportedStatus.NORMAL); - return SuggestionConverter.toGetSuggestionDTOList(list); + return list.stream().map(GetSuggestionResponseDTO::of).toList(); } @Override - public SuggestionResponseDTO.GetSuggestionAdminsDTO getSuggestionAdmins(Long userId) { + public GetSuggestionAdminsDTO getSuggestionAdmins(Long userId) { Student student = studentRepository.findById(userId) .orElseThrow(() -> new DatabaseException(ErrorStatus.NO_SUCH_STUDENT)); @@ -82,6 +83,6 @@ else if (admin.getDepartment() != null) { } } - return SuggestionConverter.toGetSuggestionAdmins(universityAdmin, departmentAdmin, majorAdmin); + return GetSuggestionAdminsDTO.of(universityAdmin, departmentAdmin, majorAdmin); } } From 6a60758119484bc447140da78e9d1a6195179743 Mon Sep 17 00:00:00 2001 From: SJ Hwang Date: Mon, 23 Feb 2026 21:33:56 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[Refactor/#233]=20-=20=EC=BF=BC=EB=A6=AC=20?= =?UTF-8?q?=EB=B3=B4=EA=B0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/repository/AdminRepository.java | 2 -- .../domain/map/service/MapServiceImpl.java | 2 +- .../controller/PartnershipController.java | 16 ++++++---- .../partnership/entity/PaperContent.java | 2 ++ .../repository/PaperContentRepository.java | 32 ++++++++++++------- .../repository/PaperRepository.java | 16 ++-------- .../service/PartnershipService.java | 6 ++-- .../service/PartnershipServiceImpl.java | 30 ++++++++--------- .../store/repository/StoreRepository.java | 10 ------ 9 files changed, 54 insertions(+), 62 deletions(-) diff --git a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java index 73472f57..03dd8e75 100644 --- a/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java +++ b/src/main/java/com/assu/server/domain/admin/repository/AdminRepository.java @@ -28,8 +28,6 @@ List findMatchingAdmins(@Param("university") University university, @Param("department") Department department, @Param("major") Major major); - Optional findByName(String name); - // 후보 수 카운트: 해당 partner와 ACTIVE 제휴가 없는 admin 수 @Query(value = """ SELECT COUNT(*) diff --git a/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java b/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java index 143c1dc1..7d2a2599 100644 --- a/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java +++ b/src/main/java/com/assu/server/domain/map/service/MapServiceImpl.java @@ -229,7 +229,7 @@ public List searchStores(String keyword) { List storeIds = stores.stream().map(Store::getId).toList(); // 매장당 최신 Paper 1건 (admin 정보용) - List papers = paperRepository.findByStoreIdIn(storeIds); + List papers = paperRepository.findByStoreIdIn(storeIds, ActivationStatus.ACTIVE); Map storeIdToPaper = papers.stream() .collect(Collectors.toMap(p -> p.getStore().getId(), p -> p, (p1, p2) -> p1.getId() > p2.getId() ? p1 : p2)); 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 47e71d76..50e18975 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 @@ -11,6 +11,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.data.web.PageableDefault; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -313,11 +317,11 @@ public BaseResponse deletePartnership( " - `goodsId` (Long): 서비스 제공 항목 ID\n" + " - `goodsName` (String): 서비스 제공 항목명\n") @GetMapping("/admin") - public BaseResponse> listForAdmin( - @RequestParam(name = "all", defaultValue = "false") boolean all, + public BaseResponse> listForAdmin( + @PageableDefault(size = 10, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable, @AuthenticationPrincipal PrincipalDetails pd ) { - return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForAdmin(all, pd.getId())); + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForAdmin(pageable, pd.getId())); } @Operation( @@ -351,11 +355,11 @@ public BaseResponse> listForAdmin( " - `goodsId` (Long): 서비스 제공 항목 ID\n" + " - `goodsName` (String): 서비스 제공 항목명\n") @GetMapping("/partner") - public BaseResponse> listForPartner( - @RequestParam(name = "all", defaultValue = "false") boolean all, + public BaseResponse> listForPartner( + @PageableDefault(size = 10, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable, @AuthenticationPrincipal PrincipalDetails pd ) { - return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForPartner(all, pd.getId())); + return BaseResponse.onSuccess(SuccessStatus._OK, partnershipService.listPartnershipsForPartner(pageable, pd.getId())); } @Operation( diff --git a/src/main/java/com/assu/server/domain/partnership/entity/PaperContent.java b/src/main/java/com/assu/server/domain/partnership/entity/PaperContent.java index dea6f3b7..11d9ea4c 100644 --- a/src/main/java/com/assu/server/domain/partnership/entity/PaperContent.java +++ b/src/main/java/com/assu/server/domain/partnership/entity/PaperContent.java @@ -8,6 +8,7 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.BatchSize; import java.util.ArrayList; import java.util.List; @@ -47,6 +48,7 @@ public class PaperContent extends BaseEntity { private Long discount; + @BatchSize(size = 100) @OneToMany(mappedBy = "content", cascade = CascadeType.ALL, orphanRemoval = true) private List goods = new ArrayList<>(); diff --git a/src/main/java/com/assu/server/domain/partnership/repository/PaperContentRepository.java b/src/main/java/com/assu/server/domain/partnership/repository/PaperContentRepository.java index d12262ff..1aa7701e 100644 --- a/src/main/java/com/assu/server/domain/partnership/repository/PaperContentRepository.java +++ b/src/main/java/com/assu/server/domain/partnership/repository/PaperContentRepository.java @@ -1,6 +1,8 @@ package com.assu.server.domain.partnership.repository; import com.assu.server.domain.partnership.entity.PaperContent; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -16,17 +18,9 @@ public interface PaperContentRepository extends JpaRepository findAllByPaperIdInFetchGoods(@Param("paperIds") List paperIds); - - @Query(""" - select distinct pc - from PaperContent pc - left join fetch pc.goods g - where pc.paper.id in :paperIds - """) - List findAllByOnePaperIdInFetchGoods(@Param("paperIds") Long paperIds); + List findAllByOnePaperIdInFetchGoods(@Param("paperId") Long paperId); Optional findById(Long id); @@ -35,11 +29,27 @@ public interface PaperContentRepository extends JpaRepository findTopByStoreIdIn(@Param("storeIds") List storeIds); + @Query(value = """ + select pc + from PaperContent pc + join pc.paper p + where p.id in :paperIds + """, + countQuery = """ + select count(pc) + from PaperContent pc + join pc.paper p + where p.id in :paperIds + """) + Page findAllByPaperIdIn(@Param("paperIds") List paperIds, Pageable pageable); + @Query(value = """ WITH ranked AS ( SELECT pc.*, 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 15e28921..493b3459 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 @@ -82,22 +82,10 @@ List findByAdminIdInAndPartnerIdAndIsActivated( @Query(""" SELECT p FROM Paper p WHERE p.store.id IN :storeIds + AND p.isActivated = :status ORDER BY p.id DESC """) - List findByStoreIdIn(@Param("storeIds") List storeIds); - - // PaperRepository.java에 추가 - @Query(""" - SELECT p - FROM Paper p - LEFT JOIN FETCH p.admin a - WHERE p.store.id IN :storeIds - AND p.isActivated = com.assu.server.domain.common.enums.ActivationStatus.ACTIVE - AND p.partnershipPeriodStart <= CURRENT_DATE - AND p.partnershipPeriodEnd >= CURRENT_DATE - ORDER BY p.id DESC -""") - List findLatestPapersByStoreIds(@Param("storeIds") List storeIds); + List findByStoreIdIn(@Param("storeIds") List storeIds, @Param("status") ActivationStatus status); @Modifying @Query(""" 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 23de8149..b1a1dcdf 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 @@ -2,6 +2,8 @@ import com.assu.server.domain.member.entity.Member; import com.assu.server.domain.partnership.dto.*; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -12,8 +14,8 @@ public interface PartnershipService { void recordPartnershipUsage(PartnershipFinalRequestDTO dto, Member member); - List listPartnershipsForAdmin(boolean all, Long partnerId); - List listPartnershipsForPartner(boolean all, Long adminId); + Page listPartnershipsForAdmin(Pageable pageable, Long adminId); + Page listPartnershipsForPartner(Pageable pageable, Long partnerId); PartnershipDetailResponseDTO getPartnership(Long partnershipId); List getSuspendedPapers(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 ee152767..c27a2629 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 @@ -29,7 +29,9 @@ import com.assu.server.global.exception.GeneralException; import com.assu.server.infra.s3.AmazonS3Manager; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -151,32 +153,28 @@ public WritePartnershipResponseDTO updatePartnership( @Override @Transactional(readOnly = true) - public List listPartnershipsForAdmin(boolean all, Long adminId) { - Sort sort = Sort.by(Sort.Direction.DESC, "createdAt"); - List papers = all - ? paperRepository.findByAdmin_IdAndIsActivated(adminId, ActivationStatus.ACTIVE, sort) - : paperRepository.findByAdmin_IdAndIsActivated(adminId, ActivationStatus.ACTIVE, PageRequest.of(0, 2, sort)).getContent(); + public Page listPartnershipsForAdmin(Pageable pageable, Long adminId) { + Page paperPage = paperRepository.findByAdmin_IdAndIsActivated(adminId, ActivationStatus.ACTIVE, pageable); - papers = papers.stream() + List papers = paperPage.getContent().stream() .filter(p -> p.getStore() != null) .toList(); - return buildPartnershipDTOs(papers); + List dtos = buildPartnershipDTOs(papers); + return new PageImpl<>(dtos, pageable, paperPage.getTotalElements()); } @Override @Transactional(readOnly = true) - public List listPartnershipsForPartner(boolean all, Long partnerId) { - Sort sort = Sort.by(Sort.Direction.DESC, "createdAt"); - List papers = all - ? paperRepository.findByPartner_IdAndIsActivated(partnerId, ActivationStatus.ACTIVE, sort) - : paperRepository.findByPartner_IdAndIsActivated(partnerId, ActivationStatus.ACTIVE, PageRequest.of(0, 2, sort)).getContent(); + public Page listPartnershipsForPartner(Pageable pageable, Long partnerId) { + Page paperPage = paperRepository.findByPartner_IdAndIsActivated(partnerId, ActivationStatus.ACTIVE, pageable); - papers = papers.stream() + List papers = paperPage.getContent().stream() .filter(p -> p.getAdmin() != null) .toList(); - return buildPartnershipDTOs(papers); + List dtos = buildPartnershipDTOs(papers); + return new PageImpl<>(dtos, pageable, paperPage.getTotalElements()); } @Override @@ -461,7 +459,7 @@ private List buildPartnershipDTOs(List paper if (papers == null || papers.isEmpty()) return List.of(); List paperIds = papers.stream().map(Paper::getId).toList(); - List allContents = paperContentRepository.findAllByPaperIdInFetchGoods(paperIds); + List allContents = paperContentRepository.findAllByPaperIdIn(paperIds, Pageable.unpaged()).getContent(); Map> byPaperId = allContents.stream() .collect(Collectors.groupingBy(pc -> pc.getPaper().getId())); diff --git a/src/main/java/com/assu/server/domain/store/repository/StoreRepository.java b/src/main/java/com/assu/server/domain/store/repository/StoreRepository.java index a0789d8b..28ea7caa 100644 --- a/src/main/java/com/assu/server/domain/store/repository/StoreRepository.java +++ b/src/main/java/com/assu/server/domain/store/repository/StoreRepository.java @@ -105,14 +105,6 @@ Optional findBySameAddress( @Param("detail") String detail ); - @Query(value = """ - SELECT s.* - FROM store s - WHERE s.point IS NOT NULL - AND ST_Contains(ST_GeomFromText(:wkt, 4326), s.point) - """, nativeQuery = true) - List findAllWithinViewport(@Param("wkt") String wkt); - @Query(""" SELECT DISTINCT s FROM Store s @@ -123,8 +115,6 @@ AND function('ST_Contains', function('ST_GeomFromText', :wkt, 4326), s.point) = """) List findAllWithinViewportWithPartner(@Param("wkt") String wkt); - List findByNameContainingIgnoreCaseOrderByIdDesc(String name); - @Query(""" SELECT DISTINCT s FROM Store s