Skip to content

Commit eeaa39d

Browse files
authored
Merge pull request #87 from NOVA-9th/feat/#86-member-prefer-keywords
[FEAT] 유저 관심 키워드 조회 API 추가
2 parents 58b1738 + 239b731 commit eeaa39d

4 files changed

Lines changed: 48 additions & 4 deletions

File tree

src/main/java/com/nova/nova_server/domain/member/controller/MemberInfoController.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package com.nova.nova_server.domain.member.controller;
22

33
import com.nova.nova_server.domain.member.dto.*;
4+
import com.nova.nova_server.domain.member.error.MemberErrorCode;
45
import com.nova.nova_server.domain.member.service.MemberService;
56
import com.nova.nova_server.global.apiPayload.ApiResponse;
7+
import com.nova.nova_server.global.apiPayload.exception.NovaException;
68
import io.swagger.v3.oas.annotations.Operation;
79
import io.swagger.v3.oas.annotations.Parameter;
810
import io.swagger.v3.oas.annotations.tags.Tag;
911
import lombok.RequiredArgsConstructor;
1012
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1113
import org.springframework.web.bind.annotation.*;
1214

15+
import java.util.List;
16+
1317
@RestController
1418
@RequestMapping("/api/members")
1519
@RequiredArgsConstructor
@@ -72,6 +76,25 @@ public ApiResponse<Void> updatePersonalization(
7276
return ApiResponse.success(null);
7377
}
7478

79+
@Operation(summary = "관심 키워드 조회", description = "사용자의 관심 키워드 목록을 조회합니다.")
80+
@GetMapping("/{member_id}/keywords")
81+
public ApiResponse<MemberPreferKeywordResponseDto> getMemberKeywords(
82+
@Parameter(description = "사용자 ID")
83+
@PathVariable("member_id") Long memberId,
84+
@AuthenticationPrincipal Long authenticatedMemberId
85+
) {
86+
if (!authenticatedMemberId.equals(memberId)) {
87+
throw new NovaException(MemberErrorCode.MEMBER_READ_FORBIDDEN);
88+
}
89+
90+
List<String> keywords = memberService.getMemberKeywords(memberId);
91+
return ApiResponse.success(MemberPreferKeywordResponseDto.builder()
92+
.totalCount(keywords.size())
93+
.keywords(keywords)
94+
.build()
95+
);
96+
}
97+
7598
@Operation(summary = "연결된 계정 조회", description = "소셜 로그인 등 사용자와 연결된 계정 정보를 조회합니다.")
7699
@GetMapping("/{member_id}/connected-accounts")
77100
public ApiResponse<MemberConnectedAccountsResponseDto> getConnectedAccounts(
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.nova.nova_server.domain.member.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.Builder;
5+
6+
import java.util.List;
7+
8+
@Builder
9+
@Schema(description = "사용자 관심 키워드 응답")
10+
public record MemberPreferKeywordResponseDto(
11+
@Schema(description = "관심 키워드 총 개수", example = "5")
12+
long totalCount,
13+
14+
@Schema(description = "관심 키워드 목록", example = "[\"Spring Boot\", \"React\", \"AI\"]")
15+
List<String> keywords
16+
) {
17+
}

src/main/java/com/nova/nova_server/domain/member/error/MemberErrorCode.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
public enum MemberErrorCode implements ErrorCode {
1111

1212
MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "MEMBER4040", "존재하지 않는 사용자입니다."),
13+
MEMBER_READ_FORBIDDEN(HttpStatus.FORBIDDEN, "MEMBER4030", "본인의 정보만 조회할 수 있습니다."),
1314
MEMBER_FORBIDDEN(HttpStatus.FORBIDDEN, "MEMBER4030", "본인의 정보만 수정할 수 있습니다."),
1415
MEMBER_NAME_REQUIRED(HttpStatus.BAD_REQUEST, "MEMBER4000", "이름은 필수 입력 항목입니다.");
1516

src/main/java/com/nova/nova_server/domain/member/service/MemberService.java

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,19 @@
55
import com.nova.nova_server.domain.cardNews.repository.CardNewsHiddenRepository;
66
import com.nova.nova_server.domain.interest.entity.Interest;
77
import com.nova.nova_server.domain.interest.repository.InterestRepository;
8+
import com.nova.nova_server.domain.keyword.entity.Keyword;
89
import com.nova.nova_server.domain.keyword.error.KeywordErrorCode;
10+
import com.nova.nova_server.domain.keyword.repository.KeywordRepository;
911
import com.nova.nova_server.domain.member.dto.*;
1012
import com.nova.nova_server.domain.member.entity.Member;
11-
import com.nova.nova_server.domain.keyword.entity.Keyword;
12-
import com.nova.nova_server.domain.keyword.repository.KeywordRepository;
1313
import com.nova.nova_server.domain.member.entity.MemberPreferInterest;
1414
import com.nova.nova_server.domain.member.entity.MemberPreferKeyword;
1515
import com.nova.nova_server.domain.member.error.MemberErrorCode;
1616
import com.nova.nova_server.domain.member.repository.MemberPreferInterestRepository;
1717
import com.nova.nova_server.domain.member.repository.MemberPreferKeywordRepository;
18-
import com.nova.nova_server.domain.member.repository.MemberRepository;
1918
import com.nova.nova_server.domain.member.repository.MemberProfileImageRepository;
19+
import com.nova.nova_server.domain.member.repository.MemberRepository;
2020
import com.nova.nova_server.global.apiPayload.exception.NovaException;
21-
2221
import lombok.RequiredArgsConstructor;
2322
import lombok.extern.slf4j.Slf4j;
2423
import org.springframework.stereotype.Service;
@@ -119,6 +118,10 @@ public void updateMemberPersonalization(Long memberId, MemberPersonalizationDto
119118
updateMemberKeywords(member, keywordNames);
120119
}
121120

121+
public List<String> getMemberKeywords(Long memberId) {
122+
return memberPreferKeywordRepository.findKeywordNamesByMemberId(memberId);
123+
}
124+
122125
private void updateMemberInterests(Member member, List<Long> interestIds) {
123126
memberPreferInterestRepository.deleteByMember(member);
124127
memberPreferInterestRepository.flush();

0 commit comments

Comments
 (0)