From 9e6b7b7ebb501703c3a8f83729429ea3d763cf0b Mon Sep 17 00:00:00 2001 From: Parkjyun Date: Mon, 13 May 2024 23:06:59 +0900 Subject: [PATCH 1/7] [feat] add interest field in Member.java --- .../newsnackserver/domain/member/model/Interest.java | 10 ++++++++++ .../www/newsnackserver/domain/member/model/Member.java | 3 +++ 2 files changed, 13 insertions(+) create mode 100644 src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java diff --git a/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java new file mode 100644 index 0000000..21eff41 --- /dev/null +++ b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java @@ -0,0 +1,10 @@ +package com.newsnack.www.newsnackserver.domain.member.model; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public enum Interest { + MONEY("MONEY"), SOCIETY("SOCIETY"), TREND("TREND"); + + private final String value; +} diff --git a/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java index bd88656..18730f2 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java +++ b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java @@ -39,6 +39,9 @@ public class Member { private LocalDateTime deletedAt; + @Enumerated(EnumType.STRING) + private Interest interest; + @Builder public Member(String serialId, String name, String email, Provider provider, MemberRole role, String refreshToken, MemberStatus memberStatus) { this.serialId = serialId; From 85b61021bd9ea12c1b42b0b70a8ffeec451e2bc5 Mon Sep 17 00:00:00 2001 From: Parkjyun Date: Mon, 13 May 2024 23:07:34 +0900 Subject: [PATCH 2/7] [feat] add success code for updating interest of member --- .../newsnackserver/common/code/success/MemberSuccessCode.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java b/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java index d07609c..be7d6cc 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java +++ b/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java @@ -13,7 +13,8 @@ public enum MemberSuccessCode implements SuccessCode{ GET_LOGIN_USER_INFO_SUCCESS(HttpStatus.OK, "로그인 유저 정보 조회 성공"), GET_LIKED_ARTICLES_SUCCESS(HttpStatus.OK, "좋아요한 게시글 조회 성공"), GET_PARTICIPATED_DEBATES_SUCCESS(HttpStatus.OK, "참여한 토론들 조회 성공"), - GET_MY_COMMENTS_SUCCESS(HttpStatus.OK, "나의 댓글 목록 조회 성공"); + GET_MY_COMMENTS_SUCCESS(HttpStatus.OK, "나의 댓글 목록 조회 성공"), + UPDATE_INTEREST_SUCCESS(HttpStatus.OK, "관심사 변경 성공"); private final HttpStatus httpStatus; private final String message; From 230fb8433ad4e68deffd8d560fafc9c9f146aca4 Mon Sep 17 00:00:00 2001 From: Parkjyun Date: Mon, 13 May 2024 23:08:31 +0900 Subject: [PATCH 3/7] [feat] create patch member's interest api --- .../controller/MemberController.java | 12 +++++++++--- .../domain/member/model/Member.java | 4 ++++ .../request/MemberUpdateInterestRequest.java | 19 +++++++++++++++++++ .../newsnackserver/service/MemberService.java | 7 +++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/newsnack/www/newsnackserver/dto/request/MemberUpdateInterestRequest.java diff --git a/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java b/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java index 529c47c..b54ad8a 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java +++ b/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java @@ -3,15 +3,15 @@ import com.newsnack.www.newsnackserver.annotation.MemberId; import com.newsnack.www.newsnackserver.common.code.success.MemberSuccessCode; import com.newsnack.www.newsnackserver.common.response.NewSnackResponse; +import com.newsnack.www.newsnackserver.dto.request.MemberUpdateInterestRequest; import com.newsnack.www.newsnackserver.dto.response.MemberInfoResponse; import com.newsnack.www.newsnackserver.dto.response.MemberLikedArticleResponse; import com.newsnack.www.newsnackserver.dto.response.MemberParticipatedDebateResponse; import com.newsnack.www.newsnackserver.dto.response.MyPageCommentResponse; import com.newsnack.www.newsnackserver.service.MemberService; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; -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; @@ -42,4 +42,10 @@ public NewSnackResponse> getMyComments(@MemberId Lon return NewSnackResponse.success(MemberSuccessCode.GET_MY_COMMENTS_SUCCESS, memberService.getMyComments(memberId)); } + @PatchMapping("/me/interest") + public NewSnackResponse updateInterest(@MemberId Long memberId, @Valid @RequestBody MemberUpdateInterestRequest request){ + memberService.updateInterest(memberId, request); + return NewSnackResponse.success(MemberSuccessCode.UPDATE_INTEREST_SUCCESS); + } + } diff --git a/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java index 18730f2..2682586 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java +++ b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Member.java @@ -56,4 +56,8 @@ public Member(String serialId, String name, String email, Provider provider, Mem public void updateRefreshToken(String refreshToken) { this.refreshToken = refreshToken; } + + public void updateInterest(Interest interest) { + this.interest = interest; + } } diff --git a/src/main/java/com/newsnack/www/newsnackserver/dto/request/MemberUpdateInterestRequest.java b/src/main/java/com/newsnack/www/newsnackserver/dto/request/MemberUpdateInterestRequest.java new file mode 100644 index 0000000..1b9d921 --- /dev/null +++ b/src/main/java/com/newsnack/www/newsnackserver/dto/request/MemberUpdateInterestRequest.java @@ -0,0 +1,19 @@ +package com.newsnack.www.newsnackserver.dto.request; + +import com.newsnack.www.newsnackserver.domain.member.model.Interest; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; + +public record MemberUpdateInterestRequest(@Max(value = 3, message = "3이하의 점수를 입력하세요") @Min(value = 0, message = "0이상의 점수를 입력하세요") int moneyCount, + @Max(value = 3, message = "3이하의 점수를 입력하세요") @Min(value = 0, message = "0이상의 점수를 입력하세요") int societyCount, + @Max(value = 3, message = "3이하의 점수를 입력하세요") @Min(value = 0, message = "0이상의 점수를 입력하세요") int trendCount) { + public Interest getInterestWithMostCount() { + if (moneyCount >= societyCount && moneyCount >= trendCount) { + return Interest.MONEY; + } else if (societyCount >= moneyCount && societyCount >= trendCount) { + return Interest.SOCIETY; + } else { + return Interest.TREND; + } + } +} diff --git a/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java b/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java index 6094013..a5afa44 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java +++ b/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java @@ -11,6 +11,7 @@ import com.newsnack.www.newsnackserver.domain.debateparticipation.repository.DebateParticipationJpaRepository; import com.newsnack.www.newsnackserver.domain.member.model.Member; import com.newsnack.www.newsnackserver.domain.member.repository.MemberJpaRepository; +import com.newsnack.www.newsnackserver.dto.request.MemberUpdateInterestRequest; import com.newsnack.www.newsnackserver.dto.response.MemberInfoResponse; import com.newsnack.www.newsnackserver.dto.response.MemberLikedArticleResponse; import com.newsnack.www.newsnackserver.dto.response.MemberParticipatedDebateResponse; @@ -49,4 +50,10 @@ public List getParticipatedDebates(Long member public List getMyComments(Long memberId) { return commentJpaRepository.findAllByMemberIdJPQL(memberId); } + + @Transactional + public void updateInterest(Long memberId, MemberUpdateInterestRequest request) { + Member member = memberJpaRepository.findById(memberId).orElseThrow(() -> new MemberException(MemberFailureCode.MEMBER_NOT_FOUND)); + member.updateInterest(request.getInterestWithMostCount()); + } } From d726571d4e5305f8c66661790b90e98eaabe862d Mon Sep 17 00:00:00 2001 From: Parkjyun Date: Tue, 14 May 2024 00:23:17 +0900 Subject: [PATCH 4/7] [feat] create codes for get interested articles api --- .../newsnackserver/common/code/failure/MemberFailureCode.java | 3 ++- .../newsnackserver/common/code/success/MemberSuccessCode.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/newsnack/www/newsnackserver/common/code/failure/MemberFailureCode.java b/src/main/java/com/newsnack/www/newsnackserver/common/code/failure/MemberFailureCode.java index 10aafc9..4148804 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/common/code/failure/MemberFailureCode.java +++ b/src/main/java/com/newsnack/www/newsnackserver/common/code/failure/MemberFailureCode.java @@ -10,7 +10,8 @@ public enum MemberFailureCode implements FailureCode { /** * 404 NOT FOUND */ - MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "가입된 멤버가 없습니다"); + MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "가입된 멤버가 없습니다"), + INTEREST_NOT_FOUND(HttpStatus.NOT_FOUND, "회원님의 관심사를 찾을 수 없습니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java b/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java index be7d6cc..a750b02 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java +++ b/src/main/java/com/newsnack/www/newsnackserver/common/code/success/MemberSuccessCode.java @@ -14,7 +14,8 @@ public enum MemberSuccessCode implements SuccessCode{ GET_LIKED_ARTICLES_SUCCESS(HttpStatus.OK, "좋아요한 게시글 조회 성공"), GET_PARTICIPATED_DEBATES_SUCCESS(HttpStatus.OK, "참여한 토론들 조회 성공"), GET_MY_COMMENTS_SUCCESS(HttpStatus.OK, "나의 댓글 목록 조회 성공"), - UPDATE_INTEREST_SUCCESS(HttpStatus.OK, "관심사 변경 성공"); + UPDATE_INTEREST_SUCCESS(HttpStatus.OK, "관심사 변경 성공"), + GET_INTERESTED_ARTICLES_SUCCESS(HttpStatus.OK, "관심사 관련 아티글 조회 성공"); private final HttpStatus httpStatus; private final String message; From 12c121dec932090e80f45d0317cbaea744afb0eb Mon Sep 17 00:00:00 2001 From: Parkjyun Date: Tue, 14 May 2024 00:23:28 +0900 Subject: [PATCH 5/7] [feat] create logic for get interested articles api --- .../repository/ArticleJpaRepository.java | 3 ++ .../domain/member/model/Interest.java | 2 ++ .../newsnackserver/service/MemberService.java | 33 ++++++++++++++++--- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/newsnack/www/newsnackserver/domain/article/repository/ArticleJpaRepository.java b/src/main/java/com/newsnack/www/newsnackserver/domain/article/repository/ArticleJpaRepository.java index a17bcce..c7d9eb7 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/domain/article/repository/ArticleJpaRepository.java +++ b/src/main/java/com/newsnack/www/newsnackserver/domain/article/repository/ArticleJpaRepository.java @@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Query; import java.time.LocalDateTime; +import java.util.Collection; import java.util.List; public interface ArticleJpaRepository extends JpaRepository { @@ -30,4 +31,6 @@ public interface ArticleJpaRepository extends JpaRepository { List
findTop5ByCreatedAtAfterOrderByHeartCountDescIdDesc(LocalDateTime oneWeekAgo); + @Query("SELECT a from Article a where a.sectionCategory = :sectionCategory or a.sectionCategory = :sectionCategory1 order by a.id desc") + List
findAllBySectionCategoryOrderByIdDescJPQL(SectionCategory sectionCategory, SectionCategory sectionCategory1); } diff --git a/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java index 21eff41..e795664 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java +++ b/src/main/java/com/newsnack/www/newsnackserver/domain/member/model/Interest.java @@ -1,8 +1,10 @@ package com.newsnack.www.newsnackserver.domain.member.model; +import lombok.Getter; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor +@Getter public enum Interest { MONEY("MONEY"), SOCIETY("SOCIETY"), TREND("TREND"); diff --git a/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java b/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java index a5afa44..524efba 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java +++ b/src/main/java/com/newsnack/www/newsnackserver/service/MemberService.java @@ -3,19 +3,19 @@ import com.newsnack.www.newsnackserver.common.code.failure.MemberFailureCode; import com.newsnack.www.newsnackserver.common.exception.MemberException; import com.newsnack.www.newsnackserver.domain.article.model.Article; +import com.newsnack.www.newsnackserver.domain.article.model.SectionCategory; +import com.newsnack.www.newsnackserver.domain.article.repository.ArticleJpaRepository; import com.newsnack.www.newsnackserver.domain.articleheart.model.ArticleHeart; import com.newsnack.www.newsnackserver.domain.articleheart.repository.ArticleHeartJpaRepository; import com.newsnack.www.newsnackserver.domain.comment.repository.CommentJpaRepository; import com.newsnack.www.newsnackserver.domain.debate.model.Debate; import com.newsnack.www.newsnackserver.domain.debateparticipation.model.DebateParticipation; import com.newsnack.www.newsnackserver.domain.debateparticipation.repository.DebateParticipationJpaRepository; +import com.newsnack.www.newsnackserver.domain.member.model.Interest; import com.newsnack.www.newsnackserver.domain.member.model.Member; import com.newsnack.www.newsnackserver.domain.member.repository.MemberJpaRepository; import com.newsnack.www.newsnackserver.dto.request.MemberUpdateInterestRequest; -import com.newsnack.www.newsnackserver.dto.response.MemberInfoResponse; -import com.newsnack.www.newsnackserver.dto.response.MemberLikedArticleResponse; -import com.newsnack.www.newsnackserver.dto.response.MemberParticipatedDebateResponse; -import com.newsnack.www.newsnackserver.dto.response.MyPageCommentResponse; +import com.newsnack.www.newsnackserver.dto.response.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,6 +30,7 @@ public class MemberService { private final ArticleHeartJpaRepository articleHeartJpaRepository; private final DebateParticipationJpaRepository debateParticipationJpaRepository; private final CommentJpaRepository commentJpaRepository; + private final ArticleJpaRepository articleJpaRepository; public MemberInfoResponse getMemberInfo(Long memberId) { @@ -56,4 +57,28 @@ public void updateInterest(Long memberId, MemberUpdateInterestRequest request) { Member member = memberJpaRepository.findById(memberId).orElseThrow(() -> new MemberException(MemberFailureCode.MEMBER_NOT_FOUND)); member.updateInterest(request.getInterestWithMostCount()); } + + public List getInterestedArticles(Long memberId) { + Member member = memberJpaRepository.findById(memberId).orElseThrow(() -> new MemberException(MemberFailureCode.MEMBER_NOT_FOUND)); + List responses = null; + Interest interest = member.getInterest(); + if (interest == null) { + throw new MemberException(MemberFailureCode.INTEREST_NOT_FOUND); + } + switch (interest) { + case MONEY -> { + responses = articleJpaRepository.findAllBySectionCategoryOrderByIdDescJPQL(SectionCategory.ECONOMY, SectionCategory.TECHNOLOGY) + .stream().map(article -> InterestedArticleResponse.of(article)).toList(); + } + case SOCIETY -> { + responses = articleJpaRepository.findAllBySectionCategoryOrderByIdDescJPQL(SectionCategory.ENVIRONMENT, SectionCategory.POLITICS) + .stream().map(article -> InterestedArticleResponse.of(article)).toList(); + } + case TREND -> { + responses = articleJpaRepository.findAllBySectionCategoryOrderByIdDescJPQL(SectionCategory.ART, SectionCategory.TECHNOLOGY) + .stream().map(article -> InterestedArticleResponse.of(article)).toList(); + } + } + return responses; + } } From 3089c8c9a50bb17a017c92dd401c848cbcccca49 Mon Sep 17 00:00:00 2001 From: Parkjyun Date: Tue, 14 May 2024 00:23:44 +0900 Subject: [PATCH 6/7] [feat] create get interested articles api --- .../www/newsnackserver/controller/MemberController.java | 9 +++++---- .../dto/response/InterestedArticleResponse.java | 9 +++++++++ 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/newsnack/www/newsnackserver/dto/response/InterestedArticleResponse.java diff --git a/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java b/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java index b54ad8a..ebdabe9 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java +++ b/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java @@ -4,10 +4,7 @@ import com.newsnack.www.newsnackserver.common.code.success.MemberSuccessCode; import com.newsnack.www.newsnackserver.common.response.NewSnackResponse; import com.newsnack.www.newsnackserver.dto.request.MemberUpdateInterestRequest; -import com.newsnack.www.newsnackserver.dto.response.MemberInfoResponse; -import com.newsnack.www.newsnackserver.dto.response.MemberLikedArticleResponse; -import com.newsnack.www.newsnackserver.dto.response.MemberParticipatedDebateResponse; -import com.newsnack.www.newsnackserver.dto.response.MyPageCommentResponse; +import com.newsnack.www.newsnackserver.dto.response.*; import com.newsnack.www.newsnackserver.service.MemberService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @@ -48,4 +45,8 @@ public NewSnackResponse updateInterest(@MemberId Long memberId, @Valid @Reque return NewSnackResponse.success(MemberSuccessCode.UPDATE_INTEREST_SUCCESS); } + @GetMapping("/me/interest") + public NewSnackResponse> getInterestedArticles(@MemberId Long memberId){ + return NewSnackResponse.success(MemberSuccessCode.GET_INTERESTED_ARTICLES_SUCCESS, memberService.getInterestedArticles(memberId)); + } } diff --git a/src/main/java/com/newsnack/www/newsnackserver/dto/response/InterestedArticleResponse.java b/src/main/java/com/newsnack/www/newsnackserver/dto/response/InterestedArticleResponse.java new file mode 100644 index 0000000..af94240 --- /dev/null +++ b/src/main/java/com/newsnack/www/newsnackserver/dto/response/InterestedArticleResponse.java @@ -0,0 +1,9 @@ +package com.newsnack.www.newsnackserver.dto.response; + +import com.newsnack.www.newsnackserver.domain.article.model.Article; + +public record InterestedArticleResponse(Long id, String imageUrl, String title) { + public static InterestedArticleResponse of(Article article) { + return new InterestedArticleResponse(article.getId(), article.getImageUrl(), article.getTitle()); + } +} From a7b518a4b5e85a34bf39f7be2ea127d892fda0fd Mon Sep 17 00:00:00 2001 From: Parkjyun Date: Tue, 14 May 2024 00:34:25 +0900 Subject: [PATCH 7/7] [fix] change url endpoint --- .../www/newsnackserver/controller/MemberController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java b/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java index ebdabe9..0418468 100644 --- a/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java +++ b/src/main/java/com/newsnack/www/newsnackserver/controller/MemberController.java @@ -45,7 +45,7 @@ public NewSnackResponse updateInterest(@MemberId Long memberId, @Valid @Reque return NewSnackResponse.success(MemberSuccessCode.UPDATE_INTEREST_SUCCESS); } - @GetMapping("/me/interest") + @GetMapping("/me/articles/interested") public NewSnackResponse> getInterestedArticles(@MemberId Long memberId){ return NewSnackResponse.success(MemberSuccessCode.GET_INTERESTED_ARTICLES_SUCCESS, memberService.getInterestedArticles(memberId)); }