diff --git a/src/main/java/com/assu/server/domain/admin/controller/AdminController.java b/src/main/java/com/assu/server/domain/admin/controller/AdminController.java index 0ea470cd..3ed0baaa 100644 --- a/src/main/java/com/assu/server/domain/admin/controller/AdminController.java +++ b/src/main/java/com/assu/server/domain/admin/controller/AdminController.java @@ -6,6 +6,7 @@ import com.assu.server.global.apiPayload.code.status.SuccessStatus; import com.assu.server.global.util.PrincipalDetails; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; @@ -15,18 +16,21 @@ @RestController @RequestMapping("/admin") @RequiredArgsConstructor +@Tag(name = "관리자 관련 API", description = "어드민 및 시스템 추천 관련 API") public class AdminController { private final AdminService adminService; @Operation( summary = "파트너 추천 API", - description = "제휴하지 않은 파트너 중 한 곳을 랜덤으로 조회합니다." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/2591197c19ed80f5b05cffcfecef9c24)\n" + + "- 아직 제휴를 맺지 않은 파트너 중 한 곳을 랜덤으로 추천합니다.\n" + + "- **Authentication**: 헤더에 JWT 토큰 필요 (Admin 권한)" ) @GetMapping("/partner-recommend") public BaseResponse randomPartnerRecommend( @AuthenticationPrincipal PrincipalDetails pd - ) { + ) { return BaseResponse.onSuccess(SuccessStatus._OK, adminService.suggestRandomPartner(pd.getId())); } -} +} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/admin/entity/Admin.java b/src/main/java/com/assu/server/domain/admin/entity/Admin.java index 875e5265..6e761a88 100644 --- a/src/main/java/com/assu/server/domain/admin/entity/Admin.java +++ b/src/main/java/com/assu/server/domain/admin/entity/Admin.java @@ -1,18 +1,9 @@ package com.assu.server.domain.admin.entity; - +import com.assu.server.domain.member.entity.Member; import com.assu.server.domain.user.entity.enums.Department; import com.assu.server.domain.user.entity.enums.Major; -import com.assu.server.domain.member.entity.Member; import com.assu.server.domain.user.entity.enums.University; - -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.MapsId; -import jakarta.persistence.OneToOne; -import jakarta.persistence.Id; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; import lombok.*; @@ -36,37 +27,58 @@ public class Admin { @OneToOne @MapsId @JoinColumn(name = "id") + @NotNull private Member member; + @NotNull + @Column(nullable = false) private String name; + @NotNull + @Column(nullable = false) private String officeAddress; private String detailAddress; private String signUrl; - private Boolean isSignVerified; + @NotNull + @Builder.Default + @Column(nullable = false) + private Boolean isSignVerified = false; private LocalDateTime signVerifiedAt; @Enumerated(EnumType.STRING) + @NotNull + @Column(nullable = false) private Major major; @Enumerated(EnumType.STRING) + @NotNull + @Column(nullable = false) private Department department; @Enumerated(EnumType.STRING) @NotNull + @Column(nullable = false) private University university; @JdbcTypeCode(SqlTypes.GEOMETRY) private Point point; - private double latitude; - private double longitude; + @NotNull + @Column(nullable = false) + private Double latitude; + + @NotNull + @Column(nullable = false) + private Double longitude; public void setMember(Member member) { this.member = member; + if (member != null && member.getId() != null) { + this.id = member.getId(); + } } -} +} \ No newline at end of file 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 32da6ff1..afd7777a 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 @@ -8,7 +8,6 @@ import com.assu.server.domain.user.entity.enums.Major; import com.assu.server.domain.user.entity.enums.University; -// PaperQueryServiceImpl 이 AdminService 참조 중 -> 순환참조 문제 발생하지 않도록 주의 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 cfcdb411..4ebd93a7 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,40 +1,38 @@ 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 jakarta.transaction.Transactional; -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 java.util.concurrent.ThreadLocalRandom; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; @Service @RequiredArgsConstructor +@Transactional public class AdminServiceImpl implements AdminService { private final AdminRepository adminRepository; private final PartnerRepository partnerRepository; - @Override - @Transactional - public List findMatchingAdmins(University university, Department department, Major major){ + @Override + @Transactional(readOnly = true) + public List findMatchingAdmins(University university, Department department, Major major) { + return adminRepository.findMatchingAdmins(university, department, major); + } - List adminList = adminRepository.findMatchingAdmins(university, department,major); - - return adminList; - } @Override - @Transactional + @Transactional(readOnly = true) public AdminResponseDTO.RandomPartnerResponseDTO suggestRandomPartner(Long adminId) { Admin admin = adminRepository.findById(adminId) @@ -45,10 +43,10 @@ public AdminResponseDTO.RandomPartnerResponseDTO suggestRandomPartner(Long admin throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER); } - int offset = ThreadLocalRandom.current().nextInt((int)total); + int offset = ThreadLocalRandom.current().nextInt((int) total); Partner picked = partnerRepository.findUnpartneredActiveByAdminWithOffset(admin.getId(), offset); - if(picked == null) { + if (picked == null) { throw new DatabaseException(ErrorStatus.NO_AVAILABLE_PARTNER); } @@ -61,5 +59,4 @@ public AdminResponseDTO.RandomPartnerResponseDTO suggestRandomPartner(Long admin .partnerPhone(picked.getMember().getPhoneNum()) .build(); } - -} +} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/mapping/controller/StudentAdminController.java b/src/main/java/com/assu/server/domain/mapping/controller/StudentAdminController.java index 9487feb1..d35d7fdd 100644 --- a/src/main/java/com/assu/server/domain/mapping/controller/StudentAdminController.java +++ b/src/main/java/com/assu/server/domain/mapping/controller/StudentAdminController.java @@ -6,6 +6,7 @@ import com.assu.server.global.apiPayload.code.status.SuccessStatus; import com.assu.server.global.util.PrincipalDetails; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.GetMapping; @@ -15,21 +16,27 @@ @RestController @RequiredArgsConstructor @RequestMapping("/admin/dashBoard") +@Tag(name = "관리자 대시보드 API", description = "어드민 전용 통계 및 대시보드 데이터 조회 API") public class StudentAdminController { + private final StudentAdminService studentAdminService; + @Operation( summary = "누적 가입자 수 조회 API", - description = "admin으로 접근해주세요." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/_-24c1197c19ed8062be94fc08619b760f)\n" + + "- 관리자(Admin) 권한으로 접근하여 현재까지의 총 누적 가입자 수를 조회합니다." ) @GetMapping public BaseResponse getCountAdmin( @AuthenticationPrincipal PrincipalDetails pd - ) { + ) { return BaseResponse.onSuccess(SuccessStatus._OK, studentAdminService.getCountAdminAuth(pd.getId())); } + @Operation( summary = "신규 한 달 가입자 수 조회 API", - description = "admin으로 접근해주세요." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/_-24c1197c19ed805db80fca98c38849d1)\n" + + "- 이번 달(매달 1일 초기화) 기준 신규 가입한 사용자 수를 조회합니다." ) @GetMapping("/new") public BaseResponse getNewStudentCountAdmin( @@ -40,7 +47,8 @@ public BaseResponse getNewStud @Operation( summary = "오늘 제휴 사용자 수 조회 API", - description = "admin으로 접근해주세요." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/_-24e1197c19ed80a283b1c336a1c3df72)\n" + + "- 금일 제휴 서비스를 이용한 총 사용자 수를 조회합니다." ) @GetMapping("/countUser") public BaseResponse getCountUser( @@ -48,29 +56,28 @@ public BaseResponse getCoun ){ return BaseResponse.onSuccess(SuccessStatus._OK, studentAdminService.getCountUsagePerson(pd.getId())); } + @Operation( summary = "제휴업체 누적별 1위 업체 조회 API", - description = "adminId로 접근해주세요." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/_1-2ef1197c19ed8010a49ce6313d137b4f)\n" + + "- 제휴 이용 횟수가 가장 많은 1위 업체의 정보를 조회합니다." ) - @GetMapping("/top") - public BaseResponse getTopUsage( - @AuthenticationPrincipal PrincipalDetails pd + @GetMapping("/top") + public BaseResponse getTopUsage( + @AuthenticationPrincipal PrincipalDetails pd ) { - return BaseResponse.onSuccess(SuccessStatus._OK, studentAdminService.getCountUsage(pd.getId())); - } - - /** - * 제휴 업체별 누적 제휴 이용 현황 리스트 반환 (사용량 내림차순) - */ - @Operation( - summary = "제휴업체 누적 사용 수 내림차순 조회 API", - description = "adminId로 접근해주세요." - ) - @GetMapping("/usage") - public BaseResponse getUsageList( - @AuthenticationPrincipal PrincipalDetails pd - ) { - return BaseResponse.onSuccess(SuccessStatus._OK, studentAdminService.getCountUsageList(pd.getId())); - } + return BaseResponse.onSuccess(SuccessStatus._OK, studentAdminService.getCountUsage(pd.getId())); + } -} + @Operation( + summary = "제휴업체 누적 사용 수 내림차순 조회 API", + description = "# [v1.0 (2025-09-02)](https://www.notion.so/_-24e1197c19ed802b92eff5d4dc4dbe82)\n" + + "- 모든 제휴 업체의 누적 사용 현황을 사용량 내림차순 리스트로 반환합니다." + ) + @GetMapping("/usage") + public BaseResponse getUsageList( + @AuthenticationPrincipal PrincipalDetails pd + ) { + return BaseResponse.onSuccess(SuccessStatus._OK, studentAdminService.getCountUsageList(pd.getId())); + } +} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/mapping/repository/StudentAdminRepository.java b/src/main/java/com/assu/server/domain/mapping/repository/StudentAdminRepository.java index bac1def6..0f0db4cf 100644 --- a/src/main/java/com/assu/server/domain/mapping/repository/StudentAdminRepository.java +++ b/src/main/java/com/assu/server/domain/mapping/repository/StudentAdminRepository.java @@ -13,7 +13,6 @@ public interface StudentAdminRepository extends JpaRepository { - // 총 누적 가입자 수 @Query(""" select count(sa) from StudentAdmin sa @@ -21,7 +20,6 @@ select count(sa) """) Long countAllByAdminId(@Param("adminId") Long adminId); - // 기간별 가입자 수 @Query(""" select count(sa) from StudentAdmin sa @@ -33,14 +31,12 @@ Long countByAdminIdBetween(@Param("adminId") Long adminId, @Param("from") LocalDateTime from, @Param("to") LocalDateTime to); - // 이번 달 신규 가입자 수 default Long countThisMonthByAdminId(Long adminId) { LocalDateTime from = YearMonth.now().atDay(1).atStartOfDay(); LocalDateTime to = LocalDateTime.now(); return countByAdminIdBetween(adminId, from, to); } - // 오늘 제휴 사용 고유 사용자 수 @Query(value = """ SELECT COUNT(DISTINCT pu.student_id) FROM partnership_usage pu @@ -69,7 +65,6 @@ SELECT COUNT(DISTINCT pu.student_id) """, nativeQuery = true) List findUsageByStoreWithPaper(@Param("adminId") Long adminId); - // 0건 포함 조회 (대시보드에서 모든 제휴 업체를 보여줘야 하는 경우) @Query(value = """ SELECT p.id AS paperId, @@ -87,7 +82,7 @@ SELECT COUNT(DISTINCT pu.student_id) List findUsageByStoreIncludingZero(@Param("adminId") Long adminId); interface StoreUsageWithPaper { - Long getPaperId(); // 🆕 추가: Paper ID + Long getPaperId(); Long getStoreId(); String getStoreName(); Long getUsageCount(); diff --git a/src/main/java/com/assu/server/domain/partner/controller/PartnerController.java b/src/main/java/com/assu/server/domain/partner/controller/PartnerController.java index cfd7e55f..03cb7258 100644 --- a/src/main/java/com/assu/server/domain/partner/controller/PartnerController.java +++ b/src/main/java/com/assu/server/domain/partner/controller/PartnerController.java @@ -6,6 +6,7 @@ import com.assu.server.global.apiPayload.code.status.SuccessStatus; import com.assu.server.global.util.PrincipalDetails; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; @@ -13,18 +14,21 @@ @RestController @RequestMapping("/partner") @RequiredArgsConstructor +@Tag(name = "파트너 관련 API", description = "파트너 전용 기능 및 추천 관련 API") public class PartnerController { private final PartnerService partnerService; @Operation( summary = "어드민 추천 API", - description = "제휴하지 않은 어드민 중 두 곳을 랜덤으로 조회합니다." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/2591197c19ed80368a9edf1f6e92ea38)\n" + + "- 아직 제휴를 맺지 않은 어드민(학교/단체) 중 두 곳을 랜덤으로 조회합니다.\n" + + "- **Authentication**: 헤더에 JWT 토큰 필요 (Partner 권한)" ) @GetMapping("/admin-recommend") public BaseResponse randomAdminRecommend( @AuthenticationPrincipal PrincipalDetails pd - ){ + ){ return BaseResponse.onSuccess(SuccessStatus._OK, partnerService.getRandomAdmin(pd.getId())); } -} +} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java b/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java index df9aa420..142fb12c 100644 --- a/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java +++ b/src/main/java/com/assu/server/domain/partner/repository/PartnerRepository.java @@ -1,12 +1,9 @@ package com.assu.server.domain.partner.repository; -import com.assu.server.domain.common.enums.ActivationStatus; import com.assu.server.domain.partner.entity.Partner; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import java.util.List; diff --git a/src/main/java/com/assu/server/domain/review/controller/ReviewController.java b/src/main/java/com/assu/server/domain/review/controller/ReviewController.java index ca5b4fd3..bbb02158 100644 --- a/src/main/java/com/assu/server/domain/review/controller/ReviewController.java +++ b/src/main/java/com/assu/server/domain/review/controller/ReviewController.java @@ -7,6 +7,7 @@ import com.assu.server.global.apiPayload.code.status.SuccessStatus; import com.assu.server.global.util.PrincipalDetails; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; @@ -22,12 +23,15 @@ @RestController @RequiredArgsConstructor @RequestMapping("/reviews") +@Tag(name = "리뷰 관련 API", description = "리뷰 작성, 조회, 삭제 및 통계 관련 API") public class ReviewController { private final ReviewService reviewService; + @Operation( summary = "리뷰 작성 API", - description = "리뷰 내용과 별점, 리뷰 이미지를 입력해주세요." - + description = "# [v1.0 (2025-09-02)](https://www.notion.so/2241197c19ed8176ba4fcb49c0136f93)\n" + + "- 리뷰 내용, 별점, 이미지를 멀티파트로 입력받아 저장합니다.\n" + + "- Authentication: JWT 토큰 필요 (Student 권한)" ) @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public BaseResponse writeReview( @@ -40,7 +44,8 @@ public BaseResponse writeReview( @Operation( summary = "내가 쓴 리뷰 조회 API", - description = "Authorization 후에 사용해주세요." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/22b1197c19ed8057b158c88f6153d073)\n" + + "- 로그인한 학생 사용자가 작성한 리뷰 목록을 페이징하여 조회합니다." ) @GetMapping("/student") public BaseResponse> checkStudent( @@ -50,59 +55,61 @@ public BaseResponse> checkStudent } @Operation( - summary = "내 가게 리뷰 조회 API", - description = "Authorization 후에 사용해주세요." + summary = "내 가게 리뷰 조회 API", + description = "# [v1.0 (2025-09-02)](https://www.notion.so/_-2241197c19ed8130b89ad5a77f3e8b2c)\n" + + "- 로그인한 파트너 계정의 가게에 달린 리뷰 목록을 페이징하여 조회합니다." ) @GetMapping("/partner") public BaseResponse> checkPartnerReview( - @AuthenticationPrincipal PrincipalDetails pd, Pageable pageable + @AuthenticationPrincipal PrincipalDetails pd, Pageable pageable ){ return BaseResponse.onSuccess(SuccessStatus._OK, reviewService.checkPartnerReview(pd.getId(), pageable)); } @Operation( - summary = "가게 리뷰 조회 API", - description = "storeId 기반으로 가게 리뷰를 조회하는 API 입니다." + summary = "가게 리뷰 조회 API", + description = "# [v1.0 (2025-09-02)](https://www.notion.so/2681197c19ed80038db3f7dd357623ff)\n" + + "- 특정 storeId를 기반으로 해당 가게의 모든 리뷰를 조회합니다." ) @GetMapping("/store/{storeId}") public BaseResponse> checkStoreReview( - Pageable pageable, @PathVariable Long storeId + Pageable pageable, @PathVariable Long storeId ){ return BaseResponse.onSuccess(SuccessStatus._OK, reviewService.checkStoreReview(storeId, pageable)); } @Operation( summary = "내가 쓴 리뷰 삭제 API", - description = "삭제할 리뷰 ID를 입력해주세요." + description = "# [v1.0 (2025-09-02)](https://www.notion.so/2241197c19ed81a58e93c9ba56f6cb9a)\n" + + "- 본인이 작성한 리뷰를 ID를 기반으로 삭제합니다." ) @DeleteMapping("/{reviewId}") public ResponseEntity> deleteReview( @PathVariable Long reviewId) { - return ResponseEntity.ok(BaseResponse.onSuccess(SuccessStatus._OK, reviewService.deleteReview(reviewId))); } @Operation( - summary = "store 리뷰 평균 조회 API", - description = "storeId 기반으로 조회하는 API 입니다." + summary = "가게 리뷰 평균 조회 API (ID 기반)", + description = "# [v1.0 (2025-09-02)](https://www.notion.so/2ef1197c19ed80a5a08fd4d2aa031e5f)\n" + + "- 특정 storeId 기반으로 해당 가게의 리뷰 평점을 조회합니다." ) @GetMapping("/average/{storeId}") public ResponseEntity> getStandardScore( - @PathVariable Long storeId + @PathVariable Long storeId ){ return ResponseEntity.ok(BaseResponse.onSuccess(SuccessStatus._OK, reviewService.standardScore(storeId))); } @Operation( - summary = "store 리뷰 평균 조회 API", - description = "partner 로그인 시 자신의 가게 평균을 조회하는 api 입니다." + summary = "내 가게 리뷰 평균 조회 API (파트너)", + description = "# [v1.0 (2025-09-02)](https://www.notion.so/API-2681197c19ed80df9f2ac100812c7f44)\n" + + "- 파트너 로그인 시 본인 가게의 평균 평점을 조회합니다." ) @GetMapping("/average") public ResponseEntity> getMyStoreAverage( - @AuthenticationPrincipal PrincipalDetails pd + @AuthenticationPrincipal PrincipalDetails pd ){ return ResponseEntity.ok(BaseResponse.onSuccess(SuccessStatus._OK, reviewService.myStoreAverage(pd.getId()))); } - - -} +} \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/review/converter/ReviewConverter.java b/src/main/java/com/assu/server/domain/review/converter/ReviewConverter.java index 234247de..55fa2c6f 100644 --- a/src/main/java/com/assu/server/domain/review/converter/ReviewConverter.java +++ b/src/main/java/com/assu/server/domain/review/converter/ReviewConverter.java @@ -14,21 +14,17 @@ public class ReviewConverter { public static ReviewResponseDTO.WriteReviewResponseDTO writeReviewResultDTO(Review review){ - //enti -> dto return ReviewResponseDTO.WriteReviewResponseDTO.builder() - .reviewId(review.getId())// 리스폰스 dto로 아이디를 바꿔줄거다. + .reviewId(review.getId()) .rate(review.getRate()) .content(review.getContent()) -// .memberId(review.getStudent().getId()) .createdAt(review.getCreatedAt()) .reviewImageUrls(review.getImageList().stream() .map(ReviewPhoto::getPhotoUrl) .collect(Collectors.toList())) - //한 리뷰 여러개 사진 but 하나로 묶임 추가 고려해보기 --추후에 !! - .build(); //리스폰스 리턴 + .build(); } public static Review toReviewEntity(ReviewRequestDTO.WriteReviewRequestDTO request, Store store, Partner partner, Student student, String affiliation) { - //request return Review.builder() .rate(request.getRate()) .content(request.getContent()) @@ -36,7 +32,6 @@ public static Review toReviewEntity(ReviewRequestDTO.WriteReviewRequestDTO requ .affiliation(affiliation) .partner(partner) .student(student) - // .imageList(request.getReviewImage()) .build(); } public static ReviewResponseDTO.CheckReviewResponseDTO checkReviewResultDTO(Review review){ @@ -53,37 +48,9 @@ public static ReviewResponseDTO.CheckReviewResponseDTO checkReviewResultDTO(Revi .collect(Collectors.toList())) .build(); } - // public static List checkStudentReviewResultDTO(List reviews){ - // return reviews.stream() - // .map(ReviewConverter::checkStudentReviewResultDTO) - // .collect(Collectors.toList()); - // } + public static Page checkReviewResultDTO(Page reviews){ return reviews.map(ReviewConverter::checkReviewResultDTO); } - // - // public static ReviewResponseDTO.CheckPartnerReviewResponseDTO checkPartnerReviewResultDTO(Review review){ - // return ReviewResponseDTO.CheckPartnerReviewResponseDTO.builder() - // .reviewId(review.getId()) - // .storeId(review.getStore().getId()) - // .reviewerId(review.getStudent().getId()) - // .content(review.getContent()) - // .rate(review.getRate()) - // .createdAt(review.getCreatedAt()) - // .reviewImageUrls(review.getImageList().stream() - // .map(ReviewPhoto::getPhotoUrl) - // .collect(Collectors.toList())) - // .build(); - // - // } - // - // public static Page checkPartnerReviewResultDTO(Page reviews){ - // return reviews.map(ReviewConverter::checkPartnerReviewResultDTO); - // } - // public static ReviewResponseDTO.DeleteReviewResponseDTO deleteReviewResultDTO(Long reviewId){ - // return ReviewResponseDTO.DeleteReviewResponseDTO.builder() - // .reviewId(reviewId) - // .build(); - // } } \ No newline at end of file diff --git a/src/main/java/com/assu/server/domain/review/dto/ReviewRequestDTO.java b/src/main/java/com/assu/server/domain/review/dto/ReviewRequestDTO.java index e8db66ad..5b9cf6cf 100644 --- a/src/main/java/com/assu/server/domain/review/dto/ReviewRequestDTO.java +++ b/src/main/java/com/assu/server/domain/review/dto/ReviewRequestDTO.java @@ -7,7 +7,7 @@ import java.util.List; -public class ReviewRequestDTO { +public class ReviewRequestDTO { @Getter @Setter @Builder diff --git a/src/main/java/com/assu/server/domain/review/entity/Review.java b/src/main/java/com/assu/server/domain/review/entity/Review.java index b82f758e..d96013f7 100644 --- a/src/main/java/com/assu/server/domain/review/entity/Review.java +++ b/src/main/java/com/assu/server/domain/review/entity/Review.java @@ -49,13 +49,6 @@ public class Review extends BaseEntity { @OneToMany(mappedBy = "review", cascade = CascadeType.ALL, fetch = FetchType.LAZY) private List imageList = new ArrayList<>(); - public List getImageList() { - if (imageList == null) { - imageList = new ArrayList<>(); - } - return imageList; - } - private Integer rate; private String content; @@ -65,7 +58,12 @@ public List getImageList() { @Builder.Default private ReportedStatus status = ReportedStatus.NORMAL; - // 상태 업데이트 메서드 + public List getImageList() { + if (imageList == null) { + imageList = new ArrayList<>(); + } + return imageList; + } public void updateReportedStatus(ReportedStatus status) { this.status = status; } diff --git a/src/main/java/com/assu/server/domain/review/entity/ReviewPhoto.java b/src/main/java/com/assu/server/domain/review/entity/ReviewPhoto.java index 892e70df..b0059148 100644 --- a/src/main/java/com/assu/server/domain/review/entity/ReviewPhoto.java +++ b/src/main/java/com/assu/server/domain/review/entity/ReviewPhoto.java @@ -1,16 +1,7 @@ package com.assu.server.domain.review.entity; -import com.assu.server.domain.common.entity.BaseEntity; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; +import com.assu.server.domain.common.entity.BaseEntity; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; diff --git a/src/main/java/com/assu/server/domain/store/controller/StoreController.java b/src/main/java/com/assu/server/domain/store/controller/StoreController.java index 51fd8668..596fd909 100644 --- a/src/main/java/com/assu/server/domain/store/controller/StoreController.java +++ b/src/main/java/com/assu/server/domain/store/controller/StoreController.java @@ -27,8 +27,8 @@ public class StoreController { @GetMapping("/best") @Operation(summary = "홈화면의 현재 인기 매장 조회 api", description = "관리자, 사용자, 제휴업체 모두 사용하는 api") - public ResponseEntity> getTodayBestStore() { - StoreResponseDTO.todayBest result = storeService.getTodayBestStore(); + public ResponseEntity> getTodayBestStore() { + StoreResponseDTO.TodayBest result = storeService.getTodayBestStore(); return ResponseEntity.ok(BaseResponse.onSuccess(SuccessStatus.BEST_STORE_SUCCESS, result)); } diff --git a/src/main/java/com/assu/server/domain/store/dto/StoreResponseDTO.java b/src/main/java/com/assu/server/domain/store/dto/StoreResponseDTO.java index 5a28476b..1a86083c 100644 --- a/src/main/java/com/assu/server/domain/store/dto/StoreResponseDTO.java +++ b/src/main/java/com/assu/server/domain/store/dto/StoreResponseDTO.java @@ -33,7 +33,7 @@ public static class ListWeeklyRankResponseDTO { @RequiredArgsConstructor @Builder @Getter - public static class todayBest{ + public static class TodayBest{ List bestStores; } 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 7114810e..5443c6ca 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 @@ -1,6 +1,4 @@ package com.assu.server.domain.store.repository; - - import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import com.assu.server.domain.store.entity.Store; diff --git a/src/main/java/com/assu/server/domain/store/service/StoreService.java b/src/main/java/com/assu/server/domain/store/service/StoreService.java index d21b3ee5..e0df8ddb 100644 --- a/src/main/java/com/assu/server/domain/store/service/StoreService.java +++ b/src/main/java/com/assu/server/domain/store/service/StoreService.java @@ -4,7 +4,7 @@ import com.assu.server.domain.user.dto.StudentResponseDTO; public interface StoreService { - StoreResponseDTO.todayBest getTodayBestStore(); + StoreResponseDTO.TodayBest getTodayBestStore(); StoreResponseDTO.WeeklyRankResponseDTO getWeeklyRank(Long memberId); StoreResponseDTO.ListWeeklyRankResponseDTO getListWeeklyRank(Long memberId); } diff --git a/src/main/java/com/assu/server/domain/store/service/StoreServiceImpl.java b/src/main/java/com/assu/server/domain/store/service/StoreServiceImpl.java index 232c21ba..9a378e33 100644 --- a/src/main/java/com/assu/server/domain/store/service/StoreServiceImpl.java +++ b/src/main/java/com/assu/server/domain/store/service/StoreServiceImpl.java @@ -25,10 +25,10 @@ public class StoreServiceImpl implements StoreService { @Override @Transactional - public StoreResponseDTO.todayBest getTodayBestStore() { + public StoreResponseDTO.TodayBest getTodayBestStore() { List bestStores = storeRepository.findTodayBestStoreNames(); - return StoreResponseDTO.todayBest.builder() + return StoreResponseDTO.TodayBest.builder() .bestStores(bestStores) .build(); } diff --git a/src/main/java/com/assu/server/domain/user/dto/StudentResponseDTO.java b/src/main/java/com/assu/server/domain/user/dto/StudentResponseDTO.java index d415f75a..6c86b924 100644 --- a/src/main/java/com/assu/server/domain/user/dto/StudentResponseDTO.java +++ b/src/main/java/com/assu/server/domain/user/dto/StudentResponseDTO.java @@ -1,23 +1,10 @@ package com.assu.server.domain.user.dto; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; - import com.assu.server.domain.partnership.entity.enums.CriterionType; import com.assu.server.domain.partnership.entity.enums.OptionType; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.RequiredArgsConstructor; +import lombok.*; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import java.time.LocalDate; -import java.time.LocalDateTime; +import java.util.List; public class StudentResponseDTO {