From 2fe61bb8c3a9ab0bfc2844b56bf5bf8de6f87a17 Mon Sep 17 00:00:00 2001 From: sominyun <128496121+sominyun@users.noreply.github.com> Date: Wed, 6 Mar 2024 16:20:21 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20#24=20=EB=AA=A8=EB=8D=B8=20=ED=99=94?= =?UTF-8?q?=EC=A0=9C=EC=84=B1=20=EC=A1=B0=ED=9A=8C=20api=20(#26)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ModelPopularityController.java | 30 +++++++++ .../popularity/ModelPopularAgeResponse.java | 9 +++ .../ModelPopularGenderResponse.java | 9 +++ .../popularity/ModelPopularityResponse.java | 63 +++++++++++++++++++ .../ModelScheduledWorkResponse.java | 12 ++++ .../soullive_a/entity/model/Model.java | 4 +- .../model/popularity/ModelPopularAge.java | 27 ++++++++ .../model/popularity/ModelPopularGender.java | 26 ++++++++ .../model/popularity/ModelPopularity.java | 37 +++++++++++ .../model/popularity/ModelScheduledWork.java | 40 ++++++++++++ .../popularity/ModelPopularAgeRepository.java | 12 ++++ .../ModelPopularGenderRepository.java | 12 ++++ .../popularity/ModelPopularityRepository.java | 10 +++ .../ModelScheduledWorkRepository.java | 12 ++++ .../service/ModelPopularityService.java | 8 +++ .../impl/ModelPopularityServiceImpl.java | 37 +++++++++++ src/main/resources/data.sql | 12 +++- 17 files changed, 358 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/backend/soullive_a/controller/ModelPopularityController.java create mode 100644 src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularAgeResponse.java create mode 100644 src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularGenderResponse.java create mode 100644 src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularityResponse.java create mode 100644 src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelScheduledWorkResponse.java create mode 100644 src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularAge.java create mode 100644 src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularGender.java create mode 100644 src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularity.java create mode 100644 src/main/java/com/backend/soullive_a/entity/model/popularity/ModelScheduledWork.java create mode 100644 src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularAgeRepository.java create mode 100644 src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularGenderRepository.java create mode 100644 src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularityRepository.java create mode 100644 src/main/java/com/backend/soullive_a/repository/model/popularity/ModelScheduledWorkRepository.java create mode 100644 src/main/java/com/backend/soullive_a/service/ModelPopularityService.java create mode 100644 src/main/java/com/backend/soullive_a/service/impl/ModelPopularityServiceImpl.java diff --git a/src/main/java/com/backend/soullive_a/controller/ModelPopularityController.java b/src/main/java/com/backend/soullive_a/controller/ModelPopularityController.java new file mode 100644 index 0000000..7729a04 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/controller/ModelPopularityController.java @@ -0,0 +1,30 @@ +package com.backend.soullive_a.controller; + +import com.backend.soullive_a.dto.response.model.popularity.ModelPopularityResponse; +import com.backend.soullive_a.exception.base.BaseResponse; +import com.backend.soullive_a.service.ModelPopularityService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/model/popularity") +public class ModelPopularityController { + + private final ModelPopularityService modelPopularityService; + + @GetMapping("") + public BaseResponse getModelPopularity( + @RequestParam String name + ) { + return BaseResponse.builder() + .isSuccess(true) + .code(200) + .message(name+" 모델 화제성 조회에 성공했습니다.") + .data(modelPopularityService.getModelPopularity(name)) + .build(); + } +} diff --git a/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularAgeResponse.java b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularAgeResponse.java new file mode 100644 index 0000000..d282f98 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularAgeResponse.java @@ -0,0 +1,9 @@ +package com.backend.soullive_a.dto.response.model.popularity; + +import com.backend.soullive_a.constant.AgeType; + +public record ModelPopularAgeResponse( + Long ageId, + AgeType ageType +) { +} diff --git a/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularGenderResponse.java b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularGenderResponse.java new file mode 100644 index 0000000..15ecaa7 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularGenderResponse.java @@ -0,0 +1,9 @@ +package com.backend.soullive_a.dto.response.model.popularity; + +import com.backend.soullive_a.constant.GenderType; + +public record ModelPopularGenderResponse( + Long genderId, + GenderType gender +) { +} diff --git a/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularityResponse.java b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularityResponse.java new file mode 100644 index 0000000..d105c22 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelPopularityResponse.java @@ -0,0 +1,63 @@ +package com.backend.soullive_a.dto.response.model.popularity; + +import com.backend.soullive_a.entity.model.popularity.ModelPopularAge; +import com.backend.soullive_a.entity.model.popularity.ModelPopularGender; +import com.backend.soullive_a.entity.model.popularity.ModelPopularity; +import com.backend.soullive_a.entity.model.popularity.ModelScheduledWork; +import lombok.Builder; + +import java.util.List; +import java.util.stream.Collectors; + +@Builder +public record ModelPopularityResponse( + Long modelPopularityId, + Long modelId, + String scoreUrl, + String aiComment, + List genders, + List ages, + String snsUrl, + String searchUrl, + String brandScoreUrl, + List modelScheduledWorks +) { + public static ModelPopularityResponse fromModel( + ModelPopularity modelPopularity, + List modelPopularGender, + List modelPopularAge, + List modelScheduledWork + ) { + List modelPopularGenders = modelPopularGender.stream() + .map(gender -> new ModelPopularGenderResponse(gender.getId(), gender.getGender())) + .collect(Collectors.toList()); + + List modelPopularAges = modelPopularAge.stream() + .map(age -> new ModelPopularAgeResponse(age.getId(), age.getAge())) + .collect(Collectors.toList()); + + List modelScheduledWorks = modelScheduledWork.stream() + .map(work -> new ModelScheduledWorkResponse( + work.getId(), + work.getImageUrl(), + work.getYear(), + work.getCategory(), + work.getTitle(), + work.getIsMainActor(), + work.getGenre())) + .collect(Collectors.toList()); + + return ModelPopularityResponse.builder() + .modelId(modelPopularity.getModel().getId()) + .modelPopularityId(modelPopularity.getId()) + .scoreUrl(modelPopularity.getScoreUrl()) + .aiComment(modelPopularity.getAiComment()) + .genders(modelPopularGenders) + .ages(modelPopularAges) + .snsUrl(modelPopularity.getSnsUrl()) + .searchUrl(modelPopularity.getSearchUrl()) + .brandScoreUrl(modelPopularity.getBrandScoreUrl()) + .modelScheduledWorks(modelScheduledWorks) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelScheduledWorkResponse.java b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelScheduledWorkResponse.java new file mode 100644 index 0000000..a3a8a8d --- /dev/null +++ b/src/main/java/com/backend/soullive_a/dto/response/model/popularity/ModelScheduledWorkResponse.java @@ -0,0 +1,12 @@ +package com.backend.soullive_a.dto.response.model.popularity; + +public record ModelScheduledWorkResponse( + Long modelScheduledWorkId, + String imageUrl, + Integer year, + String category, + String title, + Boolean isMainActor, + String genre +) { +} diff --git a/src/main/java/com/backend/soullive_a/entity/model/Model.java b/src/main/java/com/backend/soullive_a/entity/model/Model.java index e1112f1..9fb17a9 100644 --- a/src/main/java/com/backend/soullive_a/entity/model/Model.java +++ b/src/main/java/com/backend/soullive_a/entity/model/Model.java @@ -4,7 +4,6 @@ import lombok.*; import java.time.LocalDate; -import java.time.LocalDateTime; @Entity @Getter @@ -23,6 +22,9 @@ public class Model { @Column(name = "BIRTH", nullable = false) private LocalDate birth; + @Column(name = "AGE", nullable = false) + private String age; + @Column(name = "JOB", nullable = false) private String job; diff --git a/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularAge.java b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularAge.java new file mode 100644 index 0000000..414c859 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularAge.java @@ -0,0 +1,27 @@ +package com.backend.soullive_a.entity.model.popularity; + +import com.backend.soullive_a.constant.AgeType; +import com.backend.soullive_a.entity.Product; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "MODEL_POPULAR_AGE") +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ModelPopularAge { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "AGE_ID") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "MODEL_POPULARITY_ID", nullable = false) + private ModelPopularity modelPopularity; + + @Enumerated(EnumType.STRING) + @Column(name = "AGE_TYPE") + private AgeType age; +} diff --git a/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularGender.java b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularGender.java new file mode 100644 index 0000000..54f5a05 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularGender.java @@ -0,0 +1,26 @@ +package com.backend.soullive_a.entity.model.popularity; + +import com.backend.soullive_a.constant.GenderType; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "MODEL_POPULAR_GENDER") +@Builder +@Getter +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ModelPopularGender { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "GENDER_ID") + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "MODEL_POPULARITY_ID", nullable = false) + private ModelPopularity modelPopularity; + + @Enumerated(EnumType.STRING) + @Column(name = "GENDER_TYPE") + private GenderType gender; +} \ No newline at end of file diff --git a/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularity.java b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularity.java new file mode 100644 index 0000000..4229bb7 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelPopularity.java @@ -0,0 +1,37 @@ +package com.backend.soullive_a.entity.model.popularity; + +import com.backend.soullive_a.entity.model.Model; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "MODEL_POPULARITY") +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ModelPopularity{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "MODEL_POPULARITY_ID", nullable = false) + private Long id; + + @OneToOne + @JoinColumn(name = "MODEL_ID", nullable = false) + private Model model; + + @Column(name = "SCORE_URL") + private String scoreUrl; + + @Column(name = "AI_COMMENT") + private String aiComment; + + @Column(name = "SNS_URL") + private String snsUrl; + + @Column(name = "SEARCH_URL") + private String searchUrl; + + @Column(name = "BRAND_SCORE_URL") + private String brandScoreUrl; +} diff --git a/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelScheduledWork.java b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelScheduledWork.java new file mode 100644 index 0000000..8c41447 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/entity/model/popularity/ModelScheduledWork.java @@ -0,0 +1,40 @@ +package com.backend.soullive_a.entity.model.popularity; + +import com.backend.soullive_a.entity.model.Model; +import jakarta.persistence.*; +import lombok.*; + +@Entity +@Table(name = "MODEL_SCHEDULED_WORK") +@Getter +@Builder +@AllArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ModelScheduledWork { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "MODEL_SCHEDULED_WORK_ID", nullable = false) + private Long id; + + @JoinColumn(name = "IMAGE_URL") + private String imageUrl; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "MODEL_POPULARITY_ID", nullable = false) + private ModelPopularity modelPopularity; + + @Column(name = "YEAR", nullable = false) + private Integer year; + + @Column(name = "CATEGORY", nullable = false) + private String category; + + @Column(name = "TITLE", nullable = false) + private String title; + + @Column(name = "IS_MAIN_ACTOR", nullable = false) + private Boolean isMainActor; + + @Column(name = "GENRE", nullable = false) + private String genre; +} diff --git a/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularAgeRepository.java b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularAgeRepository.java new file mode 100644 index 0000000..7a1079a --- /dev/null +++ b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularAgeRepository.java @@ -0,0 +1,12 @@ +package com.backend.soullive_a.repository.model.popularity; + +import com.backend.soullive_a.entity.model.popularity.ModelPopularAge; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ModelPopularAgeRepository extends JpaRepository { + + List findAllByModelPopularityModelModelName(String name); + +} diff --git a/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularGenderRepository.java b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularGenderRepository.java new file mode 100644 index 0000000..c1106da --- /dev/null +++ b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularGenderRepository.java @@ -0,0 +1,12 @@ +package com.backend.soullive_a.repository.model.popularity; + +import com.backend.soullive_a.entity.model.popularity.ModelPopularGender; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ModelPopularGenderRepository extends JpaRepository { + + List findAllByModelPopularityModelModelName(String name); + +} diff --git a/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularityRepository.java b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularityRepository.java new file mode 100644 index 0000000..82ecece --- /dev/null +++ b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelPopularityRepository.java @@ -0,0 +1,10 @@ +package com.backend.soullive_a.repository.model.popularity; + +import com.backend.soullive_a.entity.model.popularity.ModelPopularity; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ModelPopularityRepository extends JpaRepository { + + ModelPopularity findByModelModelName(String name); + +} diff --git a/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelScheduledWorkRepository.java b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelScheduledWorkRepository.java new file mode 100644 index 0000000..f592129 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/repository/model/popularity/ModelScheduledWorkRepository.java @@ -0,0 +1,12 @@ +package com.backend.soullive_a.repository.model.popularity; + +import com.backend.soullive_a.entity.model.popularity.ModelScheduledWork; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface ModelScheduledWorkRepository extends JpaRepository { + + List findAllByModelPopularityModelModelName(String name); + +} diff --git a/src/main/java/com/backend/soullive_a/service/ModelPopularityService.java b/src/main/java/com/backend/soullive_a/service/ModelPopularityService.java new file mode 100644 index 0000000..0686325 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/service/ModelPopularityService.java @@ -0,0 +1,8 @@ +package com.backend.soullive_a.service; + +import com.backend.soullive_a.dto.response.model.popularity.ModelPopularityResponse; + +public interface ModelPopularityService { + + ModelPopularityResponse getModelPopularity(String name); +} diff --git a/src/main/java/com/backend/soullive_a/service/impl/ModelPopularityServiceImpl.java b/src/main/java/com/backend/soullive_a/service/impl/ModelPopularityServiceImpl.java new file mode 100644 index 0000000..b7d92e0 --- /dev/null +++ b/src/main/java/com/backend/soullive_a/service/impl/ModelPopularityServiceImpl.java @@ -0,0 +1,37 @@ +package com.backend.soullive_a.service.impl; + +import com.backend.soullive_a.dto.response.model.popularity.ModelPopularityResponse; +import com.backend.soullive_a.entity.model.popularity.ModelPopularAge; +import com.backend.soullive_a.entity.model.popularity.ModelPopularGender; +import com.backend.soullive_a.entity.model.popularity.ModelPopularity; +import com.backend.soullive_a.entity.model.popularity.ModelScheduledWork; +import com.backend.soullive_a.repository.model.popularity.ModelPopularAgeRepository; +import com.backend.soullive_a.repository.model.popularity.ModelPopularGenderRepository; +import com.backend.soullive_a.repository.model.popularity.ModelPopularityRepository; +import com.backend.soullive_a.repository.model.popularity.ModelScheduledWorkRepository; +import com.backend.soullive_a.service.ModelPopularityService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ModelPopularityServiceImpl implements ModelPopularityService { + + private final ModelPopularityRepository modelPopularityRepository; + private final ModelPopularAgeRepository modelPopularAgeRepository; + private final ModelPopularGenderRepository modelPopularGenderRepository; + private final ModelScheduledWorkRepository modelScheduledWorkRepository; + + @Override + @Transactional(readOnly = true) + public ModelPopularityResponse getModelPopularity(String name) { + ModelPopularity modelPopularity = modelPopularityRepository.findByModelModelName(name); + List modelPopularGenders = modelPopularGenderRepository.findAllByModelPopularityModelModelName(name); + List modelPopularAges = modelPopularAgeRepository.findAllByModelPopularityModelModelName(name); + List modelScheduledWorks = modelScheduledWorkRepository.findAllByModelPopularityModelModelName(name); + return ModelPopularityResponse.fromModel(modelPopularity, modelPopularGenders, modelPopularAges, modelScheduledWorks); + } +} \ No newline at end of file diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 527e5cb..39fabaa 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -1 +1,11 @@ -INSERT INTO soullive.user (user_id, password, phone_number) VALUES (1, 'password', '010-0000-0000'); \ No newline at end of file +-- git 에는 soullive로 해야함 +INSERT INTO soullive.user (user_id, password, phone_number) VALUES (1, 'password', '010-0000-0000'); +INSERT INTO soullive.model (model_id, model_name, birth, age, job, info, agency, ai_rate) VALUES (1,'김희애', '1967-04-23','56세','텔런트/영화배우','','YG 엔터테인먼트',4.0); +INSERT INTO soullive.model_popularity (model_popularity_id,model_id,score_url,ai_comment,sns_url,search_url,brand_score_url) values (1,1,null,'최근 화제성에서는 다소 약한 모습을 보여주고 있지만 3040 남녀 모두에게 높은 인지도를 갖고 있고 앞으로 2개의 주연 활동을 앞두고 있어 더 큰 화제성을 갖을 것으로 예상됩니다.',null,null,null); +INSERT INTO soullive.model_popular_gender (gender_id, model_popularity_id, gender_type) values ('1','1','MALE'); +INSERT INTO soullive.model_popular_gender (gender_id, model_popularity_id, gender_type) values ('2','1','FEMALE'); +INSERT INTO soullive.model_popular_age (age_id, model_popularity_id,age_type) values (1,1,'THIRTY'); +INSERT INTO soullive.model_popular_age (age_id, model_popularity_id,age_type) values (2,1,'FORTY'); +INSERT INTO soullive.model_popular_age (age_id, model_popularity_id,age_type) values (3,1,'FIFTY'); +INSERT INTO soullive.model_scheduled_work (model_scheduled_work_id,image_url,model_popularity_id,year,category,title,is_main_actor,genre) values (1,null, 1, 2024, '방영 예정 영화','돌풍',true,'공포'); +INSERT INTO soullive.model_scheduled_work (model_scheduled_work_id,image_url,model_popularity_id,year,category,title,is_main_actor,genre) values (2,null, 1, 2024, '방영 예정 영화','보통의 가족',true,'공포'); \ No newline at end of file