From 0fe0e08493685a6240cbaa4a8081c4599413d224 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Tue, 23 Jan 2024 23:55:06 +0900 Subject: [PATCH 1/9] =?UTF-8?q?feat:=20=EC=83=81=EC=98=81=EC=A7=80?= =?UTF-8?q?=EC=88=98=20=EB=B0=98=ED=99=98=20(=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20x)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ScreeningController.java | 9 ++ .../dto/response/GetCountResponse.java | 46 ++++++++++ .../service/GetRateCountUseCase.java | 50 +++++++++++ .../api/screening/service/ReviewUseCase.java | 41 +++++++-- .../screening/adaptor/ScreeningAdaptor.java | 83 +++++++++++++++++++ .../domains/screening/entity/Screening.java | 7 ++ .../entity/dto/ScreeningCountDto.java | 29 +++++++ .../adaptor/UserScreeningAdaptor.java | 4 + .../repository/UserScreeningRepository.java | 2 + 9 files changed, 264 insertions(+), 7 deletions(-) create mode 100644 Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java create mode 100644 Api/src/main/java/com/example/api/screening/service/GetRateCountUseCase.java create mode 100644 Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningCountDto.java diff --git a/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java b/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java index e03f0a7..121f75a 100644 --- a/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java +++ b/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java @@ -43,6 +43,7 @@ @Slf4j @SecurityRequirement(name = "access-token") public class ScreeningController { + private final GetRateCountUseCase getRateCountUseCase; private final ScreeningUploadUseCase screeningUploadUseCase; private final GetScreeningUseCase getScreeningUseCase; private final ReviewUseCase reviewUseCase; @@ -219,5 +220,13 @@ public void postReviewComplain(@RequestParam("reviewId") Long reviewId) { reviewAdaptor.postComplain(reviewId,userId); } + //TODO 스크리닝 장소, 운영, 감상 개수 pos, neg,스크리닝지수 마다 반환 + @GetMapping("/count") + public GetCountResponse getScreeningCount(@RequestParam("screeningId") Long screeningId){ + return getRateCountUseCase.execute(screeningId); + } + + //TODO 테스트 해보기 + } diff --git a/Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java b/Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java new file mode 100644 index 0000000..8a8277d --- /dev/null +++ b/Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java @@ -0,0 +1,46 @@ +package com.example.api.screening.dto.response; + +import com.example.domains.screening.entity.dto.ScreeningCountDto; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class GetCountResponse { + @Schema(defaultValue = "홍익대학교 졸업전시회", description = "상영회 제목") + private int movieReviewCountNeg; + @Schema(defaultValue = "홍익대학교 졸업전시회", description = "상영회 제목") + private int movieReviewCountPos; + @Schema(defaultValue = "홍익대학교 졸업전시회", description = "상영회 제목") + private int locationCountNeg; + @Schema(defaultValue = "홍익대학교 졸업전시회", description = "상영회 제목") + private int locationCountPos; + @Schema(defaultValue = "홍익대학교 졸업전시회", description = "상영회 제목") + private int serviceCountNeg; + @Schema(defaultValue = "홍익대학교 졸업전시회", description = "상영회 제목") + private int serviceCountPos; + @Schema(defaultValue = "홍익대학교 졸업전시회", description = "상영회 제목") + private Long screeningRate; + + @Builder + public GetCountResponse(int movieReviewCountNeg,int movieReviewCountPos,int locationCountNeg,int locationCountPos,int serviceCountNeg,int serviceCountPos,Long screeningRate){ + this.movieReviewCountNeg = movieReviewCountNeg; + this.movieReviewCountPos = movieReviewCountPos; + this.locationCountNeg = locationCountNeg; + this.locationCountPos = locationCountPos; + this.serviceCountNeg = serviceCountNeg; + this.serviceCountPos = serviceCountPos; + this.screeningRate = screeningRate; + } + public static GetCountResponse from(ScreeningCountDto screeningCountDto) { + return GetCountResponse.builder() + .locationCountNeg(screeningCountDto.getLocationCountNeg()) + .locationCountPos(screeningCountDto.getLocationCountPos()) + .movieReviewCountNeg(screeningCountDto.getMovieReviewCountNeg()) + .movieReviewCountPos(screeningCountDto.getMovieReviewCountPos()) + .serviceCountNeg(screeningCountDto.getServiceCountNeg()) + .serviceCountPos(screeningCountDto.getServiceCountPos()) + .screeningRate(builder().screeningRate) + .build(); + } +} diff --git a/Api/src/main/java/com/example/api/screening/service/GetRateCountUseCase.java b/Api/src/main/java/com/example/api/screening/service/GetRateCountUseCase.java new file mode 100644 index 0000000..c1d2a38 --- /dev/null +++ b/Api/src/main/java/com/example/api/screening/service/GetRateCountUseCase.java @@ -0,0 +1,50 @@ +package com.example.api.screening.service; + +import com.example.adaptor.UseCase; +import com.example.api.screening.dto.response.GetCountResponse; +import com.example.domains.screening.adaptor.ScreeningAdaptor; +import com.example.domains.screening.entity.Screening; +import com.example.domains.screening.entity.dto.ScreeningCountDto; +import com.example.domains.userscreening.adaptor.UserScreeningAdaptor; +import com.example.domains.userscreening.entity.UserScreening; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +@UseCase +@RequiredArgsConstructor +public class GetRateCountUseCase { + private final ScreeningAdaptor screeningAdaptor; + private final UserScreeningAdaptor userScreeningAdaptor; + public GetCountResponse execute(Long screeningId) { + final ScreeningCountDto request = getScreeningCount(screeningId); + return GetCountResponse.from(request); + } + + public ScreeningCountDto getScreeningCount(Long screeningId) { + Screening screening = screeningAdaptor.findById(screeningId); + Long rate = getScreeningRate(screening); + + return ScreeningCountDto.builder() + .locationCountNeg(screening.getLocationCountNeg()) + .locationCountPos(screening.getLocationCountPos()) + .movieReviewCountNeg(screening.getMovieReviewCountNeg()) + .movieReviewCountPos(screening.getMovieReviewCountPos()) + .serviceCountNeg(screening.getServiceCountNeg()) + .serviceCountPos(screening.getServiceCountPos()) + .screeningRate(rate) + .build(); + + } + + private Long getScreeningRate(Screening screening) { + List userScreenings = userScreeningAdaptor.findByScreeningId(screening.getId()); + int count = screening.getScreeningRate(); + int total = userScreenings.size() - 1; + if(total==0){ + return (long) 0.0; + } { + return (long) ((count / total) * 100); + } + } +} diff --git a/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java b/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java index 376fb5d..bb6eb59 100644 --- a/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java +++ b/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java @@ -55,23 +55,50 @@ private PostReviewResponse reviewUpload(UserScreening userScreening,PostReviewRe ); Screening screening = screeningAdaptor.findById(userScreening.getScreening().getId()); + calculateCount(request.isScreeningReview(),request.isLocationReview(),request.isServiceReview(),screening); + calculateRate(request.isAfterScreening(),screening); incrementNegative(request.getNegative(),screening); incrementPositive(request.getPositive(),screening); - + //save reviewAdaptor.save(newSreeningReview); //screeningAdaptor.save(screening); return PostReviewResponse.from(newSreeningReview); } + @Transactional + public void calculateRate(boolean afterScreening,Screening screening) { + if(afterScreening) { + screeningAdaptor.incrementAfterScreening(screening); + } + } + + @Transactional + public void calculateCount(boolean screeningReview, boolean locationReview, boolean serviceReview,Screening screening) { + if(screeningReview) { + screeningAdaptor.incrementScreeningReview(screening); + } else if (!screeningReview) { + screeningAdaptor.decrementScreeningReview(screening); + } + if(locationReview) { + screeningAdaptor.incrementLocationReview(screening); + } else if (!locationReview) { + screeningAdaptor.decrementLocationReview(screening); + } + if(serviceReview) { + screeningAdaptor.incrementServiceReview(screening); + } else if(!serviceReview) { + screeningAdaptor.decrementServiceReview(screening); + } + } + + @Transactional + public PostReviewResponse proceed(ScreeningReview newSreeningReview, Screening screening) { + screeningAdaptor.save(screening); + return PostReviewResponse.from(newSreeningReview); + } -// @Transactional -// public PostReviewResponse proceed(ScreeningReview newSreeningReview, Screening screening) { -// screeningAdaptor.save(screening); -// return PostReviewResponse.from(newSreeningReview); -// } -// @Transactional public void incrementPositive(Positive positive, Screening userScreening) { diff --git a/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java b/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java index d6b1278..de64019 100644 --- a/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java +++ b/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java @@ -5,10 +5,12 @@ import com.example.domains.screening.entity.QScreening; import com.example.domains.screening.entity.Screening; import com.example.domains.screening.entity.dto.QScreeningResponseDto; +import com.example.domains.screening.entity.dto.ScreeningCountDto; import com.example.domains.screening.entity.dto.ScreeningResponseDto; import com.example.domains.screening.enums.Category; import com.example.domains.screening.repository.ScreeningRepository; import com.example.domains.screeningReview.entity.QScreeningReview; +import com.example.domains.userscreening.adaptor.UserScreeningAdaptor; import com.example.domains.userscreening.entity.QUserScreening; import com.example.domains.userscreening.entity.UserScreening; import com.example.domains.userscreening.repository.UserScreeningRepository; @@ -30,6 +32,7 @@ public class ScreeningAdaptor { private final ScreeningRepository screeningRepository; private final UserScreeningRepository userScreeningRepository; private final JPAQueryFactory jpaQueryFactory; + private final UserScreeningAdaptor userScreeningAdaptor; public Screening save(Screening screening) { @@ -482,4 +485,84 @@ public void incrementPositiveChemistryIsGood(Screening screening) { .where(qScreening.id.eq(screening.getId())) .execute(); } + + + @Transactional + public void incrementScreeningReview(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.movieReviewCountPos, qScreening.movieReviewCountPos.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + + @Transactional + public void decrementScreeningReview(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.movieReviewCountNeg, qScreening.movieReviewCountNeg.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + + @Transactional + public void incrementLocationReview(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.locationCountPos, qScreening.locationCountPos.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + + @Transactional + public void decrementLocationReview(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.locationCountNeg, qScreening.locationCountNeg.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + + @Transactional + public void incrementServiceReview(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.serviceCountPos, qScreening.serviceCountPos.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + + @Transactional + public void decrementServiceReview(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.serviceCountNeg, qScreening.serviceCountNeg.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + + @Transactional + public void incrementAfterScreening(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.screeningRate, qScreening.screeningRate.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + + } diff --git a/Domain/src/main/java/com/example/domains/screening/entity/Screening.java b/Domain/src/main/java/com/example/domains/screening/entity/Screening.java index c25cc23..b14740a 100644 --- a/Domain/src/main/java/com/example/domains/screening/entity/Screening.java +++ b/Domain/src/main/java/com/example/domains/screening/entity/Screening.java @@ -47,6 +47,13 @@ public class Screening extends BaseTimeEntity { private Category category; private int screeningRate; + private int movieReviewCountNeg; + private int movieReviewCountPos; + private int locationCountNeg; + private int locationCountPos; + private int serviceCountNeg; + private int serviceCountPos; + @Builder private Screening(String title, String posterImgUrl, HostInfo hostInfo, String location, String participationUrl, diff --git a/Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningCountDto.java b/Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningCountDto.java new file mode 100644 index 0000000..ec2112c --- /dev/null +++ b/Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningCountDto.java @@ -0,0 +1,29 @@ +package com.example.domains.screening.entity.dto; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class ScreeningCountDto { + private int movieReviewCountNeg; + private int movieReviewCountPos; + private int locationCountNeg; + private int locationCountPos; + private int serviceCountNeg; + private int serviceCountPos; + private Long screeningRate; + + @Builder + public ScreeningCountDto(int movieReviewCountNeg,int movieReviewCountPos,int locationCountNeg,int locationCountPos,int serviceCountNeg,int serviceCountPos,Long screeningRate){ + this.movieReviewCountNeg = movieReviewCountNeg; + this.movieReviewCountPos = movieReviewCountPos; + this.locationCountNeg = locationCountNeg; + this.locationCountPos = locationCountPos; + this.serviceCountNeg = serviceCountNeg; + this.serviceCountPos = serviceCountPos; + this.screeningRate = screeningRate; + } +} diff --git a/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java b/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java index 8bc7719..6c32235 100644 --- a/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java +++ b/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java @@ -93,4 +93,8 @@ public List getReviewListByScreening(Long userId, Lo return reviewResponseDtos; } + + public List findByScreeningId(Long screeningId) { + return userScreeningRepository.findByScreeningId(screeningId); + } } diff --git a/Domain/src/main/java/com/example/domains/userscreening/repository/UserScreeningRepository.java b/Domain/src/main/java/com/example/domains/userscreening/repository/UserScreeningRepository.java index cee4174..ef87b98 100644 --- a/Domain/src/main/java/com/example/domains/userscreening/repository/UserScreeningRepository.java +++ b/Domain/src/main/java/com/example/domains/userscreening/repository/UserScreeningRepository.java @@ -13,4 +13,6 @@ public interface UserScreeningRepository extends JpaRepository findByUserIdAndScreeningId(Long userId, Long screeningId); List findByIsBookmarked(boolean b); + + List findByScreeningId(Long screeningId); } From 360e60ead8be50cd56e5b000b9ed488cb3d91252 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Wed, 24 Jan 2024 15:40:38 +0900 Subject: [PATCH 2/9] =?UTF-8?q?feat:=20=ED=8C=9D=EC=BD=98=EC=9E=91=20?= =?UTF-8?q?=EC=A7=80=EB=82=9C=EC=A3=BC=20=EC=83=81=EC=98=81=EC=9E=91=20,?= =?UTF-8?q?=20=EC=A6=89=20=EC=9D=B4=EB=B2=88=EC=A3=BC=20=ED=8C=9D=EC=BD=98?= =?UTF-8?q?=EC=9E=91=203=EA=B0=9C=20=EB=B0=98=ED=99=98=20#22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Popcorn/controller/PopcornController.java | 23 +++++- .../Popcorn/dto/response/PopcornResponse.java | 37 +++++++++ .../Popcorn/service/GetPopcornUseCase.java | 27 +++++++ .../service/PostRecommendPopcornUseCase.java | 31 ++++---- .../schedule/DiverseMovieSchedule.java | 2 +- .../popcorn/adaptor/PopcornAdaptor.java | 77 +++++++++++++++++++ .../domains/popcorn/entity/Popcorn.java | 12 ++- .../entity/dto/PopcornResponseDto.java | 9 +++ .../popcorn/repository/PopcornRepository.java | 7 ++ .../popcorn/schedule/PopcornSchedule.java | 28 +++++++ .../popcorn/service/PopcornService.java | 18 +++++ .../entity/RecommendedPopcorn.java | 7 +- .../schedule/DiverseMovieScheduleTest.java | 1 - 13 files changed, 257 insertions(+), 22 deletions(-) create mode 100644 Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornResponse.java create mode 100644 Api/src/main/java/com/example/api/Popcorn/service/GetPopcornUseCase.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornResponseDto.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/repository/PopcornRepository.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/service/PopcornService.java diff --git a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java index ae94f7d..d3f7bc5 100644 --- a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java +++ b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java @@ -1,19 +1,36 @@ package com.example.api.Popcorn.controller; +import com.example.api.Popcorn.dto.response.PopcornResponse; +import com.example.api.Popcorn.service.GetPopcornUseCase; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.util.List; + @RestController @RequestMapping("/popcorn") @RequiredArgsConstructor @Slf4j @SecurityRequirement(name = "access-token") public class PopcornController { - //TODO 지난주 (테스트는 3분) 팝콘작 중 투표수 가장 높았던 것 3개 반환 - //TODO 이번 주 (테스트는 3분) 팝콘작 선정 된 것 저장 -> 스케쥴링? PopCorn + private final GetPopcornUseCase getPopcornUseCase; + //TODO 지난주 (테스트는 1분) 팝콘작 중 투표수 가장 높았던 것 3개 반환 + @GetMapping + public List getPopcorn() { + return getPopcornUseCase.execute(); + } + //TODO 5. 팝콘작 리뷰하기 - //TODO 6. 팝콘작 팝콘지수 산출 - 스케쥴링 + + //TODO 6. 팝콘작 팝콘지수 산출 + + //TODO 7: 팝콘작 상세 페이지 + + + + } diff --git a/Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornResponse.java b/Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornResponse.java new file mode 100644 index 0000000..32fb792 --- /dev/null +++ b/Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornResponse.java @@ -0,0 +1,37 @@ +package com.example.api.Popcorn.dto.response; + +import com.example.api.diverseMovie.dto.response.DiverseMovieResponse; +import com.example.domains.diverseMovie.entity.dto.DiverseMovieResponseDto; +import com.example.domains.popcorn.entity.Popcorn; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class PopcornResponse { + @Schema(defaultValue = "1", description = "합콘아이디") + private long popcornId; + @Schema(defaultValue = "괴물", description = "영화제목") + private String movieTitle; + + @Schema(defaultValue = "고레에다 히로카즈", description = "영화김독") + private String directorName; +// @Schema(defaultValue = "제 76회 칸 국제영화제에서...", description = "영화포스터 이미지") +// private String detail; + + + @Builder + public PopcornResponse(Long popcornId,String movieTitle,String directorName){ + this.popcornId = popcornId; + this.movieTitle=movieTitle; + this.directorName=directorName; + } + public static PopcornResponse from(Popcorn popcorn){ + return PopcornResponse.builder() + .popcornId(popcorn.getId()) + .movieTitle(popcorn.getMovieTitle()) + .directorName(popcorn.getDirectorName()) + .build(); + + } +} diff --git a/Api/src/main/java/com/example/api/Popcorn/service/GetPopcornUseCase.java b/Api/src/main/java/com/example/api/Popcorn/service/GetPopcornUseCase.java new file mode 100644 index 0000000..ac9eab8 --- /dev/null +++ b/Api/src/main/java/com/example/api/Popcorn/service/GetPopcornUseCase.java @@ -0,0 +1,27 @@ +package com.example.api.Popcorn.service; + +import com.example.adaptor.UseCase; +import com.example.api.Popcorn.dto.response.PopcornResponse; +import com.example.domains.popcorn.adaptor.PopcornAdaptor; +import com.example.domains.popcorn.entity.Popcorn; +import lombok.RequiredArgsConstructor; +import org.springframework.security.core.parameters.P; + +import java.util.ArrayList; +import java.util.List; +@UseCase +@RequiredArgsConstructor +public class GetPopcornUseCase { + private final PopcornAdaptor popcornAdaptor; + public List execute() { + List popcornList = popcornAdaptor.findLastWeekPopcorns(); + List response = new ArrayList<>(); + + for(Popcorn popcorn : popcornList) { + final PopcornResponse popcornResponse = PopcornResponse.from(popcorn); + response.add(popcornResponse); + } + return response; + } + +} diff --git a/Api/src/main/java/com/example/api/recommendedPopcorn/service/PostRecommendPopcornUseCase.java b/Api/src/main/java/com/example/api/recommendedPopcorn/service/PostRecommendPopcornUseCase.java index ad478d4..aeee560 100644 --- a/Api/src/main/java/com/example/api/recommendedPopcorn/service/PostRecommendPopcornUseCase.java +++ b/Api/src/main/java/com/example/api/recommendedPopcorn/service/PostRecommendPopcornUseCase.java @@ -38,7 +38,7 @@ public class PostRecommendPopcornUseCase { private final UserAdaptor userAdaptor; private final RecommendedPopcornUserAdaptor recommendedPopcornUserAdaptor; - @Value("${TMDB_SECRET}") + @Value("${KDMB}") String tmdb ; public void execute(RecommendedPopcornRequest request) throws IOException { @@ -64,7 +64,7 @@ private void getApi( Request request = new Request.Builder() - .url("https://api.themoviedb.org/3/movie/" + movieId + "?language=ko&api_key=" + tmdb) + .url("http://api.koreafilm.or.kr/openapi-data2/wisenut/search_api/search_json2.jsp?collection=kmdb_new2&movieSeq=" + movieId + "&detail=Y&ServiceKey=" + tmdb) .get() .addHeader("accept", "application/json") .addHeader("Authorization", "Bearer " + tmdb) @@ -81,26 +81,31 @@ private void getApi( ObjectMapper objectMapper = new ObjectMapper(); JsonNode rootNode = objectMapper.readTree(responseBody); - //필요한 정보 추출 - String originalTitle = rootNode.path("original_title").asText(); - String overview = rootNode.path("overview").asText(); - String posterPath = rootNode.path("poster_path").asText(); + // Extracting the first movie's information + JsonNode movieData = rootNode.path("Data").path(0).path("Result").path(0); - // 추출한 정보 활용 - System.out.println("Original Title: " + originalTitle); - System.out.println("Overview: " + overview); - System.out.println("Poster Path: " + posterPath); + // Extracting specific information + String title = movieData.path("title").asText(); + String directorNm = movieData.path("directors").path("director").path(0).path("directorNm").asText(); + String plotText = movieData.path("plots").path("plot").path(0).path("plotText").asText(); + String firstPosterUrl = movieData.path("posters").asText().split("\\|")[0]; - postRecommendation(movieId.toString(),originalTitle,overview,posterPath,popcornRequest); + // Displaying the extracted information + System.out.println("Title: " + title); + System.out.println("Director: " + directorNm); + System.out.println("Plot: " + plotText); + System.out.println("First Poster URL: " + firstPosterUrl); + + postRecommendation(movieId.toString(),title,plotText,firstPosterUrl,directorNm,popcornRequest); } } - public void postRecommendation(String movieId,String originalTitle, String overview, String posterPath, RecommendedPopcornRequest popcornRequest) { + public void postRecommendation(String movieId,String originalTitle, String overview, String posterPath,String directorNm, RecommendedPopcornRequest popcornRequest) { Long userId = SecurityUtil.getCurrentUserId(); User user = userAdaptor.findById(userId); final RecommendedPopcorn recommendedPopcorn = RecommendedPopcorn.of(movieId - ,originalTitle,posterPath,overview,popcornRequest.getReason()); + ,originalTitle,posterPath,overview,directorNm,popcornRequest.getReason()); RecommendedPopcorn recommendedPopcornResult = recommendedPopcornAdaptor.save(recommendedPopcorn); proceedSaving(recommendedPopcornResult,user); } diff --git a/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java b/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java index cf1316d..41c1b66 100644 --- a/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java +++ b/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java @@ -8,6 +8,7 @@ @Service @RequiredArgsConstructor public class DiverseMovieSchedule { + private final DiverseMovieService diverseMovieService; //매 주 월요일 0시 0분에 실행되도록 cron 설정 @Scheduled(cron = "0 0 0 * * MON") public void scheduledMethod() { @@ -16,7 +17,6 @@ public void scheduledMethod() { System.out.println("매 주 월요일에 실행되는 작업"); } - private final DiverseMovieService diverseMovieService; // @Scheduled(cron = "0 * * * * *") // public void scheduledMethod() { diff --git a/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java b/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java new file mode 100644 index 0000000..70aebdb --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java @@ -0,0 +1,77 @@ +package com.example.domains.popcorn.adaptor; + +import com.example.adaptor.Adaptor; +import com.example.domains.popcorn.entity.Popcorn; +import com.example.domains.popcorn.entity.QPopcorn; +import com.example.domains.popcorn.entity.dto.PopcornResponseDto; +import com.example.domains.popcorn.repository.PopcornRepository; +import com.example.domains.recommendedPopcorn.entity.QRecommendedPopcorn; +import com.example.domains.recommendedPopcorn.entity.RecommendedPopcorn; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDate; +import java.time.temporal.TemporalField; +import java.time.temporal.WeekFields; +import java.util.List; +import java.util.Locale; + +import static com.example.domains.diverseMovie.entity.QDiverseMovie.diverseMovie; + +@Adaptor +@RequiredArgsConstructor +public class PopcornAdaptor { + private final PopcornRepository popcornRepository; + private final JPAQueryFactory queryFactory; + + @Transactional + public void save(Popcorn popcorn){ + popcornRepository.save(popcorn); + } + + + public void saveToPopcorn() { + List listRecommendedPopcorn = findTopThree(); + for (RecommendedPopcorn rp : listRecommendedPopcorn) { + Popcorn movie = convertToPopcorn(rp); + save(movie); + } + } + + public Popcorn convertToPopcorn(RecommendedPopcorn rp){ + final Popcorn popcorn = Popcorn.of(rp.getMovieId(),rp.getMovieTitle(),rp.getImageUrl(),rp.getMovieDetail(),rp.getMovieDirector(),rp.getRecommendationReason(),rp.getRecommendationCount()); + return popcorn; + } + + public List findTopThree() { + QRecommendedPopcorn recommendedPopcorn = QRecommendedPopcorn.recommendedPopcorn; + + return queryFactory + .selectFrom(recommendedPopcorn) + .orderBy( + recommendedPopcorn.recommendationCount.desc(), + recommendedPopcorn.createdAt.desc() + ) + .limit(3) + .fetch(); + } + + public List findLastWeekPopcorns() { + QPopcorn popcorn = QPopcorn.popcorn; + + LocalDate today = LocalDate.now(); + LocalDate startOfLastWeek = today.minusDays(today.getDayOfWeek().getValue() + 6); // 지난 주의 월요일 + LocalDate endOfLastWeek = startOfLastWeek.plusDays(6); // 지난 주의 일요일 + + return queryFactory + .selectFrom(popcorn) + .where(popcorn.createdAt.between(startOfLastWeek.atStartOfDay(), endOfLastWeek.atTime(23, 59, 59))) + .orderBy( + popcorn.recommendationCount.desc(), + popcorn.createdAt.desc() + ) + .limit(3) + .fetch(); + } +} diff --git a/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java b/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java index 51b36dd..2bb0339 100644 --- a/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java +++ b/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java @@ -20,27 +20,35 @@ public class Popcorn extends BaseTimeEntity { private String movieTitle; private String imageUrl; + + @Column(columnDefinition = "TEXT") private String movieDetail; private String recommendationReason; private int popcornRate; + private String directorName; + private int recommendationCount; @Builder - private Popcorn (String movieId,String movieTitle, String imageUrl, String movieDetail, String recommendationReason) { + private Popcorn (String movieId,String movieTitle, String imageUrl, String movieDetail,String directorName, String recommendationReason,int recommendationCount) { this.movieId = movieId; this.movieTitle = movieTitle; this.imageUrl = imageUrl; this.movieDetail = movieDetail; + this.directorName = directorName; this.recommendationReason = recommendationReason; + this.recommendationCount = recommendationCount; } - public static Popcorn of(String movieId,String movieTitle, String imageUrl, String movieDetail, String recommendationReason) { + public static Popcorn of(String movieId,String movieTitle, String imageUrl, String movieDetail, String directorName, String recommendationReason,int recommendationCount) { return Popcorn.builder() .movieId(movieId) .movieTitle(movieTitle) .imageUrl(imageUrl) .movieDetail(movieDetail) + .directorName(directorName) .recommendationReason(recommendationReason) + .recommendationCount(recommendationCount) .build(); } } diff --git a/Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornResponseDto.java b/Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornResponseDto.java new file mode 100644 index 0000000..edc88af --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornResponseDto.java @@ -0,0 +1,9 @@ +package com.example.domains.popcorn.entity.dto; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class PopcornResponseDto { +} diff --git a/Domain/src/main/java/com/example/domains/popcorn/repository/PopcornRepository.java b/Domain/src/main/java/com/example/domains/popcorn/repository/PopcornRepository.java new file mode 100644 index 0000000..87570d1 --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/repository/PopcornRepository.java @@ -0,0 +1,7 @@ +package com.example.domains.popcorn.repository; + +import com.example.domains.popcorn.entity.Popcorn; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PopcornRepository extends JpaRepository { +} diff --git a/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java b/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java new file mode 100644 index 0000000..55ac1c9 --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java @@ -0,0 +1,28 @@ +package com.example.domains.popcorn.schedule; + +import com.example.domains.popcorn.service.PopcornService; +import com.example.domains.recommendedPopcorn.entity.RecommendedPopcorn; +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class PopcornSchedule { + private final PopcornService popcornService; + + //매 주 일요일 0시 0분에 실행되도록 cron 설정 +// @Scheduled(cron = "0 0 0 * * SUN") +// public void scheduledMethod() { +// popcornService.getTopRecommended(); +// System.out.println("매 주 일요일에 실행되는 작업"); +// } + + @Scheduled(cron = "0 * * * * *") + public void scheduledMethod() { + popcornService.getTopRecommended(); + System.out.println("1분마다 실행되는 작업"); + } +} diff --git a/Domain/src/main/java/com/example/domains/popcorn/service/PopcornService.java b/Domain/src/main/java/com/example/domains/popcorn/service/PopcornService.java new file mode 100644 index 0000000..1c9a9cd --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/service/PopcornService.java @@ -0,0 +1,18 @@ +package com.example.domains.popcorn.service; + +import com.example.adaptor.DomainService; +import com.example.domains.popcorn.adaptor.PopcornAdaptor; +import com.example.domains.popcorn.entity.Popcorn; +import com.example.domains.recommendedPopcorn.entity.RecommendedPopcorn; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +@DomainService +@RequiredArgsConstructor +public class PopcornService { + private final PopcornAdaptor popcornAdaptor; + public void getTopRecommended() { + popcornAdaptor.saveToPopcorn(); + } +} diff --git a/Domain/src/main/java/com/example/domains/recommendedPopcorn/entity/RecommendedPopcorn.java b/Domain/src/main/java/com/example/domains/recommendedPopcorn/entity/RecommendedPopcorn.java index fc9f7b5..12fc05c 100644 --- a/Domain/src/main/java/com/example/domains/recommendedPopcorn/entity/RecommendedPopcorn.java +++ b/Domain/src/main/java/com/example/domains/recommendedPopcorn/entity/RecommendedPopcorn.java @@ -23,22 +23,25 @@ public class RecommendedPopcorn extends BaseTimeEntity { private String movieDetail; private String recommendationReason; private int recommendationCount; + private String movieDirector; @Builder - private RecommendedPopcorn(String movieId, String movieTitle, String imageUrl, String movieDetail, String recommendationReason) { + private RecommendedPopcorn(String movieId, String movieTitle, String imageUrl, String movieDetail, String movieDirector, String recommendationReason) { this.movieId = movieId; this.movieTitle = movieTitle; this.imageUrl = imageUrl; this.movieDetail = movieDetail; + this.movieDirector = movieDirector; this.recommendationReason=recommendationReason; } - public static RecommendedPopcorn of(String movieId, String movieTitle, String imageUrl, String movieDetail, String recommendationReason) { + public static RecommendedPopcorn of(String movieId, String movieTitle, String imageUrl, String movieDetail, String movieDirector, String recommendationReason) { return RecommendedPopcorn.builder() .movieId(movieId) .movieTitle(movieTitle) .imageUrl(imageUrl) .movieDetail(movieDetail) + .movieDirector(movieDirector) .recommendationReason(recommendationReason) .build(); } diff --git a/Domain/src/test/java/com/example/domains/diverseMovie/schedule/DiverseMovieScheduleTest.java b/Domain/src/test/java/com/example/domains/diverseMovie/schedule/DiverseMovieScheduleTest.java index 5ea0522..5dcf277 100644 --- a/Domain/src/test/java/com/example/domains/diverseMovie/schedule/DiverseMovieScheduleTest.java +++ b/Domain/src/test/java/com/example/domains/diverseMovie/schedule/DiverseMovieScheduleTest.java @@ -4,7 +4,6 @@ import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.scheduling.annotation.SchedulingConfigurer; From 1650f68d1bcbf53d25417c220d2672ff34c50797 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Wed, 24 Jan 2024 16:19:23 +0900 Subject: [PATCH 3/9] #22 --- .../com/example/api/Popcorn/controller/PopcornController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java index d3f7bc5..2c00e28 100644 --- a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java +++ b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java @@ -31,6 +31,4 @@ public List getPopcorn() { //TODO 7: 팝콘작 상세 페이지 - - } From c658cbd4334ba00bb18241ae9cab7096f0e1220e Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Wed, 24 Jan 2024 16:54:48 +0900 Subject: [PATCH 4/9] =?UTF-8?q?fix:=20=EC=8A=A4=ED=81=AC=EB=A6=AC=EB=8B=9D?= =?UTF-8?q?=20rate=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/screening/dto/response/GetCountResponse.java | 2 +- .../domains/popcorn/schedule/PopcornSchedule.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java b/Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java index 8a8277d..98289be 100644 --- a/Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java +++ b/Api/src/main/java/com/example/api/screening/dto/response/GetCountResponse.java @@ -40,7 +40,7 @@ public static GetCountResponse from(ScreeningCountDto screeningCountDto) { .movieReviewCountPos(screeningCountDto.getMovieReviewCountPos()) .serviceCountNeg(screeningCountDto.getServiceCountNeg()) .serviceCountPos(screeningCountDto.getServiceCountPos()) - .screeningRate(builder().screeningRate) + .screeningRate(screeningCountDto.getScreeningRate()) .build(); } } diff --git a/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java b/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java index 55ac1c9..4a8dab5 100644 --- a/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java +++ b/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java @@ -20,9 +20,9 @@ public class PopcornSchedule { // System.out.println("매 주 일요일에 실행되는 작업"); // } - @Scheduled(cron = "0 * * * * *") - public void scheduledMethod() { - popcornService.getTopRecommended(); - System.out.println("1분마다 실행되는 작업"); - } +// @Scheduled(cron = "0 * * * * *") +// public void scheduledMethod() { +// popcornService.getTopRecommended(); +// System.out.println("1분마다 실행되는 작업"); +// } } From ec1c67abc90daa651fd5f906cde4aeba16c179c5 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Wed, 24 Jan 2024 17:38:19 +0900 Subject: [PATCH 5/9] =?UTF-8?q?fix:=20=EC=8A=A4=ED=81=AC=EB=A6=AC=EB=8B=9D?= =?UTF-8?q?=20=EC=B0=9C=ED=95=9C=20=EB=AA=A9=EB=A1=9D=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ScreeningController.java | 9 ++++-- .../dto/response/ScreeningResponse.java | 6 +++- .../response/ScreeningReviewUserResponse.java | 6 +++- .../GetBookMarkedScreeningsUseCase.java | 27 ++++++++++++++++ .../dto/ScreeningReviewResponseDto.java | 6 ++-- .../adaptor/UserScreeningAdaptor.java | 32 +++++++++++++++---- 6 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 Api/src/main/java/com/example/api/screening/service/GetBookMarkedScreeningsUseCase.java diff --git a/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java b/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java index 121f75a..f6c4a9a 100644 --- a/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java +++ b/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java @@ -56,6 +56,7 @@ public class ScreeningController { private final PatchScreeningUseCase patchScreeningUseCase; private final ScreeningAdaptor screeningAdaptor; private final ReviewAdaptor reviewAdaptor; + private final GetBookMarkedScreeningsUseCase getBookMarkedScreeningUseCase; @Operation(description = "모임 대표 이미지") @@ -220,13 +221,17 @@ public void postReviewComplain(@RequestParam("reviewId") Long reviewId) { reviewAdaptor.postComplain(reviewId,userId); } - //TODO 스크리닝 장소, 운영, 감상 개수 pos, neg,스크리닝지수 마다 반환 + //TODO 스크리닝 장소, 운영, 감상 개수 pos, neg,스크리닝지수 마다 반환 (0) @GetMapping("/count") public GetCountResponse getScreeningCount(@RequestParam("screeningId") Long screeningId){ return getRateCountUseCase.execute(screeningId); } - //TODO 테스트 해보기 + //TODO 찜하기 한 스크리닝 목록 반환 (0) + @GetMapping("/bookmarked") + public List getBookmarkedScreenings(){ + return getBookMarkedScreeningUseCase.execute(); + } } diff --git a/Api/src/main/java/com/example/api/screening/dto/response/ScreeningResponse.java b/Api/src/main/java/com/example/api/screening/dto/response/ScreeningResponse.java index 0eec36e..83b1fa0 100644 --- a/Api/src/main/java/com/example/api/screening/dto/response/ScreeningResponse.java +++ b/Api/src/main/java/com/example/api/screening/dto/response/ScreeningResponse.java @@ -12,6 +12,8 @@ @Getter public class ScreeningResponse { + @Schema(defaultValue = "1", description = "스크리닝 id") + private Long screeningId; @Schema(defaultValue = "https://jgjfhdjghsdkjhgkjd", description = "상영회 대표 이미지") private String posterImgUrl; @@ -56,11 +58,12 @@ public class ScreeningResponse { @Builder - public ScreeningResponse( + public ScreeningResponse(Long screeningId, String screeningTitle, String posterImgUrl, String hostName, String hostEmail, String hostPhoneNumber , String location, String formUrl, String information, boolean hasAgreed, Category category, LocalDateTime screeningStartDate, LocalDateTime screeningEndDate, LocalDateTime screeningStartTime, boolean isPrivate ) { + this.screeningId = screeningId; this.screeningTitle = screeningTitle; this.posterImgUrl = posterImgUrl; this.hostName = hostName; @@ -79,6 +82,7 @@ public ScreeningResponse( public static ScreeningResponse from(Screening screening) { return ScreeningResponse.builder() + .screeningId(screening.getId()) .screeningTitle(screening.getTitle()) .posterImgUrl(screening.getPosterImgUrl()) .hostName(screening.getHostInfo().getHostName()) diff --git a/Api/src/main/java/com/example/api/screening/dto/response/ScreeningReviewUserResponse.java b/Api/src/main/java/com/example/api/screening/dto/response/ScreeningReviewUserResponse.java index dd32748..3a92cdc 100644 --- a/Api/src/main/java/com/example/api/screening/dto/response/ScreeningReviewUserResponse.java +++ b/Api/src/main/java/com/example/api/screening/dto/response/ScreeningReviewUserResponse.java @@ -14,6 +14,8 @@ @Getter public class ScreeningReviewUserResponse implements Serializable { + @Schema(defaultValue = "1", description = "리뷰 아이디") + private Long reviewId; @Schema(defaultValue = "true", description = "작품") private boolean afterScreening; @@ -35,7 +37,8 @@ public class ScreeningReviewUserResponse implements Serializable { @Builder - public ScreeningReviewUserResponse( boolean afterScreening, String review, LocalDateTime createdAt, Long screeningId,Long userId, String nickname,int profileImageNumber) { + public ScreeningReviewUserResponse(Long reviewId,boolean afterScreening, String review, LocalDateTime createdAt, Long screeningId,Long userId, String nickname,int profileImageNumber) { + this.reviewId = reviewId; this.afterScreening = afterScreening; this.review = review; this.createdAt = createdAt; @@ -46,6 +49,7 @@ public ScreeningReviewUserResponse( boolean afterScreening, String review, Local } public static ScreeningReviewUserResponse from(ScreeningReviewResponseDto screeningReview,User user) { return ScreeningReviewUserResponse.builder() + .reviewId(screeningReview.getReviewId()) .afterScreening(screeningReview.isAfterScreening()) .review(screeningReview.getReview()) .createdAt(screeningReview.getCreatedAt()) diff --git a/Api/src/main/java/com/example/api/screening/service/GetBookMarkedScreeningsUseCase.java b/Api/src/main/java/com/example/api/screening/service/GetBookMarkedScreeningsUseCase.java new file mode 100644 index 0000000..a7f62fe --- /dev/null +++ b/Api/src/main/java/com/example/api/screening/service/GetBookMarkedScreeningsUseCase.java @@ -0,0 +1,27 @@ +package com.example.api.screening.service; + +import com.example.adaptor.UseCase; +import com.example.api.config.security.SecurityUtil; +import com.example.api.screening.dto.response.ScreeningResponse; +import com.example.domains.screening.entity.Screening; +import com.example.domains.userscreening.adaptor.UserScreeningAdaptor; +import com.example.domains.userscreening.entity.UserScreening; +import lombok.RequiredArgsConstructor; + +import java.util.ArrayList; +import java.util.List; +@UseCase +@RequiredArgsConstructor +public class GetBookMarkedScreeningsUseCase { + private final UserScreeningAdaptor userScreeningAdaptor; + public List execute() { + Long userId = SecurityUtil.getCurrentUserId(); + List screenings = userScreeningAdaptor.findBookmarkedUserScreening(userId); + List result = new ArrayList<>(); + + for (Screening screening : screenings) { + result.add(ScreeningResponse.from(screening)); + } + return result; + } +} diff --git a/Domain/src/main/java/com/example/domains/screeningReview/entity/dto/ScreeningReviewResponseDto.java b/Domain/src/main/java/com/example/domains/screeningReview/entity/dto/ScreeningReviewResponseDto.java index ba0667c..e5f918d 100644 --- a/Domain/src/main/java/com/example/domains/screeningReview/entity/dto/ScreeningReviewResponseDto.java +++ b/Domain/src/main/java/com/example/domains/screeningReview/entity/dto/ScreeningReviewResponseDto.java @@ -10,13 +10,15 @@ @Getter public class ScreeningReviewResponseDto { + private Long reviewId; private boolean afterScreening; private LocalDateTime createdAt; private Long screeningId; private String review; @QueryProjection - public ScreeningReviewResponseDto(boolean afterScreening, LocalDateTime createdAt, Long screeningId,String review) { - this.afterScreening = afterScreening; + public ScreeningReviewResponseDto(Long reviewId,boolean afterScreening, LocalDateTime createdAt, Long screeningId,String review) { + this.reviewId = reviewId; + this.afterScreening = afterScreening; this.createdAt = createdAt; this.screeningId = screeningId; this.review = review; diff --git a/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java b/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java index 6c32235..151c60e 100644 --- a/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java +++ b/Domain/src/main/java/com/example/domains/userscreening/adaptor/UserScreeningAdaptor.java @@ -1,6 +1,7 @@ package com.example.domains.userscreening.adaptor; import com.example.adaptor.Adaptor; +import com.example.domains.screening.entity.Screening; import com.example.domains.screeningReview.entity.QScreeningReview; import com.example.domains.screeningReview.entity.dto.ReviewResponseDto; import com.example.domains.screeningReview.entity.dto.ScreeningReviewResponseDto; @@ -18,6 +19,9 @@ import java.util.List; import java.util.Optional; +import static com.example.domains.screening.entity.QScreening.screening; +import static com.example.domains.userscreening.entity.QUserScreening.userScreening; + @Adaptor @RequiredArgsConstructor public class UserScreeningAdaptor { @@ -65,29 +69,43 @@ public void updateUserScreening(UserScreening userScreening) { public List findByUserId(Long userId) { return queryFactory - .selectFrom(QUserScreening.userScreening) - .where(QUserScreening.userScreening.isHost.eq(true),QUserScreening.userScreening.user.id.eq(userId)) + .selectFrom(userScreening) + .where(userScreening.isHost.eq(true), userScreening.user.id.eq(userId)) + .fetch(); + } + + public List findBookmarkedUserScreening(Long userId) { + return queryFactory + .select(screening) + .from(screening) + .join(userScreening).on(userScreening.screening.eq(screening)) // Join with Screening entity + .where( + userScreening.isHost.eq(false), + userScreening.user.id.eq(userId) + ) .fetch(); } + @Transactional public List getReviewListByScreening(Long userId, Long screeningId) { // Use QueryDSL to perform the projection List reviewResponseDtos = queryFactory .select(Projections.constructor( ScreeningReviewResponseDto.class, + QScreeningReview.screeningReview.id, QScreeningReview.screeningReview.afterScreening, QScreeningReview.screeningReview.createdAt, QScreeningReview.screeningReview.userScreening.screening.id, QScreeningReview.screeningReview.review )) .from(QScreeningReview.screeningReview) - .join(QUserScreening.userScreening) - .on(QUserScreening.userScreening.id.eq(QScreeningReview.screeningReview.userScreening.id) - .and(QUserScreening.userScreening.isHost.eq(false)) - .and(QUserScreening.userScreening.user.id.eq(userId))) - .where(QUserScreening.userScreening.screening.id.eq(screeningId)) + .join(userScreening) + .on(userScreening.id.eq(QScreeningReview.screeningReview.userScreening.id) + .and(userScreening.isHost.eq(false)) + .and(userScreening.user.id.eq(userId))) + .where(userScreening.screening.id.eq(screeningId)) .fetch(); From 1a155c7b528568b1fbf5b9352b7ea041302bf255 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Fri, 26 Jan 2024 00:32:27 +0900 Subject: [PATCH 6/9] =?UTF-8?q?feat:=20popcorn=20=EB=A6=AC=EB=B7=B0?= =?UTF-8?q?=EB=8B=AC=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Popcorn/controller/PopcornController.java | 32 +- .../dto/request/PostPopcornReviewRequest.java | 45 +++ .../dto/response/PopcornReviewResponse.java | 51 +++ .../service/PostPopcornReviewUseCase.java | 195 +++++++++++ .../api/screening/service/ReviewUseCase.java | 9 + .../popcorn/adaptor/PopcornAdaptor.java | 315 +++++++++++++++++- .../domains/popcorn/entity/Popcorn.java | 9 +- .../popcorn/enums/PopcornNegativeCount.java | 33 ++ .../popcorn/enums/PopcornPositiveCount.java | 34 ++ .../popcornReview/entity/PopcornReview.java | 75 ----- .../adaptor/PopcornUserAdaptor.java | 34 ++ .../popcornUser/entity/PopcornUser.java | 50 ++- .../entity/enums/PopcornNegative.java | 2 +- .../entity/enums/PopcornPositive.java | 5 +- .../repository/PopcornUserRepository.java | 11 + .../exceptions/NoMovieSearched.java | 11 + .../exceptions/RecommendedErrorCode.java | 4 +- .../screening/adaptor/ScreeningAdaptor.java | 29 ++ .../screening/enums/PositiveCount.java | 3 + .../entity/enums/Positive.java | 3 + 20 files changed, 860 insertions(+), 90 deletions(-) create mode 100644 Api/src/main/java/com/example/api/Popcorn/dto/request/PostPopcornReviewRequest.java create mode 100644 Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornReviewResponse.java create mode 100644 Api/src/main/java/com/example/api/Popcorn/service/PostPopcornReviewUseCase.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/enums/PopcornNegativeCount.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/enums/PopcornPositiveCount.java delete mode 100644 Domain/src/main/java/com/example/domains/popcornReview/entity/PopcornReview.java create mode 100644 Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java rename Domain/src/main/java/com/example/domains/{popcornReview => popcornUser}/entity/enums/PopcornNegative.java (93%) rename Domain/src/main/java/com/example/domains/{popcornReview => popcornUser}/entity/enums/PopcornPositive.java (82%) create mode 100644 Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java create mode 100644 Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/NoMovieSearched.java diff --git a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java index 2c00e28..19c7361 100644 --- a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java +++ b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java @@ -1,13 +1,16 @@ package com.example.api.Popcorn.controller; +import com.example.api.Popcorn.dto.request.PostPopcornReviewRequest; import com.example.api.Popcorn.dto.response.PopcornResponse; +import com.example.api.Popcorn.dto.response.PopcornReviewResponse; import com.example.api.Popcorn.service.GetPopcornUseCase; +import com.example.api.Popcorn.service.PostPopcornReviewUseCase; +import com.example.api.screening.dto.request.PostReviewRequest; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -18,17 +21,32 @@ @SecurityRequirement(name = "access-token") public class PopcornController { private final GetPopcornUseCase getPopcornUseCase; - //TODO 지난주 (테스트는 1분) 팝콘작 중 투표수 가장 높았던 것 3개 반환 + private final PostPopcornReviewUseCase postPopcornReviewUseCase; + @Operation(summary = "지난주 투표수 가장 높았던 3개 반환. 이번 주 상영작임", description = "이번 주 상영작 3개 가져오기") @GetMapping public List getPopcorn() { return getPopcornUseCase.execute(); } - //TODO 5. 팝콘작 리뷰하기 + //TODO 5. 팝콘작 리뷰하기, 중복 금지 + @Operation(summary = "특정 팝콘작에에 리뷰 달기", description = "popcorn id가져와서 리뷰하기") + @PostMapping("/review/{popcornId}") + public PopcornReviewResponse reviewOnScreening(@PathVariable("popcornId")Long popcornId, @RequestBody PostPopcornReviewRequest request) + { + return postPopcornReviewUseCase.execute(popcornId,request); + } + + //TODO 6. 팝콘작 팝콘지수 산출 로직 + + //TODO 7: 팝콘작 상세 페이지 - 팝콘지수 GET + + //TODO 8: 팝콘 키워드 Top3 GET + + //TODO 팝콘작들에 대한 리뷰 반환 + + //TODO 내가 쓴 팝콘작 리뷰 - //TODO 6. 팝콘작 팝콘지수 산출 - //TODO 7: 팝콘작 상세 페이지 } diff --git a/Api/src/main/java/com/example/api/Popcorn/dto/request/PostPopcornReviewRequest.java b/Api/src/main/java/com/example/api/Popcorn/dto/request/PostPopcornReviewRequest.java new file mode 100644 index 0000000..414bd9b --- /dev/null +++ b/Api/src/main/java/com/example/api/Popcorn/dto/request/PostPopcornReviewRequest.java @@ -0,0 +1,45 @@ +package com.example.api.Popcorn.dto.request; + +import com.example.domains.popcorn.entity.Popcorn; +import com.example.domains.popcornUser.entity.enums.PopcornNegative; +import com.example.domains.popcornUser.entity.enums.PopcornPositive; +import com.example.domains.screeningReview.entity.enums.Negative; +import com.example.domains.screeningReview.entity.enums.Positive; +import com.example.domains.user.entity.User; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +public class PostPopcornReviewRequest { + @Schema(defaultValue = "true", description = "관람 여부") + private boolean hasWatched; + @Schema(defaultValue = "true", description = "관람 전 만족도") + private boolean beforeScreening; + @Schema(defaultValue = "true", description = "관람 후 만족도") + private boolean afterScreening; + @Schema(defaultValue = "너무 좋았습니다", description = "텍스트 리뷰") + private String review; + + @Schema(defaultValue = "true", description = "정책 약관") + private boolean hasAgreed; + + @Schema(description = "Positive attributes") + private PopcornPositive popcornPositive; + @Schema(description = "Negative attributes") + private PopcornNegative popcornNegative; + + + @Builder + public PostPopcornReviewRequest(boolean hasWatched, boolean beforeScreening, boolean afterScreening, String review, boolean hasAgreed, PopcornPositive popcornPositive, PopcornNegative popcornNegative) { + this.hasWatched=hasWatched; + this.beforeScreening = beforeScreening; + this.afterScreening = afterScreening; + this.review = review; + this.hasAgreed =hasAgreed; + this.popcornPositive = popcornPositive; + this.popcornNegative = popcornNegative; + } +} diff --git a/Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornReviewResponse.java b/Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornReviewResponse.java new file mode 100644 index 0000000..446e78f --- /dev/null +++ b/Api/src/main/java/com/example/api/Popcorn/dto/response/PopcornReviewResponse.java @@ -0,0 +1,51 @@ +package com.example.api.Popcorn.dto.response; + +import com.example.domains.popcornUser.entity.PopcornUser; +import com.example.domains.popcornUser.entity.enums.PopcornNegative; +import com.example.domains.popcornUser.entity.enums.PopcornPositive; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class PopcornReviewResponse { + @Schema(defaultValue = "true", description = "관람 여부") + private boolean hasWatched; + @Schema(defaultValue = "true", description = "관람 전 만족도") + private boolean beforeScreening; + @Schema(defaultValue = "true", description = "관람 후 만족도") + private boolean afterScreening; + @Schema(defaultValue = "너무 좋았습니다", description = "텍스트 리뷰") + private String review; + + @Schema(defaultValue = "true", description = "정책 약관") + private boolean hasAgreed; + + @Schema(description = "Positive attributes") + private PopcornPositive popcornPositive; + @Schema(description = "Negative attributes") + private PopcornNegative popcornNegative; + + + @Builder + public PopcornReviewResponse(boolean hasWatched, boolean beforeScreening, boolean afterScreening, String review, boolean hasAgreed, PopcornPositive popcornPositive, PopcornNegative popcornNegative) { + this.hasWatched=hasWatched; + this.beforeScreening = beforeScreening; + this.afterScreening = afterScreening; + this.review = review; + this.hasAgreed =hasAgreed; + this.popcornPositive = popcornPositive; + this.popcornNegative = popcornNegative; + } + + public static PopcornReviewResponse from(PopcornUser popcornUser) { + return PopcornReviewResponse.builder() + .hasWatched(popcornUser.isHasWatched()) + .beforeScreening(popcornUser.isBeforeScreening()) + .afterScreening(popcornUser.isAfterScreening()) + .review(popcornUser.getReview()) + .popcornPositive(popcornUser.getPopcornPositive()) + .popcornNegative(popcornUser.getPopcornNegative()) + .build(); + } +} diff --git a/Api/src/main/java/com/example/api/Popcorn/service/PostPopcornReviewUseCase.java b/Api/src/main/java/com/example/api/Popcorn/service/PostPopcornReviewUseCase.java new file mode 100644 index 0000000..212192a --- /dev/null +++ b/Api/src/main/java/com/example/api/Popcorn/service/PostPopcornReviewUseCase.java @@ -0,0 +1,195 @@ +package com.example.api.Popcorn.service; + +import com.example.adaptor.UseCase; +import com.example.api.Popcorn.dto.request.PostPopcornReviewRequest; +import com.example.api.Popcorn.dto.response.PopcornReviewResponse; +import com.example.api.config.security.SecurityUtil; +import com.example.api.screening.dto.request.PostReviewRequest; +import com.example.api.screening.dto.response.PostReviewResponse; +import com.example.domains.popcorn.adaptor.PopcornAdaptor; +import com.example.domains.popcorn.entity.Popcorn; +import com.example.domains.popcornUser.adaptor.PopcornUserAdaptor; +import com.example.domains.popcornUser.entity.PopcornUser; +import com.example.domains.popcornUser.entity.enums.PopcornNegative; +import com.example.domains.popcornUser.entity.enums.PopcornPositive; +import com.example.domains.screening.adaptor.ScreeningAdaptor; +import com.example.domains.screening.entity.Screening; +import com.example.domains.screening.validator.ScreeningValidator; +import com.example.domains.screeningReview.adaptor.ReviewAdaptor; +import com.example.domains.screeningReview.entity.ScreeningReview; +import com.example.domains.screeningReview.entity.enums.Negative; +import com.example.domains.screeningReview.entity.enums.Positive; +import com.example.domains.screeningReview.validator.ReviewValidator; +import com.example.domains.user.adaptor.UserAdaptor; +import com.example.domains.user.entity.User; +import com.example.domains.user.validator.UserValidator; +import com.example.domains.userscreening.adaptor.UserScreeningAdaptor; +import com.example.domains.userscreening.entity.UserScreening; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@UseCase +@RequiredArgsConstructor +public class PostPopcornReviewUseCase { + + private final UserAdaptor userAdaptor; + private final ScreeningAdaptor screeningAdaptor; + private final PopcornUserAdaptor popcornUserAdaptor; + private final PopcornAdaptor popcornAdaptor; + + public PopcornReviewResponse execute(Long popcornId, PostPopcornReviewRequest request) { + Long userId = SecurityUtil.getCurrentUserId(); + User user = userAdaptor.findById(userId); + Popcorn popcorn = popcornAdaptor.findById(popcornId); + return reviewUpload(popcorn, user,request); + //save, userScreenId + } + + + private PopcornReviewResponse reviewUpload(Popcorn popcorn, User user, PostPopcornReviewRequest request) { + final PopcornUser newPopcornUser = PopcornUser.of( + request.isHasWatched(), + request.isBeforeScreening(), + request.isAfterScreening(), + request.getReview(), + request.isHasAgreed(), + request.getPopcornPositive(), + request.getPopcornNegative(), + user, + popcorn + ); + + calculateRate(request.isAfterScreening(),request.isBeforeScreening(),popcorn); + incrementNegative(request.getPopcornNegative(),popcorn); + incrementPositive(request.getPopcornPositive(),popcorn); + + + + //save + popcornUserAdaptor.save(newPopcornUser); + //screeningAdaptor.save(screening); + return PopcornReviewResponse.from(newPopcornUser); + } + @Transactional + public void calculateRate(boolean afterScreening,boolean beforeScreening,Popcorn popcorn) { + if(afterScreening == true && beforeScreening == true) { + popcornUserAdaptor.incrementPopcornRate(popcorn,100); + } else if(afterScreening == true && beforeScreening == false) { + popcornUserAdaptor.incrementPopcornRate(popcorn,25); + } else if(afterScreening == false && beforeScreening == true) { + popcornUserAdaptor.incrementPopcornRate(popcorn,75); + } else { + popcornUserAdaptor.incrementPopcornRate(popcorn,0); + } + } + + + @Transactional + public void incrementPositive(PopcornPositive positive, Popcorn popcorn) { + if (positive != null) { + if (positive.isCineMaster()) { + popcornAdaptor.incrementPositiveCineMaster(popcorn); + } + if (positive.isGreatFilming()) { + popcornAdaptor.incrementPositiveGreatFilming(popcorn); + } + if (positive.isPom()) { + popcornAdaptor.incrementPositivePom(popcorn); + } + if (positive.isAnimationIsGood()) { + popcornAdaptor.incrementPositiveAnimationIsGood(popcorn); + } + if (positive.isArtIsGood()) { + popcornAdaptor.incrementPositiveArtIsGood(popcorn); + } + if (positive.isSetIsArt()) { + popcornAdaptor.incrementPositiveSetIsArt(popcorn); + } + if (positive.isCustom()) { + popcornAdaptor.incrementPositiveCustom(popcorn); + } + if (positive.isMusic()) { + popcornAdaptor.incrementPositiveMusic(popcorn); + } + if (positive.isOst()) { + popcornAdaptor.incrementPositiveOst(popcorn); + } + if (positive.isWrittenByGod()) { + popcornAdaptor.incrementPositiveWrittenByGod(popcorn); + } + if (positive.isTopicIsGood()) { + popcornAdaptor.incrementPositiveTopicIsGood(popcorn); + } + if (positive.isLinesAreGood()) { + popcornAdaptor.incrementPositiveLinesAreGood(popcorn); + } + if (positive.isEndingIsGood()) { + popcornAdaptor.incrementPositiveEndingIsGood(popcorn); + } + if (positive.isCastingIsGood()) { + popcornAdaptor.incrementPositiveCastingIsGood(popcorn); + } + if (positive.isActingIsGood()) { + popcornAdaptor.incrementPositiveActingIsGood(popcorn); + } + if (positive.isChemistryIsGood()) { + popcornAdaptor.incrementPositiveChemistryIsGood(popcorn); + } + // Add similar checks for other positive attributes + } + + } + + + @Transactional + public void incrementNegative(PopcornNegative negative, Popcorn popcorn) { + + if ( negative != null) { + if ( negative.isIffy()) { + popcornAdaptor.incrementNegativeIffy(popcorn); + } + if ( negative.isBadEditing()) { + popcornAdaptor.incrementNegativeBadEditing(popcorn); + } + if ( negative.isBadAngle()) { + popcornAdaptor.incrementNegativeBadAngle(popcorn); + } + if ( negative.isBadDetail()) { + popcornAdaptor.incrementNegativeBadDetail(popcorn); + } + if ( negative.isBadColor()) { + popcornAdaptor.incrementNegativeBadColor(popcorn); + } + if ( negative.isBadCustom()) { + popcornAdaptor.incrementNegativeBadCustom(popcorn); + } + if ( negative.isBadMusic()) { + popcornAdaptor.incrementNegativeBadMusic(popcorn); + } + if ( negative.isBadSound()) { + popcornAdaptor.incrementNegativeBadSound(popcorn); + } + if ( negative.isBadEnding()) { + popcornAdaptor.incrementNegativeBadEnding(popcorn); + } + if ( negative.isEndingLoose()) { + popcornAdaptor.incrementNegativeEndingLoose(popcorn); + } + if ( negative.isNoDetail()) { + popcornAdaptor.incrementNegativeNoDetail(popcorn); + } + if ( negative.isBadTopic()) { + popcornAdaptor.incrementNegativeBadTopic(popcorn); + } + if ( negative.isBadActing()) { + popcornAdaptor.incrementNegativeBadActing(popcorn); + } + if ( negative.isBadCasting()) { + popcornAdaptor.incrementNegativeBadCasting(popcorn); + } + // Add similar checks for other negative attributes + } + + } + +} diff --git a/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java b/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java index bb6eb59..93baaa8 100644 --- a/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java +++ b/Api/src/main/java/com/example/api/screening/service/ReviewUseCase.java @@ -118,12 +118,21 @@ public void incrementPositive(Positive positive, Screening userScreening) { if (positive.isArtIsGood()) { screeningAdaptor.incrementPositiveArtIsGood(userScreening); } + if (positive.isSetIsArt()){ + screeningAdaptor.incrementPositiveSetIsArt(userScreening); + } if (positive.isCustom()) { screeningAdaptor.incrementPositiveCustom(userScreening); } if (positive.isMusic()) { screeningAdaptor.incrementPositiveMusic(userScreening); } + if (positive.isOst()) { + screeningAdaptor.incrementPositiveOst(userScreening); + } + if (positive.isWrittenByGod()){ + screeningAdaptor.incrementPositiveWrittenByGod(userScreening); + } if (positive.isTopicIsGood()) { screeningAdaptor.incrementPositiveTopicIsGood(userScreening); } diff --git a/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java b/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java index 70aebdb..583ae4b 100644 --- a/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java +++ b/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java @@ -7,7 +7,9 @@ import com.example.domains.popcorn.repository.PopcornRepository; import com.example.domains.recommendedPopcorn.entity.QRecommendedPopcorn; import com.example.domains.recommendedPopcorn.entity.RecommendedPopcorn; +import com.example.domains.screening.entity.QScreening; import com.querydsl.jpa.impl.JPAQueryFactory; +import com.querydsl.jpa.impl.JPAUpdateClause; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; @@ -23,7 +25,7 @@ @RequiredArgsConstructor public class PopcornAdaptor { private final PopcornRepository popcornRepository; - private final JPAQueryFactory queryFactory; + private final JPAQueryFactory jpaQueryFactory; @Transactional public void save(Popcorn popcorn){ @@ -47,7 +49,7 @@ public Popcorn convertToPopcorn(RecommendedPopcorn rp){ public List findTopThree() { QRecommendedPopcorn recommendedPopcorn = QRecommendedPopcorn.recommendedPopcorn; - return queryFactory + return jpaQueryFactory .selectFrom(recommendedPopcorn) .orderBy( recommendedPopcorn.recommendationCount.desc(), @@ -64,7 +66,7 @@ public List findLastWeekPopcorns() { LocalDate startOfLastWeek = today.minusDays(today.getDayOfWeek().getValue() + 6); // 지난 주의 월요일 LocalDate endOfLastWeek = startOfLastWeek.plusDays(6); // 지난 주의 일요일 - return queryFactory + return jpaQueryFactory .selectFrom(popcorn) .where(popcorn.createdAt.between(startOfLastWeek.atStartOfDay(), endOfLastWeek.atTime(23, 59, 59))) .orderBy( @@ -74,4 +76,311 @@ public List findLastWeekPopcorns() { .limit(3) .fetch(); } + + public Popcorn findById(Long popcornId){ + return popcornRepository.findById(popcornId).get(); + } + + @Transactional + public void incrementPositiveCineMaster(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.cineMaster, qpopcorn.popcornPostiveCount.cineMaster.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + + @Transactional + public void incrementPositiveGreatFilming(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.greatFilming, qpopcorn.popcornPostiveCount.greatFilming.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + + @Transactional + public void incrementPositivePom(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.pom, qpopcorn.popcornPostiveCount.pom.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveAnimationIsGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.animationIsGood, qpopcorn.popcornPostiveCount.animationIsGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveArtIsGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.artIsGood, qpopcorn.popcornPostiveCount.artIsGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveCustom(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.custom, qpopcorn.popcornPostiveCount.custom.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveMusic(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.music, qpopcorn.popcornPostiveCount.music.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveTopicIsGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.topicIsGood, qpopcorn.popcornPostiveCount.topicIsGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveLinesAreGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.linesAreGood, qpopcorn.popcornPostiveCount.linesAreGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveEndingIsGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.endingIsGood, qpopcorn.popcornPostiveCount.endingIsGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveCastingIsGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.castingIsGood, qpopcorn.popcornPostiveCount.castingIsGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveActingIsGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.actingIsGood, qpopcorn.popcornPostiveCount.actingIsGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveChemistryIsGood(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.chemistryIsGood, qpopcorn.popcornPostiveCount.chemistryIsGood.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeIffy(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.iffy, qpopcorn.popcornNegativeCount.iffy.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadEditing(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badEditing, qpopcorn.popcornNegativeCount.badEditing.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadAngle(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badAngle, qpopcorn.popcornNegativeCount.badAngle.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadDetail(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badDetail, qpopcorn.popcornNegativeCount.badDetail.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadColor(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badColor, qpopcorn.popcornNegativeCount.badColor.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadCustom(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badCustom, qpopcorn.popcornNegativeCount.badCustom.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadMusic(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badMusic, qpopcorn.popcornNegativeCount.badMusic.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadSound(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badSound, qpopcorn.popcornNegativeCount.badSound.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadEnding(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badEnding, qpopcorn.popcornNegativeCount.badEnding.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeEndingLoose(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.endingLoose, qpopcorn.popcornNegativeCount.endingLoose.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeNoDetail(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.noDetail, qpopcorn.popcornNegativeCount.noDetail.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadTopic(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badTopic, qpopcorn.popcornNegativeCount.badTopic.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadActing(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badActing, qpopcorn.popcornNegativeCount.badActing.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementNegativeBadCasting(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornNegativeCount.badCasting, qpopcorn.popcornNegativeCount.badCasting.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveSetIsArt(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.setIsArt, qpopcorn.popcornPostiveCount.setIsArt.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveOst(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.ost, qpopcorn.popcornPostiveCount.ost.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } + @Transactional + public void incrementPositiveWrittenByGod(Popcorn popcorn) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornPostiveCount.writtenByGod, qpopcorn.popcornPostiveCount.writtenByGod.add(1)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + } } diff --git a/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java b/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java index 2bb0339..f3401fe 100644 --- a/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java +++ b/Domain/src/main/java/com/example/domains/popcorn/entity/Popcorn.java @@ -1,7 +1,8 @@ package com.example.domains.popcorn.entity; import com.example.domains.common.model.BaseTimeEntity; -import com.example.domains.popcornReview.entity.PopcornReview; +import com.example.domains.popcorn.enums.PopcornNegativeCount; +import com.example.domains.popcorn.enums.PopcornPositiveCount; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -28,6 +29,12 @@ public class Popcorn extends BaseTimeEntity { private String directorName; private int recommendationCount; + @Embedded + private PopcornNegativeCount popcornNegativeCount = new PopcornNegativeCount(); + + @Embedded + private PopcornPositiveCount popcornPostiveCount = new PopcornPositiveCount(); + @Builder private Popcorn (String movieId,String movieTitle, String imageUrl, String movieDetail,String directorName, String recommendationReason,int recommendationCount) { diff --git a/Domain/src/main/java/com/example/domains/popcorn/enums/PopcornNegativeCount.java b/Domain/src/main/java/com/example/domains/popcorn/enums/PopcornNegativeCount.java new file mode 100644 index 0000000..2e7be92 --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/enums/PopcornNegativeCount.java @@ -0,0 +1,33 @@ +package com.example.domains.popcorn.enums; + +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@AllArgsConstructor +@NoArgsConstructor +public class PopcornNegativeCount { + + + private int iffy ; + private int badEditing ; + private int badAngle ; + private int badDetail; + + private int badColor ; + private int badCustom; + private int badMusic ; + private int badSound; + private int badEnding ; + private int endingLoose ; + + private int noDetail ; + private int badTopic ; + + private int badActing ; + private int badCasting ; +} + diff --git a/Domain/src/main/java/com/example/domains/popcorn/enums/PopcornPositiveCount.java b/Domain/src/main/java/com/example/domains/popcorn/enums/PopcornPositiveCount.java new file mode 100644 index 0000000..34e020f --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/enums/PopcornPositiveCount.java @@ -0,0 +1,34 @@ +package com.example.domains.popcorn.enums; + +import jakarta.persistence.Embeddable; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Embeddable +@AllArgsConstructor +@NoArgsConstructor +public class PopcornPositiveCount { + + private int cineMaster; + private int greatFilming; + private int pom; + private int animationIsGood; + private int artIsGood; + private int setIsArt; + private int custom; + private int music; + private int ost; + private int writtenByGod; + private int topicIsGood; + private int linesAreGood; + private int endingIsGood; + + private int castingIsGood; + + private int actingIsGood; + + private int chemistryIsGood; + +} \ No newline at end of file diff --git a/Domain/src/main/java/com/example/domains/popcornReview/entity/PopcornReview.java b/Domain/src/main/java/com/example/domains/popcornReview/entity/PopcornReview.java deleted file mode 100644 index 384258a..0000000 --- a/Domain/src/main/java/com/example/domains/popcornReview/entity/PopcornReview.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.example.domains.popcornReview.entity; - -import com.example.domains.common.model.BaseTimeEntity; -import com.example.domains.popcorn.entity.Popcorn; -import com.example.domains.popcornReview.entity.enums.PopcornNegative; -import com.example.domains.popcornReview.entity.enums.PopcornPositive; -import com.example.domains.popcornUser.entity.PopcornUser; -import com.example.domains.screeningReview.entity.ScreeningReview; -import com.example.domains.screeningReview.entity.enums.Negative; -import com.example.domains.screeningReview.entity.enums.Positive; -import com.example.domains.userscreening.entity.UserScreening; -import jakarta.persistence.*; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PopcornReview extends BaseTimeEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String review; - - private int likes; - private boolean afterScreening; - private boolean movieReview; - private boolean locationReview; - private boolean serviceReview; - private boolean hasAgreed; - private int complaintCount; - - private boolean isBlind; - - @Embedded - private PopcornPositive popcornPositive; - - @Embedded - private PopcornNegative popcornNegative; - @OneToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "popcorn_user_id") - private PopcornUser popcornUser; - - - @Builder - private PopcornReview(boolean afterScreening, boolean movieReview, boolean locationReview,boolean serviceReview, String review, boolean hasAgreed,PopcornPositive popcornPositive,PopcornNegative popcornNegative,PopcornUser popcornUser) { - this.afterScreening = afterScreening; - this.movieReview = movieReview; - this.locationReview = locationReview; - this.serviceReview = serviceReview; - this.review = review; - this.hasAgreed =hasAgreed; - this.popcornPositive = popcornPositive; - this.popcornNegative = popcornNegative; - this.popcornUser = popcornUser; - } - - public static PopcornReview of(boolean afterScreening, boolean movieReview, boolean locationReview, boolean serviceReview, String review, boolean hasAgreed,PopcornPositive popcornPositive,PopcornNegative popcornNegative,PopcornUser popcornUser) { - return PopcornReview.builder() - .afterScreening(afterScreening) - .movieReview(movieReview) - .locationReview(locationReview) - .serviceReview(serviceReview) - .review(review) - .hasAgreed(hasAgreed) - .popcornPositive(popcornPositive) - .popcornNegative(popcornNegative) - .popcornUser(popcornUser) - .build(); - - } -} diff --git a/Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java b/Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java new file mode 100644 index 0000000..cc095b3 --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java @@ -0,0 +1,34 @@ +package com.example.domains.popcornUser.adaptor; + +import com.example.adaptor.Adaptor; +import com.example.domains.popcorn.entity.Popcorn; +import com.example.domains.popcorn.entity.QPopcorn; +import com.example.domains.popcornUser.entity.PopcornUser; +import com.example.domains.popcornUser.repository.PopcornUserRepository; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.querydsl.jpa.impl.JPAUpdateClause; +import lombok.RequiredArgsConstructor; +import org.springframework.transaction.annotation.Transactional; + +@Adaptor +@RequiredArgsConstructor +public class PopcornUserAdaptor { + private final PopcornUserRepository popcornUserRepository; + private final JPAQueryFactory jpaQueryFactory; + public void save(PopcornUser popcornUser) { + popcornUserRepository.save(popcornUser); + } + + @Transactional + public void incrementPopcornRate(Popcorn popcorn, int i) { + QPopcorn qpopcorn = QPopcorn.popcorn; + JPAUpdateClause updateClause = jpaQueryFactory.update(qpopcorn); + + updateClause + .set(qpopcorn.popcornRate, qpopcorn.popcornRate.add(i)) + .where(qpopcorn.id.eq(popcorn.getId())) + .execute(); + + } +// int total = popcornUserRepository.findAllByPopcornId(popcorn.getId()).size(); +} diff --git a/Domain/src/main/java/com/example/domains/popcornUser/entity/PopcornUser.java b/Domain/src/main/java/com/example/domains/popcornUser/entity/PopcornUser.java index fdff7d8..3334ea2 100644 --- a/Domain/src/main/java/com/example/domains/popcornUser/entity/PopcornUser.java +++ b/Domain/src/main/java/com/example/domains/popcornUser/entity/PopcornUser.java @@ -2,10 +2,12 @@ import com.example.domains.common.model.BaseTimeEntity; import com.example.domains.popcorn.entity.Popcorn; -import com.example.domains.screening.entity.Screening; +import com.example.domains.popcornUser.entity.enums.PopcornNegative; +import com.example.domains.popcornUser.entity.enums.PopcornPositive; import com.example.domains.user.entity.User; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,6 +15,7 @@ @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) public class PopcornUser extends BaseTimeEntity { + //Popcorn이랑 User사이에 있는 엔티티, 리뷰 작성도 여기서 이루어짐 @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @@ -24,4 +27,49 @@ public class PopcornUser extends BaseTimeEntity { @ManyToOne @JoinColumn(name = "popcorn_id") private Popcorn popcorn; + + + private String review; + + private int likes; + private boolean hasWatched; + private boolean beforeScreening; + private boolean afterScreening; + private boolean hasAgreed; + private int complaintCount; + + private boolean isBlind; + + @Embedded + private PopcornPositive popcornPositive; + + @Embedded + private PopcornNegative popcornNegative; + + @Builder + private PopcornUser (boolean hasWatched,boolean beforeScreening,boolean afterScreening, String review, boolean hasAgreed,PopcornPositive popcornPositive,PopcornNegative popcornNegative,User user, Popcorn popcorn) { + this.hasWatched=hasWatched; + this.beforeScreening = beforeScreening; + this.afterScreening = afterScreening; + this.review = review; + this.hasAgreed =hasAgreed; + this.popcornPositive = popcornPositive; + this.popcornNegative = popcornNegative; + this.user = user; + this.popcorn = popcorn; + } + + public static PopcornUser of(boolean hasWatched,boolean beforeScreening,boolean afterScreening, String review, boolean hasAgreed,PopcornPositive popcornPositive,PopcornNegative popcornNegative,User user, Popcorn popcorn){ + return PopcornUser.builder() + .hasWatched(hasWatched) + .beforeScreening(beforeScreening) + .afterScreening(afterScreening) + .review(review) + .hasWatched(hasAgreed) + .popcornPositive(popcornPositive) + .popcornNegative(popcornNegative) + .user(user) + .popcorn(popcorn) + .build(); + } } diff --git a/Domain/src/main/java/com/example/domains/popcornReview/entity/enums/PopcornNegative.java b/Domain/src/main/java/com/example/domains/popcornUser/entity/enums/PopcornNegative.java similarity index 93% rename from Domain/src/main/java/com/example/domains/popcornReview/entity/enums/PopcornNegative.java rename to Domain/src/main/java/com/example/domains/popcornUser/entity/enums/PopcornNegative.java index cfcea9a..e1ef28f 100644 --- a/Domain/src/main/java/com/example/domains/popcornReview/entity/enums/PopcornNegative.java +++ b/Domain/src/main/java/com/example/domains/popcornUser/entity/enums/PopcornNegative.java @@ -1,4 +1,4 @@ -package com.example.domains.popcornReview.entity.enums; +package com.example.domains.popcornUser.entity.enums; import jakarta.persistence.Embeddable; import lombok.AccessLevel; diff --git a/Domain/src/main/java/com/example/domains/popcornReview/entity/enums/PopcornPositive.java b/Domain/src/main/java/com/example/domains/popcornUser/entity/enums/PopcornPositive.java similarity index 82% rename from Domain/src/main/java/com/example/domains/popcornReview/entity/enums/PopcornPositive.java rename to Domain/src/main/java/com/example/domains/popcornUser/entity/enums/PopcornPositive.java index 2ae9c65..b856389 100644 --- a/Domain/src/main/java/com/example/domains/popcornReview/entity/enums/PopcornPositive.java +++ b/Domain/src/main/java/com/example/domains/popcornUser/entity/enums/PopcornPositive.java @@ -1,4 +1,4 @@ -package com.example.domains.popcornReview.entity.enums; +package com.example.domains.popcornUser.entity.enums; import jakarta.persistence.Embeddable; import lombok.AccessLevel; @@ -15,8 +15,11 @@ public class PopcornPositive { private boolean pom = false; private boolean animationIsGood = false; private boolean artIsGood = false; + private boolean setIsArt = false; private boolean custom = false; private boolean music = false; + private boolean ost = false; + private boolean writtenByGod = false; private boolean topicIsGood = false; private boolean linesAreGood = false; private boolean endingIsGood = false; diff --git a/Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java b/Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java new file mode 100644 index 0000000..cad6ed7 --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java @@ -0,0 +1,11 @@ +package com.example.domains.popcornUser.repository; + +import com.example.domains.popcornUser.entity.PopcornUser; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; +import java.util.Optional; + +public interface PopcornUserRepository extends JpaRepository { + List findAllByPopcornId(Long id); +} diff --git a/Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/NoMovieSearched.java b/Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/NoMovieSearched.java new file mode 100644 index 0000000..64c5a90 --- /dev/null +++ b/Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/NoMovieSearched.java @@ -0,0 +1,11 @@ +package com.example.domains.recommendedPopcorn.exceptions; + +import com.example.error.BaseErrorException; + +public class NoMovieSearched extends BaseErrorException { + public static final BaseErrorException EXCEPTION = new NoMovieSearched(); + + private NoMovieSearched () { + super(RecommendedErrorCode.DUPLICATE_MOVIE); + } +} diff --git a/Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/RecommendedErrorCode.java b/Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/RecommendedErrorCode.java index 0800f8b..8ea17e5 100644 --- a/Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/RecommendedErrorCode.java +++ b/Domain/src/main/java/com/example/domains/recommendedPopcorn/exceptions/RecommendedErrorCode.java @@ -9,7 +9,9 @@ @Getter @AllArgsConstructor public enum RecommendedErrorCode implements BaseErrorCode { - DUPLICATE_MOVIE(409,"MOVIE_404", "중복된 영화가 존재합니다"); + No_MOVIE_FOUND(404,"MOVIE_404", "영화가 존재하지 않습니다"), + DUPLICATE_MOVIE(409,"MOVIE_409", "중복된 영화가 존재합니다"); + private int status; private String code; private String reason; diff --git a/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java b/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java index de64019..7d4253c 100644 --- a/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java +++ b/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java @@ -564,5 +564,34 @@ public void incrementAfterScreening(Screening screening) { .execute(); } + @Transactional + public void incrementPositiveSetIsArt(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.positiveCount.setIsArt, qScreening.positiveCount.setIsArt.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + @Transactional + public void incrementPositiveWrittenByGod(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + updateClause + .set(qScreening.positiveCount.writtenByGod, qScreening.positiveCount.writtenByGod.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } + @Transactional + public void incrementPositiveOst(Screening screening) { + QScreening qScreening = QScreening.screening; + JPAUpdateClause updateClause = jpaQueryFactory.update(qScreening); + + updateClause + .set(qScreening.positiveCount.ost, qScreening.positiveCount.ost.add(1)) + .where(qScreening.id.eq(screening.getId())) + .execute(); + } } diff --git a/Domain/src/main/java/com/example/domains/screening/enums/PositiveCount.java b/Domain/src/main/java/com/example/domains/screening/enums/PositiveCount.java index d72ef70..66739ce 100644 --- a/Domain/src/main/java/com/example/domains/screening/enums/PositiveCount.java +++ b/Domain/src/main/java/com/example/domains/screening/enums/PositiveCount.java @@ -18,8 +18,11 @@ public class PositiveCount { private int pom; private int animationIsGood; private int artIsGood; + private int setIsArt; private int custom; private int music; + private int ost; + private int writtenByGod; private int topicIsGood; private int linesAreGood; private int endingIsGood; diff --git a/Domain/src/main/java/com/example/domains/screeningReview/entity/enums/Positive.java b/Domain/src/main/java/com/example/domains/screeningReview/entity/enums/Positive.java index 279b2df..d4e7f20 100644 --- a/Domain/src/main/java/com/example/domains/screeningReview/entity/enums/Positive.java +++ b/Domain/src/main/java/com/example/domains/screeningReview/entity/enums/Positive.java @@ -14,8 +14,11 @@ public class Positive { private boolean pom = false; private boolean animationIsGood = false; private boolean artIsGood = false; + private boolean setIsArt = false; private boolean custom = false; private boolean music = false; + private boolean ost = false; + private boolean writtenByGod = false; private boolean topicIsGood = false; private boolean linesAreGood = false; private boolean endingIsGood = false; From 5c44bd5cb1765a272263bcfc5fadc17e6c3c6af9 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Fri, 26 Jan 2024 15:46:21 +0900 Subject: [PATCH 7/9] =?UTF-8?q?feat:=20popcorn=EC=9E=91=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20top3=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Popcorn/controller/PopcornController.java | 39 ++++++-- .../service/GetPopcornReviewUseCase.java | 57 ++++++++++++ .../service/GetTopRatedPopcornKeyword.java | 69 ++++++++++++++ .../controller/ScreeningController.java | 1 - .../popcorn/adaptor/PopcornAdaptor.java | 54 +++++++++++ .../entity/dto/PopcornKeywordResponseDto.java | 93 +++++++++++++++++++ .../adaptor/PopcornUserAdaptor.java | 14 +++ .../repository/PopcornUserRepository.java | 4 + .../screening/adaptor/ScreeningAdaptor.java | 17 +++- .../entity/dto/ScreeningResponseDto.java | 4 +- 10 files changed, 339 insertions(+), 13 deletions(-) create mode 100644 Api/src/main/java/com/example/api/Popcorn/service/GetPopcornReviewUseCase.java create mode 100644 Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java create mode 100644 Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornKeywordResponseDto.java diff --git a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java index 19c7361..a7c4d7b 100644 --- a/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java +++ b/Api/src/main/java/com/example/api/Popcorn/controller/PopcornController.java @@ -3,9 +3,13 @@ import com.example.api.Popcorn.dto.request.PostPopcornReviewRequest; import com.example.api.Popcorn.dto.response.PopcornResponse; import com.example.api.Popcorn.dto.response.PopcornReviewResponse; +import com.example.api.Popcorn.service.GetPopcornReviewUseCase; import com.example.api.Popcorn.service.GetPopcornUseCase; +import com.example.api.Popcorn.service.GetTopRatedPopcornKeyword; import com.example.api.Popcorn.service.PostPopcornReviewUseCase; import com.example.api.screening.dto.request.PostReviewRequest; +import com.example.domains.popcorn.entity.Popcorn; +import com.example.domains.popcorn.entity.dto.PopcornKeywordResponseDto; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import lombok.RequiredArgsConstructor; @@ -13,6 +17,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.Map; @RestController @RequestMapping("/popcorn") @@ -22,6 +27,9 @@ public class PopcornController { private final GetPopcornUseCase getPopcornUseCase; private final PostPopcornReviewUseCase postPopcornReviewUseCase; + private final GetPopcornReviewUseCase getPopcornReviewUseCase; + + private final GetTopRatedPopcornKeyword getTopRatedPopcornKeyword; @Operation(summary = "지난주 투표수 가장 높았던 3개 반환. 이번 주 상영작임", description = "이번 주 상영작 3개 가져오기") @GetMapping public List getPopcorn() { @@ -31,22 +39,39 @@ public List getPopcorn() { //TODO 5. 팝콘작 리뷰하기, 중복 금지 @Operation(summary = "특정 팝콘작에에 리뷰 달기", description = "popcorn id가져와서 리뷰하기") @PostMapping("/review/{popcornId}") - public PopcornReviewResponse reviewOnScreening(@PathVariable("popcornId")Long popcornId, @RequestBody PostPopcornReviewRequest request) - { - return postPopcornReviewUseCase.execute(popcornId,request); + public PopcornReviewResponse reviewOnScreening(@PathVariable("popcornId") Long popcornId, @RequestBody PostPopcornReviewRequest request) { + return postPopcornReviewUseCase.execute(popcornId, request); } - //TODO 6. 팝콘작 팝콘지수 산출 로직 - - //TODO 7: 팝콘작 상세 페이지 - 팝콘지수 GET - //TODO 8: 팝콘 키워드 Top3 GET + //TODO 7: 팝콘작 팝콘지수 산출 로직 팝콘지수 GET + @Operation(summary = "특정 팝콘작들에 대한 팝콘 지수", description = "popcornId 가져와서 요청하기") + @GetMapping("/rate/{popcornId}") + public int popcornRate(@PathVariable("popcornId") Long popcornId) { + return getPopcornReviewUseCase.getRate(popcornId); + } //TODO 팝콘작들에 대한 리뷰 반환 + @Operation(summary = "팝콘작들에 대한 리뷰 반환", description = "popcornId 가져와서 요청하기") + @GetMapping("/reviews/{popcornId}") + public List reviewResponseList(@PathVariable("popcornId") Long popcornId) { + return getPopcornReviewUseCase.execute(popcornId); + } //TODO 내가 쓴 팝콘작 리뷰 + @Operation(summary = "팝콘작들에 대한 나의 리뷰 반환", description = "popcornId 가져와서 요청하기") + @GetMapping("/my/reviews") + public List reviewMyResponseList() { + return getPopcornReviewUseCase.getMyReviews(); + } + //TODO 8: 팝콘 키워드 Top3 GET + @Operation(summary = "팝콘작들에 대한 나의 리뷰 반환", description = "popcornId 가져와서 요청하기") + @GetMapping("/top-keywords/{popcornId}") + public List> reviewMyResponseList(@PathVariable("popcornId") Long popcornId){ + return getTopRatedPopcornKeyword.execute(popcornId); + } } diff --git a/Api/src/main/java/com/example/api/Popcorn/service/GetPopcornReviewUseCase.java b/Api/src/main/java/com/example/api/Popcorn/service/GetPopcornReviewUseCase.java new file mode 100644 index 0000000..d6ff025 --- /dev/null +++ b/Api/src/main/java/com/example/api/Popcorn/service/GetPopcornReviewUseCase.java @@ -0,0 +1,57 @@ +package com.example.api.Popcorn.service; + +import com.example.adaptor.UseCase; +import com.example.api.Popcorn.dto.response.PopcornReviewResponse; +import com.example.api.config.security.SecurityUtil; +import com.example.domains.popcorn.adaptor.PopcornAdaptor; +import com.example.domains.popcorn.entity.Popcorn; +import com.example.domains.popcornUser.adaptor.PopcornUserAdaptor; +import com.example.domains.popcornUser.entity.PopcornUser; +import lombok.RequiredArgsConstructor; + +import java.util.ArrayList; +import java.util.List; + +@UseCase +@RequiredArgsConstructor +public class GetPopcornReviewUseCase { + private final PopcornUserAdaptor popcornUserAdaptor; + private final PopcornAdaptor popcornAdaptor; + public List execute(Long popcornId) { + List popcornUserList = popcornUserAdaptor.findAllByPopcornId(popcornId); + List popcornReviewResponses = new ArrayList<>(); + for (PopcornUser popcornUser : popcornUserList) { + final PopcornReviewResponse newPopcornReview = PopcornReviewResponse.from(popcornUser); + popcornReviewResponses.add(newPopcornReview); + } + return popcornReviewResponses; + } + + public List getMyReviews() { + Long userId = SecurityUtil.getCurrentUserId(); + List popcornUserList = popcornUserAdaptor.findAllByUserId(userId); + List popcornReviewResponses = new ArrayList<>(); + + for (PopcornUser popcornUser : popcornUserList) { + final PopcornReviewResponse newPopcornReview = PopcornReviewResponse.from(popcornUser); + popcornReviewResponses.add(newPopcornReview); + } + return popcornReviewResponses; + } + + public int getRate(Long popcornId) { + List popcornUsers = popcornUserAdaptor.findAllByPopcornId(popcornId); + int length = popcornUsers.size(); + + if (length == 0) { + // Handle the case where there are no users to avoid division by zero + return 0; // Or you can choose a default value or throw an exception + } + + int totalNumber = popcornAdaptor.findById(popcornId).getPopcornRate(); + + // Perform rounding and return the result + return Math.round((float) totalNumber / length); + + } +} diff --git a/Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java b/Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java new file mode 100644 index 0000000..ecddeb1 --- /dev/null +++ b/Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java @@ -0,0 +1,69 @@ +package com.example.api.Popcorn.service; + +import com.example.adaptor.UseCase; +import com.example.domains.popcorn.adaptor.PopcornAdaptor; +import com.example.domains.popcorn.entity.dto.PopcornKeywordResponseDto; +import lombok.RequiredArgsConstructor; + +import java.util.*; +import java.util.stream.Collectors; + +@UseCase +@RequiredArgsConstructor +public class GetTopRatedPopcornKeyword { + private final PopcornAdaptor popcornAdaptor; + public List> execute(Long popcornId) { + PopcornKeywordResponseDto keywordList = popcornAdaptor.getTopRatedCounts(popcornId); + + Map newList = addingToList(keywordList); + // 내림차순으로 정렬 +// Map을 리스트로 변환 + List> sortedList = newList.entrySet() + .stream() + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .limit(3) + .collect(Collectors.toList()); + + + return sortedList; + } + + private Map addingToList(PopcornKeywordResponseDto keywordList) { + Map valueMap = new HashMap<>(); + valueMap.put("cineMaster", keywordList.getCineMaster()); + valueMap.put("greatFilming", keywordList.getGreatFilming()); + valueMap.put("pom", keywordList.getPom()); + valueMap.put("animationIsGood", keywordList.getAnimationIsGood()); + valueMap.put("artIsGood", keywordList.getArtIsGood()); + valueMap.put("setIsArt", keywordList.getSetIsArt()); + valueMap.put("custom", keywordList.getCustom()); + valueMap.put("music", keywordList.getMusic()); + valueMap.put("ost", keywordList.getOst()); + valueMap.put("writtenByGod", keywordList.getWrittenByGod()); + valueMap.put("topicIsGood", keywordList.getTopicIsGood()); + valueMap.put("linesAreGood", keywordList.getLinesAreGood()); + valueMap.put("endingIsGood", keywordList.getEndingIsGood()); + valueMap.put("castingIsGood", keywordList.getCastingIsGood()); + valueMap.put("actingIsGood", keywordList.getActingIsGood()); + valueMap.put("chemistryIsGood", keywordList.getChemistryIsGood()); + valueMap.put("iffy", keywordList.getIffy()); + valueMap.put("badEditing", keywordList.getBadEditing()); + valueMap.put("badAngle", keywordList.getBadAngle()); + valueMap.put("badDetail", keywordList.getBadDetail()); + valueMap.put("badColor", keywordList.getBadColor()); + valueMap.put("badCustom", keywordList.getBadCustom()); + valueMap.put("badMusic", keywordList.getBadMusic()); + valueMap.put("badSound", keywordList.getBadSound()); + valueMap.put("badEnding", keywordList.getBadEnding()); + valueMap.put("endingLoose", keywordList.getEndingLoose()); + valueMap.put("noDetail", keywordList.getNoDetail()); + valueMap.put("badTopic", keywordList.getBadTopic()); + valueMap.put("badActing", keywordList.getBadActing()); + valueMap.put("badCasting", keywordList.getBadCasting()); + + return valueMap; + } + + + //TODO Positive먼저 나오게 +} diff --git a/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java b/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java index f6c4a9a..2638c99 100644 --- a/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java +++ b/Api/src/main/java/com/example/api/screening/controller/ScreeningController.java @@ -184,7 +184,6 @@ public List getMostReviewed() { return screeningAdaptor.getMostReviewed(); } - // private 0 @Operation(summary = "현재시점에서 이번주 상영작 3개 반환", description = "현재시점에서 다음주 상영작 3개 반환") @GetMapping("/upcoming-Screening") public List getTopThreeScreening() { diff --git a/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java b/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java index 583ae4b..a595bbb 100644 --- a/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java +++ b/Domain/src/main/java/com/example/domains/popcorn/adaptor/PopcornAdaptor.java @@ -3,23 +3,30 @@ import com.example.adaptor.Adaptor; import com.example.domains.popcorn.entity.Popcorn; import com.example.domains.popcorn.entity.QPopcorn; +import com.example.domains.popcorn.entity.dto.PopcornKeywordResponseDto; import com.example.domains.popcorn.entity.dto.PopcornResponseDto; +import com.example.domains.popcorn.entity.dto.QPopcornKeywordResponseDto; import com.example.domains.popcorn.repository.PopcornRepository; import com.example.domains.recommendedPopcorn.entity.QRecommendedPopcorn; import com.example.domains.recommendedPopcorn.entity.RecommendedPopcorn; import com.example.domains.screening.entity.QScreening; +import com.querydsl.core.Tuple; import com.querydsl.jpa.impl.JPAQueryFactory; import com.querydsl.jpa.impl.JPAUpdateClause; import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; +import java.lang.reflect.Field; import java.time.LocalDate; import java.time.temporal.TemporalField; import java.time.temporal.WeekFields; +import java.util.ArrayList; import java.util.List; import java.util.Locale; +import java.util.stream.Collectors; import static com.example.domains.diverseMovie.entity.QDiverseMovie.diverseMovie; +import static com.example.domains.popcorn.entity.QPopcorn.popcorn; @Adaptor @RequiredArgsConstructor @@ -383,4 +390,51 @@ public void incrementPositiveWrittenByGod(Popcorn popcorn) { .where(qpopcorn.id.eq(popcorn.getId())) .execute(); } +// +public PopcornKeywordResponseDto getTopRatedCounts(Long popcornId) { + PopcornKeywordResponseDto resultList = jpaQueryFactory + .select(new QPopcornKeywordResponseDto( + popcorn.popcornPostiveCount.cineMaster, + popcorn.popcornPostiveCount.greatFilming, + popcorn.popcornPostiveCount.animationIsGood, + popcorn.popcornPostiveCount.artIsGood, + popcorn.popcornPostiveCount.pom, + popcorn.popcornPostiveCount.setIsArt, + popcorn.popcornPostiveCount.custom, + popcorn.popcornPostiveCount.music, + popcorn.popcornPostiveCount.ost, + popcorn.popcornPostiveCount.writtenByGod, + popcorn.popcornPostiveCount.topicIsGood, + popcorn.popcornPostiveCount.linesAreGood, + popcorn.popcornPostiveCount.endingIsGood, + popcorn.popcornPostiveCount.castingIsGood, + popcorn.popcornPostiveCount.actingIsGood, + popcorn.popcornPostiveCount.chemistryIsGood, + popcorn.popcornNegativeCount.iffy, + popcorn.popcornNegativeCount.badEditing, + popcorn.popcornNegativeCount.badAngle, + popcorn.popcornNegativeCount.badDetail, + popcorn.popcornNegativeCount.badColor, + popcorn.popcornNegativeCount.badCustom, + popcorn.popcornNegativeCount.badMusic, + popcorn.popcornNegativeCount.badSound, + popcorn.popcornNegativeCount.badEnding, + popcorn.popcornNegativeCount.endingLoose, + popcorn.popcornNegativeCount.noDetail, + popcorn.popcornNegativeCount.badTopic, + popcorn.popcornNegativeCount.badActing, + popcorn.popcornNegativeCount.badCasting + )) + .from(popcorn) + .where(popcorn.id.eq(popcornId)) + .fetchOne(); + + + return resultList; + + +// .where(popcorn.id.eq(popcornId)) +// .orderBy(popcorn.popcornPostiveCount.desc()) +// .limit(3) +} } diff --git a/Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornKeywordResponseDto.java b/Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornKeywordResponseDto.java new file mode 100644 index 0000000..fa251f1 --- /dev/null +++ b/Domain/src/main/java/com/example/domains/popcorn/entity/dto/PopcornKeywordResponseDto.java @@ -0,0 +1,93 @@ +package com.example.domains.popcorn.entity.dto; + +import com.querydsl.core.annotations.QueryProjection; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; + +@Getter +@NoArgsConstructor +public class PopcornKeywordResponseDto { + private int cineMaster; + private int greatFilming; + private int pom; + private int animationIsGood; + private int artIsGood; + private int setIsArt; + private int custom; + private int music; + private int ost; + private int writtenByGod; + private int topicIsGood; + private int linesAreGood; + private int endingIsGood; + + private int castingIsGood; + + private int actingIsGood; + + private int chemistryIsGood; + + + private int iffy ; + private int badEditing ; + private int badAngle ; + private int badDetail; + + private int badColor ; + private int badCustom; + private int badMusic ; + private int badSound; + private int badEnding ; + private int endingLoose ; + + private int noDetail ; + private int badTopic ; + + private int badActing ; + private int badCasting ; + + @QueryProjection + public PopcornKeywordResponseDto( + int cineMaster, int greatFilming, int pom, int animationIsGood, int artIsGood, + int setIsArt, int custom, int music, int ost, int writtenByGod, int topicIsGood, + int linesAreGood, int endingIsGood, int castingIsGood, int actingIsGood, + int chemistryIsGood, int iffy, int badEditing, int badAngle, int badDetail, + int badColor, int badCustom, int badMusic, int badSound, int badEnding, + int endingLoose, int noDetail, int badTopic, int badActing, int badCasting + ) { + this.cineMaster = cineMaster; + this.greatFilming = greatFilming; + this.pom = pom; + this.animationIsGood = animationIsGood; + this.artIsGood = artIsGood; + this.setIsArt = setIsArt; + this.custom = custom; + this.music = music; + this.ost = ost; + this.writtenByGod = writtenByGod; + this.topicIsGood = topicIsGood; + this.linesAreGood = linesAreGood; + this.endingIsGood = endingIsGood; + this.castingIsGood = castingIsGood; + this.actingIsGood = actingIsGood; + this.chemistryIsGood = chemistryIsGood; + + this.iffy = iffy; + this.badEditing = badEditing; + this.badAngle = badAngle; + this.badDetail = badDetail; + this.badColor = badColor; + this.badCustom = badCustom; + this.badMusic = badMusic; + this.badSound = badSound; + this.badEnding = badEnding; + this.endingLoose = endingLoose; + this.noDetail = noDetail; + this.badTopic = badTopic; + this.badActing = badActing; + this.badCasting = badCasting; + + // ... set other fields + } +} diff --git a/Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java b/Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java index cc095b3..3ac694d 100644 --- a/Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java +++ b/Domain/src/main/java/com/example/domains/popcornUser/adaptor/PopcornUserAdaptor.java @@ -10,6 +10,8 @@ import lombok.RequiredArgsConstructor; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Adaptor @RequiredArgsConstructor public class PopcornUserAdaptor { @@ -30,5 +32,17 @@ public void incrementPopcornRate(Popcorn popcorn, int i) { .execute(); } + + public List findAllByPopcornId(Long popcornId) { + return popcornUserRepository.findAllByPopcornId(popcornId); + } + + public List findAllByPopcornIdAndUserId(Long popcornId, Long userId) { + return popcornUserRepository.findAllByPopcornIdAndUserId(popcornId,userId); + } + + public List findAllByUserId(Long userId) { + return popcornUserRepository.findAllByUserId(userId); + } // int total = popcornUserRepository.findAllByPopcornId(popcorn.getId()).size(); } diff --git a/Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java b/Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java index cad6ed7..53c9f95 100644 --- a/Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java +++ b/Domain/src/main/java/com/example/domains/popcornUser/repository/PopcornUserRepository.java @@ -8,4 +8,8 @@ public interface PopcornUserRepository extends JpaRepository { List findAllByPopcornId(Long id); + + List findAllByPopcornIdAndUserId(Long popcornId, Long userId); + + List findAllByUserId(Long userId); } diff --git a/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java b/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java index 7d4253c..4fe5849 100644 --- a/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java +++ b/Domain/src/main/java/com/example/domains/screening/adaptor/ScreeningAdaptor.java @@ -74,9 +74,12 @@ public List getTopThree() { QScreening.screening.screeningStartDate, QScreening.screening.screeningEndDate, QScreening.screening.screeningStartTime, - QScreening.screening.isPrivate + QScreening.screening.isPrivate, + QScreeningReview.screeningReview.count() )) .from(QScreening.screening) + .leftJoin(QUserScreening.userScreening).on(QScreening.screening.eq(QUserScreening.userScreening.screening)) + .leftJoin(QScreeningReview.screeningReview).on(QUserScreening.userScreening.eq(QScreeningReview.screeningReview.userScreening)) .where( QScreening.screening.screeningStartDate.between( startOfWeek.atStartOfDay(), @@ -84,11 +87,12 @@ public List getTopThree() { ), QScreening.screening.isPrivate.eq(false) ) + .groupBy(QScreening.screening.id, QUserScreening.userScreening.id) .orderBy(QScreening.screening.screeningStartDate.asc()) .limit(3) .fetch(); } - +// public List getMostRecentScreening() { return jpaQueryFactory .select(new QScreeningResponseDto( @@ -106,10 +110,14 @@ public List getMostRecentScreening() { QScreening.screening.screeningStartDate, QScreening.screening.screeningEndDate, QScreening.screening.screeningStartTime, - QScreening.screening.isPrivate + QScreening.screening.isPrivate, + QScreeningReview.screeningReview.count() )) .from(QScreening.screening) + .leftJoin(QUserScreening.userScreening).on(QScreening.screening.eq(QUserScreening.userScreening.screening)) + .leftJoin(QScreeningReview.screeningReview).on(QUserScreening.userScreening.eq(QScreeningReview.screeningReview.userScreening)) .where(QScreening.screening.isPrivate.eq(false)) + .groupBy(QScreening.screening.id, QUserScreening.userScreening.id) .orderBy(QScreening.screening.createdAt.desc()) .limit(3) .fetch(); @@ -142,7 +150,8 @@ public List getMostReviewed() { QScreening.screening.screeningStartDate, QScreening.screening.screeningEndDate, QScreening.screening.screeningStartTime, - QScreening.screening.isPrivate + QScreening.screening.isPrivate, + QScreeningReview.screeningReview.count() )) .from(QScreening.screening) .leftJoin(QUserScreening.userScreening).on(QScreening.screening.eq(QUserScreening.userScreening.screening)) diff --git a/Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningResponseDto.java b/Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningResponseDto.java index 93c0893..63a5767 100644 --- a/Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningResponseDto.java +++ b/Domain/src/main/java/com/example/domains/screening/entity/dto/ScreeningResponseDto.java @@ -44,13 +44,14 @@ public class ScreeningResponseDto { private boolean hasAgreed; private boolean isPrivate; + private Long reviewCount; @QueryProjection public ScreeningResponseDto(Long screeningId, String screeningTitle, String posterImgUrl, String hostName, String hostEmail, String hostPhoneNumber , String location, String formUrl, String information, boolean hasAgreed, Category category, LocalDateTime screeningStartDate, LocalDateTime screeningEndDate, LocalDateTime screeningStartTime, - boolean isPrivate + boolean isPrivate,Long reviewCount ) { this.screeningId = screeningId; this.screeningTitle = screeningTitle; @@ -67,5 +68,6 @@ public ScreeningResponseDto(Long screeningId, this.hostEmail = hostEmail; this.hostPhoneNumber = hostPhoneNumber; this.isPrivate = isPrivate; + this.reviewCount = reviewCount; } } From c617da340c2c05b8d31435d6101159a5088f2c89 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Fri, 26 Jan 2024 15:50:18 +0900 Subject: [PATCH 8/9] =?UTF-8?q?feat:=20popcorn=EC=9E=91=20=ED=82=A4?= =?UTF-8?q?=EC=9B=8C=EB=93=9C=20top3=20=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Popcorn/service/GetTopRatedPopcornKeyword.java | 2 +- .../domains/popcorn/schedule/PopcornSchedule.java | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java b/Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java index ecddeb1..e6ec15a 100644 --- a/Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java +++ b/Api/src/main/java/com/example/api/Popcorn/service/GetTopRatedPopcornKeyword.java @@ -17,7 +17,7 @@ public List> execute(Long popcornId) { Map newList = addingToList(keywordList); // 내림차순으로 정렬 -// Map을 리스트로 변환 + // Map을 리스트로 변환 List> sortedList = newList.entrySet() .stream() .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) diff --git a/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java b/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java index 4a8dab5..6f2e6db 100644 --- a/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java +++ b/Domain/src/main/java/com/example/domains/popcorn/schedule/PopcornSchedule.java @@ -13,12 +13,12 @@ public class PopcornSchedule { private final PopcornService popcornService; - //매 주 일요일 0시 0분에 실행되도록 cron 설정 -// @Scheduled(cron = "0 0 0 * * SUN") -// public void scheduledMethod() { -// popcornService.getTopRecommended(); -// System.out.println("매 주 일요일에 실행되는 작업"); -// } + // 매 주 일요일 0시 0분에 실행되도록 cron 설정 + @Scheduled(cron = "0 0 0 * * SUN") + public void scheduledMethod() { + popcornService.getTopRecommended(); + System.out.println("매 주 일요일에 실행되는 작업"); + } // @Scheduled(cron = "0 * * * * *") // public void scheduledMethod() { From 38cfe0c2263cc86395aa7be2aa3d6b53ebe2c813 Mon Sep 17 00:00:00 2001 From: Hanbee Lee Date: Fri, 26 Jan 2024 15:58:04 +0900 Subject: [PATCH 9/9] =?UTF-8?q?feat:=20=EB=8F=85=EB=A6=BD=EC=98=81?= =?UTF-8?q?=ED=99=94=20=ED=99=98=EA=B2=BD=EC=84=A4=EC=A0=95=20#22?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domains/diverseMovie/schedule/DiverseMovieSchedule.java | 2 +- .../domains/diverseMovie/service/DiverseMovieService.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java b/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java index 41c1b66..a074ceb 100644 --- a/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java +++ b/Domain/src/main/java/com/example/domains/diverseMovie/schedule/DiverseMovieSchedule.java @@ -19,7 +19,7 @@ public void scheduledMethod() { // @Scheduled(cron = "0 * * * * *") -// public void scheduledMethod() { +// public void scheduledMethodTest() { // // 1분마다 실행될 로직을 여기에 작성 // diverseMovieService.getTopRated(); // System.out.println("1분마다 실행되는 작업"); diff --git a/Domain/src/main/java/com/example/domains/diverseMovie/service/DiverseMovieService.java b/Domain/src/main/java/com/example/domains/diverseMovie/service/DiverseMovieService.java index fbb8a8a..d783eed 100644 --- a/Domain/src/main/java/com/example/domains/diverseMovie/service/DiverseMovieService.java +++ b/Domain/src/main/java/com/example/domains/diverseMovie/service/DiverseMovieService.java @@ -10,6 +10,7 @@ import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; +import org.springframework.beans.factory.annotation.Value; import java.io.IOException; import java.text.SimpleDateFormat; @@ -21,13 +22,16 @@ public class DiverseMovieService { private final DiverseMovieAdaptor diverseMovieAdaptor; + @Value("${API_KEY}") + String apiKey; + public void getTopRated() { OkHttpClient client = new OkHttpClient(); // 현재 날짜를 얻어오기 String currentDate = getFirstDayOfWeek(); // URL 구성 - String url = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=1eac3f860b5d6af757c4b409321d9f74&multiMovieYn=Y&targetDt=" + currentDate + "&itemPerPage=5"; + String url = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key="+ apiKey +"&multiMovieYn=Y&targetDt=" + currentDate + "&itemPerPage=5"; Request request = new Request.Builder() .url(url)