Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ public class MemberController {

@Operation(
summary = "구글 로그인 API",
description = "구글 인가코드을 통해 사용자의 정보를 등록 및 토큰 + 역할을 발급합니다. (ROLE -> 처음사용자 : GUEST, 일반사용자 : USER, 관리자 : ADMIN)"
description = "구글 인가코드을 통해 사용자의 정보를 등록 및 토큰 + 역할을 발급합니다. " +
"<br><br>[enum]ROLE -> 처음사용자 : GUEST, 일반사용자 : USER, 관리자 : ADMIN"
)
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "로그인 성공"),
Expand Down Expand Up @@ -61,7 +62,16 @@ public ResponseEntity<ApiResponse<LoginResponseDTO>> loginWithKakao(@Valid @Requ

@Operation(
summary = "사용자 정보 조회 API",
description = "토큰을 통해 인증된 사용자의 정보를 반환합니다."
description = "토큰을 통해 인증된 사용자의 정보를 반환합니다." +
"<br><br>[enum]독서 취향 유형 ->" +
"<br>- EMOTIONAL_REFLECTOR: 감성 사색 정리러" +
"<br>- CHATTY_READER: 수다쟁이 책러" +
"<br>- TREND_HUNTER: 신상 헌터" +
"<br>- SYSTEMATIC_READER: 정리왕 서평러" +
"<br>- IMMERSIVE_READER: 넷플릭스급 몰입러" +
"<br>- SECRET_DIARIST: 비밀 일기장 주인" +
"<br>- GENRE_SPECIALIST: 장르 고인물" +
"<br>- RANDOM_PICKER: 랜덤 피커"
)
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "사용자 정보 조회 성공"),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.moongeul.backend.api.member.controller;

import com.moongeul.backend.api.member.dto.TestRequestDTO;
import com.moongeul.backend.api.member.dto.TestResponseDTO;
import com.moongeul.backend.api.member.service.ReadingTasteService;
import com.moongeul.backend.common.response.ApiResponse;
import com.moongeul.backend.common.response.SuccessStatus;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;

@Tag(name = "ReadingTaste", description = "ReadingTaste(독서취향테스트) 관련 API 입니다.")
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v2/reading-taste")
public class ReadingTasteController {

private final ReadingTasteService readingTasteService;


@Operation(
summary = "독서 취향 테스트 API",
description = "독서 취향 테스트 결과를 계산하여 유형을 반환하는 API 입니다." +
"<br><br>요청 형식:" +
"<br>- answers: 질문 번호(1-12)와 답변(A or B)의 Map으로 전달바랍니다." +
"<br><br>**예시:**\n" +
"```json\n" +
"{\n" +
" \"answers\": {\n" +
" \"1\": \"A\",\n" +
" \"2\": \"B\",\n" +
" \"3\": \"A\",\n" +
" \"4\": \"B\",\n" +
" \"5\": \"A\",\n" +
" \"6\": \"B\",\n" +
" \"7\": \"A\",\n" +
" \"8\": \"B\",\n" +
" \"9\": \"A\",\n" +
" \"10\": \"B\",\n" +
" \"11\": \"A\",\n" +
" \"12\": \"B\"\n" +
"}\n" +
" "
)
@ApiResponses({
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "200", description = "독서 취향 테스트 결과 계산 성공"),
@io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "400", description = "답변이 비어있습니다.")
})
@PostMapping
public ResponseEntity<ApiResponse<TestResponseDTO>> calculateReadingTasteType(@AuthenticationPrincipal UserDetails userDetails,
@RequestBody TestRequestDTO testRequestDTO) {

TestResponseDTO response = readingTasteService.calculateReadingTasteType(testRequestDTO, userDetails.getUsername());
return ApiResponse.success(SuccessStatus.CALCULATE_READING_TASTE_SUCCESS, response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.moongeul.backend.api.member.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.Map;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TestRequestDTO {

@Schema(
description = "질문 번호(1-12)와 답변(A or B) 매핑",
example = "{\"1\":\"A\",\"2\":\"A\",\"3\":\"A\",\"4\":\"A\",\"5\":\"A\",\"6\":\"A\",\"7\":\"A\",\"8\":\"A\",\"9\":\"A\",\"10\":\"A\",\"11\":\"A\",\"12\":\"A\"}"
)
@NotNull(message = "테스트 답변 입력은 필수입니다")
private Map<Integer, String> answers; // {1: "A", 2: "B", ...}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.moongeul.backend.api.member.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class TestResponseDTO {

private String readingTasteType; // 독서 취향 유형
private String intro; // 한줄 소개
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.moongeul.backend.api.member.dto;

import com.moongeul.backend.api.member.entity.ReadingTasteType;
import lombok.Builder;
import lombok.Getter;

Expand All @@ -11,4 +12,5 @@ public class UserInfoDTO {
private final String name; // 회원 이름(실명)
private final String profileImage; // 회원 이미지
private final String nickname; //닉네임 (초기랜덤생성)
private ReadingTasteType readingTasteType; // 독서 취향 유형
}
13 changes: 13 additions & 0 deletions src/main/java/com/moongeul/backend/api/member/entity/Member.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@ public class Member extends BaseTimeEntity {
private String nickname; //닉네임 (초기랜덤생성)
private String password;

@Enumerated(EnumType.STRING)
private ReadingTasteType readingTasteType; // 독서 취향 유형

@Column(unique = true)
private String socialId; // 소셜 로그인 ID (고유값)

Expand All @@ -53,7 +56,17 @@ public Member update(String name, String picture) {
return this;
}

/**
* 리프레시 토큰 업데이트
*/
public void updateRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}

/**
* 독서 취향 유형 업데이트
*/
public void updateReadingTasteType(ReadingTasteType readingTasteType) {
this.readingTasteType = readingTasteType;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.moongeul.backend.api.member.entity;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum ReadingTasteType {

EMOTIONAL_REFLECTOR("감성 사색 정리러", "감성 새벽 독거노인"),
CHATTY_READER("수다쟁이 책러", "문화센터 전도사"),
TREND_HUNTER("신상 헌터", "신간과 트렌드만이 답이다"),
SYSTEMATIC_READER("정리왕 서평러", "안 쓰면 안 읽은 거다"),
IMMERSIVE_READER("넷플릭스급 몰입러", "드라마 오타쿠 몽상가"),
SECRET_DIARIST("비밀 일기장 주인", "내 기록은 흑역사, 공개 불가"),
GENRE_SPECIALIST("장르 고인물", "난 같은 장르만 조진다"),
RANDOM_PICKER("랜덤 피커", "책 선택은 운명이다");


private final String name;
private final String intro;
}
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ public UserInfoDTO getUserInfo(String email){
.name(member.getName())
.profileImage(member.getProfileImage())
.nickname(member.getNickname())
.readingTasteType(member.getReadingTasteType())
.build();
}

Expand Down
Loading