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
@@ -0,0 +1,59 @@
package org.withtime.be.withtimebe.domain.date.preference.controller;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.namul.api.payload.response.DefaultResponse;
import org.springframework.web.bind.annotation.*;
import org.withtime.be.withtimebe.domain.date.preference.converter.DatePreferenceConverter;
import org.withtime.be.withtimebe.domain.date.preference.dto.DatePreferenceRequestDTO;
import org.withtime.be.withtimebe.domain.date.preference.dto.DatePreferenceResponseDTO;
import org.withtime.be.withtimebe.domain.date.preference.service.command.DatePreferenceTestCommandService;
import org.withtime.be.withtimebe.domain.date.preference.service.query.DatePreferenceDescriptionQueryService;
import org.withtime.be.withtimebe.domain.date.preference.service.query.DatePreferenceQuestionQueryService;
import org.withtime.be.withtimebe.domain.member.entity.Member;
import org.withtime.be.withtimebe.global.security.annotation.AuthenticatedMember;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1/dates/preferences")
@Tag(name = "데이트 취향 테스트 API")
public class DatePreferenceController {

private final DatePreferenceTestCommandService datePreferenceTestCommandService;
private final DatePreferenceDescriptionQueryService datePreferenceDescriptionQueryService;
private final DatePreferenceQuestionQueryService datePreferenceQuestionQueryService;

@Operation(summary = "데이트 취향 조회 API", description = "데이트 취향 종류 조회")
@ApiResponse(responseCode = "COMMON200", description = "성공적으로 정보를 가져왔습니다.")
@GetMapping
public DefaultResponse<DatePreferenceResponseDTO.FindTypes> findTypes() {
return DefaultResponse.ok(DatePreferenceConverter.toFindTypes(datePreferenceDescriptionQueryService.findTypes()));
}

@Operation(summary = "데이트 취향 테스트 질문 조회 API", description = "데이트 취향 테스트에 사용되는 질문 조회하는 API")
@ApiResponse(responseCode = "COMMON200", description = "성공적으로 정보를 가져왔습니다.")
@GetMapping("/questions")
public DefaultResponse<DatePreferenceResponseDTO.FindQuestions> findQuestions() {
return DefaultResponse.ok(DatePreferenceConverter.toFindQuestions(datePreferenceQuestionQueryService.findQuestions()));
}

@Operation(summary = "데이트 취향 테스트 API", description = "질문에 대한 답변으로 결과 생성하는 API 1, 2 둘 중 하나로 40개로 채워 배열 형태로 전송")
@ApiResponses({
@ApiResponse(responseCode = "COMMON200", description = "테스트에 성공했습니다."),
@ApiResponse(
responseCode = "401",
description = """
다음과 같은 이유로 실패할 수 있습니다:
- DATE_PREFERENCE400_1: 질문에 대한 형식이 잘못되었습니다.
"""
),
})
@PostMapping("/tests")
public DefaultResponse<DatePreferenceResponseDTO.TestResult> test(@AuthenticatedMember Member member, @RequestBody DatePreferenceRequestDTO.Test request) {
return DefaultResponse.ok(datePreferenceTestCommandService.test(member, request));
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
package org.withtime.be.withtimebe.domain.date.preference.converter;

import org.withtime.be.withtimebe.domain.date.preference.dto.DatePreferenceResponseDTO;
import org.withtime.be.withtimebe.domain.date.preference.entity.DatePreferenceDescription;
import org.withtime.be.withtimebe.domain.date.preference.entity.DatePreferencePartDescription;
import org.withtime.be.withtimebe.domain.date.preference.entity.DatePreferenceQuestion;
import org.withtime.be.withtimebe.domain.date.preference.entity.DatePreferenceTestResult;
import org.withtime.be.withtimebe.domain.date.preference.entity.enums.PreferenceType;

import java.util.List;

public class DatePreferenceConverter {
public static DatePreferenceResponseDTO.FindTypes toFindTypes(List<DatePreferenceDescription> datePreferenceDescriptions) {
return DatePreferenceResponseDTO.FindTypes.builder()
.types(datePreferenceDescriptions.stream().map(DatePreferenceConverter::toFindType).toList())
.size(datePreferenceDescriptions.size())
.build();
}

public static DatePreferenceResponseDTO.FindType toFindType(DatePreferenceDescription datePreferenceDescription) {
return DatePreferenceResponseDTO.FindType.builder()
.symbolicAnimal(datePreferenceDescription.getSymbolicAnimal())
.preferenceType(datePreferenceDescription.getPreferenceType())
.simpleDescription(datePreferenceDescription.getSimpleDescription())
.build();
}

public static DatePreferenceResponseDTO.FindQuestions toFindQuestions(List<DatePreferenceQuestion> datePreferenceQuestions) {
return DatePreferenceResponseDTO.FindQuestions.builder()
.questions(datePreferenceQuestions.stream().map(DatePreferenceConverter::toFindQuestion).toList())
.size(datePreferenceQuestions.size())
.build();
}

public static DatePreferenceResponseDTO.FindQuestion toFindQuestion(DatePreferenceQuestion datePreferenceQuestion) {
return DatePreferenceResponseDTO.FindQuestion.builder()
.question(datePreferenceQuestion.getQuestion())
.firstAnswer(datePreferenceQuestion.getFirstAnswer())
.secondAnswer(datePreferenceQuestion.getSecondAnswer())
.build();
}

public static DatePreferenceResponseDTO.TestResult toTestResult(DatePreferenceTestResult datePreferenceTestResult,
DatePreferenceDescription datePreferenceDescription,
List<DatePreferencePartDescription> datePreferencePartDescriptions) {
return DatePreferenceResponseDTO.TestResult.builder()
.preferenceType(datePreferenceTestResult.getPreferenceType())
.aPercentage(datePreferenceTestResult.getAPercentage())
.bPercentage(datePreferenceTestResult.getBPercentage())
.cPercentage(datePreferenceTestResult.getCPercentage())
.dPercentage(datePreferenceTestResult.getDPercentage())
.typeDescription(datePreferenceDescription == null ? null : DatePreferenceConverter.toTypeDescription(datePreferenceDescription))
.partTypeDescriptions(datePreferencePartDescriptions == null || datePreferencePartDescriptions.isEmpty() ? null : DatePreferenceConverter.toPartTypeDescriptions(datePreferencePartDescriptions))
.build();
}

public static DatePreferenceTestResult toDatePreferenceTestResult(PreferenceType preferenceType,
Double aPercentage,
Double bPercentage,
Double cPercentage,
Double dPercentage) {
return DatePreferenceTestResult.builder()
.preferenceType(preferenceType)
.aPercentage(aPercentage)
.bPercentage(bPercentage)
.cPercentage(cPercentage)
.dPercentage(dPercentage)
.build();
}

public static DatePreferenceResponseDTO.TypeDescription toTypeDescription(DatePreferenceDescription datePreferenceDescription) {
return DatePreferenceResponseDTO.TypeDescription.builder()
.symbolicAnimal(datePreferenceDescription.getSymbolicAnimal())
.preferenceType(datePreferenceDescription.getPreferenceType())
.simpleDescription(datePreferenceDescription.getSimpleDescription())
.analysis(datePreferenceDescription.getAnalysis())
.build();
}

public static DatePreferenceResponseDTO.PartTypeDescriptions toPartTypeDescriptions(List<DatePreferencePartDescription> descriptions) {
return DatePreferenceResponseDTO.PartTypeDescriptions.builder()
.types(descriptions.stream().map(DatePreferenceConverter::toPartTypeDescription).toList())
.size(descriptions.size())
.build();
}

public static DatePreferenceResponseDTO.PartTypeDescription toPartTypeDescription(DatePreferencePartDescription description) {
return DatePreferenceResponseDTO.PartTypeDescription.builder()
.typeInitial(description.getPreferencePartType())
.type(description.getType())
.typeEng(description.getTypeEng())
.description(description.getDescription())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.withtime.be.withtimebe.domain.date.preference.dto;

import io.swagger.v3.oas.annotations.media.Schema;

import java.util.List;

public record DatePreferenceRequestDTO() {
public record Test(
@Schema(
description = "1 또는 2 중 하나의 값으로 이루어진 40개의 답변",
example = """
[
1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1, 1, 1, 2, 2, 2, 2,
1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
1, 1, 1, 1, 1, 1, 2, 2, 2, 2
]
"""
)
List<Integer> answers
) {

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package org.withtime.be.withtimebe.domain.date.preference.dto;

import lombok.Builder;
import org.withtime.be.withtimebe.domain.date.preference.entity.enums.PreferencePartType;
import org.withtime.be.withtimebe.domain.date.preference.entity.enums.PreferenceType;

import java.util.List;

public record DatePreferenceResponseDTO() {

@Builder
public record FindTypes(
List<FindType> types,
Integer size
) {

}

@Builder
public record FindType(
String symbolicAnimal,
PreferenceType preferenceType,
String simpleDescription
) {

}

@Builder
public record FindQuestions(
List<FindQuestion> questions,
Integer size
) {

}

@Builder
public record FindQuestion(
String question,
String firstAnswer,
String secondAnswer
) {

}

@Builder
public record TestResult(
PreferenceType preferenceType,
Double aPercentage,
Double bPercentage,
Double cPercentage,
Double dPercentage,
TypeDescription typeDescription,
PartTypeDescriptions partTypeDescriptions
) {

}

@Builder
public record TypeDescription(
String symbolicAnimal,
PreferenceType preferenceType,
String simpleDescription,
String analysis
) {

}

@Builder
public record PartTypeDescriptions(
List<PartTypeDescription> types,
Integer size
) {

}

@Builder
public record PartTypeDescription(
PreferencePartType typeInitial,
String typeEng,
String type,
String description
) {

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.withtime.be.withtimebe.domain.date.preference.entity;

import jakarta.persistence.*;
import lombok.*;
import org.withtime.be.withtimebe.domain.date.preference.entity.enums.PreferenceType;

@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Table(name = "date_preference_description")
public class DatePreferenceDescription {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "date_preference_description_id")
private Long id;

@Column(name = "symbolic_animal")
private String symbolicAnimal;

@Enumerated(EnumType.STRING)
@Column(name = "preference_type", unique = true)
private PreferenceType preferenceType;

@Column(name = "simple_description")
private String simpleDescription;

@Column(name = "analysis", columnDefinition = "TEXT")
private String analysis;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.withtime.be.withtimebe.domain.date.preference.entity;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Table(name = "date_preference_description_keyword")
public class DatePreferenceDescriptionKeyword {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "date_preference_description_keyword_id")
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "date_preference_description")
private DatePreferenceDescription datePreferenceDescription;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "date_preference_keyword")
private DatePreferenceKeyword datePreferenceKeyword;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package org.withtime.be.withtimebe.domain.date.preference.entity;

import jakarta.persistence.*;
import lombok.*;

@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Table(name = "date_preference_keyword")
public class DatePreferenceKeyword {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "date_preference_keyword_id")
private Long id;

@Column(name = "keyword")
private String keyword;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package org.withtime.be.withtimebe.domain.date.preference.entity;

import jakarta.persistence.*;
import lombok.*;
import org.withtime.be.withtimebe.domain.date.preference.entity.enums.PreferencePartType;

@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Table(name = "date_preference_part_description")
public class DatePreferencePartDescription {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "date_preference_part_description_id")
private Long id;

@Enumerated(EnumType.STRING)
@Column(name = "preference_part_type", unique = true)
private PreferencePartType preferencePartType;

@Column(name = "type_eng")
private String typeEng;

@Column(name = "type")
private String type;

@Column(name = "description")
private String description;
}
Loading