diff --git a/src/main/java/com/mycom/backenddaengplace/trait/controller/TraitController.java b/src/main/java/com/mycom/backenddaengplace/trait/controller/TraitController.java index 115eb4c..41113a0 100644 --- a/src/main/java/com/mycom/backenddaengplace/trait/controller/TraitController.java +++ b/src/main/java/com/mycom/backenddaengplace/trait/controller/TraitController.java @@ -1,15 +1,16 @@ package com.mycom.backenddaengplace.trait.controller; +import com.mycom.backenddaengplace.auth.dto.CustomOAuth2User; import com.mycom.backenddaengplace.common.dto.ApiResponse; +import com.mycom.backenddaengplace.trait.dto.request.MemberTraitResponseRequestList; import com.mycom.backenddaengplace.trait.dto.response.TraitQuestionResponse; import com.mycom.backenddaengplace.trait.enums.QuestionTarget; +import com.mycom.backenddaengplace.trait.service.MemberTraitService; import com.mycom.backenddaengplace.trait.service.TraitService; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -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; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; import java.util.List; @@ -19,10 +20,18 @@ public class TraitController { private final TraitService traitService; + private final MemberTraitService memberTraitService; @GetMapping("/questions") public ResponseEntity>> getTraitQuestions(@RequestParam QuestionTarget target) { return ResponseEntity.ok(ApiResponse.success("성향 질문 목록을 조회했습니다.", traitService.getTraitQuestions(target))); } + + @PostMapping("/register") + public ResponseEntity> registerMemberTraitResponse(@RequestBody MemberTraitResponseRequestList request, + @AuthenticationPrincipal CustomOAuth2User customOAuth2User) { + memberTraitService.saveMemberTraitResponse(request, customOAuth2User.getMember()); + return ResponseEntity.ok(ApiResponse.success("성향 검사 결과를 등록했습니다.")); + } } diff --git a/src/main/java/com/mycom/backenddaengplace/trait/domain/MemberTraitResponse.java b/src/main/java/com/mycom/backenddaengplace/trait/domain/MemberTraitResponse.java index b5e150b..f0c92c6 100644 --- a/src/main/java/com/mycom/backenddaengplace/trait/domain/MemberTraitResponse.java +++ b/src/main/java/com/mycom/backenddaengplace/trait/domain/MemberTraitResponse.java @@ -3,6 +3,7 @@ import com.mycom.backenddaengplace.member.domain.Member; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -29,4 +30,11 @@ public class MemberTraitResponse { @JoinColumn(name = "trait_question_id", nullable = false) private TraitQuestion traitQuestion; + @Builder + public MemberTraitResponse(MemberTraitResponseId id, Member member, TraitAnswer traitAnswer, TraitQuestion traitQuestion) { + this.id = id; + this.member = member; + this.traitAnswer = traitAnswer; + this.traitQuestion = traitQuestion; + } } diff --git a/src/main/java/com/mycom/backenddaengplace/trait/dto/request/MemberTraitResponseRequest.java b/src/main/java/com/mycom/backenddaengplace/trait/dto/request/MemberTraitResponseRequest.java new file mode 100644 index 0000000..d7d4080 --- /dev/null +++ b/src/main/java/com/mycom/backenddaengplace/trait/dto/request/MemberTraitResponseRequest.java @@ -0,0 +1,12 @@ +package com.mycom.backenddaengplace.trait.dto.request; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class MemberTraitResponseRequest { + private Long memberId; + private Long traitQuestionId; + private Long traitAnswerId; +} diff --git a/src/main/java/com/mycom/backenddaengplace/trait/dto/request/MemberTraitResponseRequestList.java b/src/main/java/com/mycom/backenddaengplace/trait/dto/request/MemberTraitResponseRequestList.java new file mode 100644 index 0000000..ef741ce --- /dev/null +++ b/src/main/java/com/mycom/backenddaengplace/trait/dto/request/MemberTraitResponseRequestList.java @@ -0,0 +1,10 @@ +package com.mycom.backenddaengplace.trait.dto.request; + +import lombok.Data; + +import java.util.List; + +@Data +public class MemberTraitResponseRequestList { + private List memberTraitResponseRequestList; +} diff --git a/src/main/java/com/mycom/backenddaengplace/trait/exception/TraitAnswerNotFoundException.java b/src/main/java/com/mycom/backenddaengplace/trait/exception/TraitAnswerNotFoundException.java new file mode 100644 index 0000000..de69ff8 --- /dev/null +++ b/src/main/java/com/mycom/backenddaengplace/trait/exception/TraitAnswerNotFoundException.java @@ -0,0 +1,11 @@ +package com.mycom.backenddaengplace.trait.exception; + +import com.mycom.backenddaengplace.common.exception.BaseException; +import org.springframework.http.HttpStatus; + +public class TraitAnswerNotFoundException extends BaseException { + public TraitAnswerNotFoundException(Long answerId) { + super(String.format("성향 답변 ID [%d]를 찾을 수 없습니다.", answerId), + HttpStatus.NOT_FOUND); + } +} diff --git a/src/main/java/com/mycom/backenddaengplace/trait/exception/TraitQuestionNotFoundException.java b/src/main/java/com/mycom/backenddaengplace/trait/exception/TraitQuestionNotFoundException.java new file mode 100644 index 0000000..64164f4 --- /dev/null +++ b/src/main/java/com/mycom/backenddaengplace/trait/exception/TraitQuestionNotFoundException.java @@ -0,0 +1,11 @@ +package com.mycom.backenddaengplace.trait.exception; + +import com.mycom.backenddaengplace.common.exception.BaseException; +import org.springframework.http.HttpStatus; + +public class TraitQuestionNotFoundException extends BaseException { + public TraitQuestionNotFoundException(Long questionId) { + super(String.format("성향 질문 ID [%d]를 찾을 수 없습니다.", questionId), + HttpStatus.NOT_FOUND); + } +} diff --git a/src/main/java/com/mycom/backenddaengplace/trait/repository/MemberTraitResponseRepository.java b/src/main/java/com/mycom/backenddaengplace/trait/repository/MemberTraitResponseRepository.java new file mode 100644 index 0000000..e55f714 --- /dev/null +++ b/src/main/java/com/mycom/backenddaengplace/trait/repository/MemberTraitResponseRepository.java @@ -0,0 +1,8 @@ +package com.mycom.backenddaengplace.trait.repository; + +import com.mycom.backenddaengplace.trait.domain.MemberTraitResponse; +import com.mycom.backenddaengplace.trait.domain.MemberTraitResponseId; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MemberTraitResponseRepository extends JpaRepository { +} diff --git a/src/main/java/com/mycom/backenddaengplace/trait/repository/TraitAnswerRepository.java b/src/main/java/com/mycom/backenddaengplace/trait/repository/TraitAnswerRepository.java new file mode 100644 index 0000000..352fc6a --- /dev/null +++ b/src/main/java/com/mycom/backenddaengplace/trait/repository/TraitAnswerRepository.java @@ -0,0 +1,7 @@ +package com.mycom.backenddaengplace.trait.repository; + +import com.mycom.backenddaengplace.trait.domain.TraitAnswer; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface TraitAnswerRepository extends JpaRepository { +} diff --git a/src/main/java/com/mycom/backenddaengplace/trait/service/MemberTraitService.java b/src/main/java/com/mycom/backenddaengplace/trait/service/MemberTraitService.java new file mode 100644 index 0000000..f97a0e4 --- /dev/null +++ b/src/main/java/com/mycom/backenddaengplace/trait/service/MemberTraitService.java @@ -0,0 +1,53 @@ +package com.mycom.backenddaengplace.trait.service; + +import com.mycom.backenddaengplace.member.domain.Member; +import com.mycom.backenddaengplace.trait.domain.MemberTraitResponse; +import com.mycom.backenddaengplace.trait.domain.MemberTraitResponseId; +import com.mycom.backenddaengplace.trait.domain.TraitAnswer; +import com.mycom.backenddaengplace.trait.domain.TraitQuestion; +import com.mycom.backenddaengplace.trait.dto.request.MemberTraitResponseRequest; +import com.mycom.backenddaengplace.trait.dto.request.MemberTraitResponseRequestList; +import com.mycom.backenddaengplace.trait.exception.TraitAnswerNotFoundException; +import com.mycom.backenddaengplace.trait.exception.TraitQuestionNotFoundException; +import com.mycom.backenddaengplace.trait.repository.MemberTraitResponseRepository; +import com.mycom.backenddaengplace.trait.repository.TraitAnswerRepository; +import com.mycom.backenddaengplace.trait.repository.TraitQuestionRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class MemberTraitService { + + private final TraitAnswerRepository traitAnswerRepository; + private final TraitQuestionRepository traitQuestionRepository; + private final MemberTraitResponseRepository memberTraitResponseRepository; + + public void saveMemberTraitResponse(MemberTraitResponseRequestList requestList, Member member) { + for (MemberTraitResponseRequest request : requestList.getMemberTraitResponseRequestList()) { + + TraitQuestion traitQuestion = traitQuestionRepository.findById(request.getTraitQuestionId()) + .orElseThrow(() -> new TraitQuestionNotFoundException(request.getTraitQuestionId())); + + TraitAnswer traitAnswer = traitAnswerRepository.findById(request.getTraitAnswerId()) + .orElseThrow(() -> new TraitAnswerNotFoundException(request.getTraitAnswerId())); + + // 복합키 생성 + MemberTraitResponseId responseId = new MemberTraitResponseId( + member.getId(), + request.getTraitAnswerId(), + request.getTraitQuestionId() + ); + + MemberTraitResponse response = MemberTraitResponse.builder() + .id(responseId) + .member(member) + .traitQuestion(traitQuestion) + .traitAnswer(traitAnswer) + .build(); + + memberTraitResponseRepository.save(response); + } + } + +}