diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/controller/AnimalMissionController.java b/src/main/java/com/pbl/insaroad/domain/animalmission/controller/AnimalMissionController.java index b283200..abc9572 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/controller/AnimalMissionController.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/controller/AnimalMissionController.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.controller; import jakarta.validation.Valid; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Crane.java b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Crane.java index d284a4e..9c3061b 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Crane.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Crane.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.data; import java.util.Arrays; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Haetae.java b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Haetae.java index 5c98137..5edd0f6 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Haetae.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Haetae.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.data; import java.util.Arrays; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Magpie.java b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Magpie.java index 02ba9f7..830d5bb 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Magpie.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Magpie.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.data; import java.util.Arrays; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Tiger.java b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Tiger.java index 32a7da5..ac51eb6 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Tiger.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Tiger.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.data; import java.util.Arrays; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Turtle.java b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Turtle.java index c12cd08..cc99b5f 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/data/Turtle.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/data/Turtle.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.data; import java.util.Arrays; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/dto/request/AnimalMissionSubmitRequest.java b/src/main/java/com/pbl/insaroad/domain/animalmission/dto/request/AnimalMissionSubmitRequest.java index 914314f..e1bd5ee 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/dto/request/AnimalMissionSubmitRequest.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/dto/request/AnimalMissionSubmitRequest.java @@ -1,7 +1,11 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.dto.request; import java.util.List; +import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -18,6 +22,10 @@ @Schema(description = "동물 미션 테스트 결과 제출 요청") public class AnimalMissionSubmitRequest { + @NotBlank(message = "사용자 코드는 필수입니다.") + @Schema(description = "사용자 코드 (3자리)", example = "123") + private String userCode; + @NotNull @Size(min = 2, max = 2, message = "문양은 2개를 선택해야 합니다.") @Schema(description = "문양 선택 (2개)", example = "[\"TIGER\", \"CRANE\"]") private List patternAnimals; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/DescriptionResponse.java b/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/DescriptionResponse.java index 03a1bee..a04d65a 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/DescriptionResponse.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/DescriptionResponse.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.dto.response; import java.util.List; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/ResultTextSegment.java b/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/ResultTextSegment.java index ec6fba5..36945fb 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/ResultTextSegment.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/dto/response/ResultTextSegment.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.dto.response; import io.swagger.v3.oas.annotations.media.Schema; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/entity/AnimalType.java b/src/main/java/com/pbl/insaroad/domain/animalmission/entity/AnimalType.java index 297510e..60d999a 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/entity/AnimalType.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/entity/AnimalType.java @@ -1,3 +1,6 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.entity; import lombok.Getter; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/exception/AnimalMissionErrorCode.java b/src/main/java/com/pbl/insaroad/domain/animalmission/exception/AnimalMissionErrorCode.java index 4906d59..e61a0f5 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/exception/AnimalMissionErrorCode.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/exception/AnimalMissionErrorCode.java @@ -1,6 +1,10 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.exception; import org.springframework.http.HttpStatus; + import com.pbl.insaroad.global.exception.model.BaseErrorCode; import lombok.AllArgsConstructor; @@ -10,6 +14,8 @@ @AllArgsConstructor public enum AnimalMissionErrorCode implements BaseErrorCode { DUPLICATE_PATTERN_ANIMALS("ANIMAL_4001", "patternAnimals에 중복된 동물이 있습니다.", HttpStatus.BAD_REQUEST), + USER_NOT_FOUND("ANIMAL_4002", "사용자를 찾을 수 없습니다.", HttpStatus.NOT_FOUND), + USER_NOT_STAGE_3("ANIMAL_4003", "사용자의 스테이지가 3이 아닙니다.", HttpStatus.BAD_REQUEST), ; private final String code; diff --git a/src/main/java/com/pbl/insaroad/domain/animalmission/service/AnimalMissionService.java b/src/main/java/com/pbl/insaroad/domain/animalmission/service/AnimalMissionService.java index 7f1cbcc..12017da 100644 --- a/src/main/java/com/pbl/insaroad/domain/animalmission/service/AnimalMissionService.java +++ b/src/main/java/com/pbl/insaroad/domain/animalmission/service/AnimalMissionService.java @@ -1,8 +1,12 @@ +/* + * Copyright (c) SKU PBL Team4 + */ package com.pbl.insaroad.domain.animalmission.service; import java.util.*; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.pbl.insaroad.domain.animalmission.data.Crane; import com.pbl.insaroad.domain.animalmission.data.Haetae; @@ -13,14 +17,21 @@ import com.pbl.insaroad.domain.animalmission.dto.response.AnimalResultResponse; import com.pbl.insaroad.domain.animalmission.entity.AnimalType; import com.pbl.insaroad.domain.animalmission.exception.AnimalMissionErrorCode; +import com.pbl.insaroad.domain.user.entity.User; +import com.pbl.insaroad.domain.user.repository.UserRepository; import com.pbl.insaroad.global.exception.CustomException; +import lombok.RequiredArgsConstructor; + @Service +@RequiredArgsConstructor public class AnimalMissionService { // 동물 타입별 결과 응답을 저장하는 Map private static final Map ANIMAL_RESULTS = new HashMap<>(); + private final UserRepository userRepository; + static { ANIMAL_RESULTS.put(AnimalType.TIGER, Tiger.CONTENT); ANIMAL_RESULTS.put(AnimalType.MAGPIE, Magpie.CONTENT); @@ -30,10 +41,22 @@ public class AnimalMissionService { } // 동물 미션 제출 처리 메서드 + @Transactional public AnimalResultResponse submitAnimalMission(AnimalMissionSubmitRequest request) { // 0. patternAnimals 중복 검증 validateNoDuplicatePatternAnimals(request.getPatternAnimals()); + // 사용자 조회 + User user = + userRepository + .findByCode(request.getUserCode()) + .orElseThrow(() -> new CustomException(AnimalMissionErrorCode.USER_NOT_FOUND)); + + // 사용자 스테이지 검증 + if (user.getStage() != 3) { + throw new CustomException(AnimalMissionErrorCode.USER_NOT_STAGE_3); + } + // 1. 동물별 점수 집계 Map scoreMap = calculateScores(request); @@ -57,6 +80,10 @@ public AnimalResultResponse submitAnimalMission(AnimalMissionSubmitRequest reque .orElse(request.getPaintingAnimal()); } + // 스테이지가 3이면 미션 완료 처리 + user.completeMission(); + userRepository.save(user); + return ANIMAL_RESULTS.get(resultAnimal); }