diff --git a/src/main/java/com/gam/api/common/ErrorHandler.java b/src/main/java/com/gam/api/common/ErrorHandler.java index 8dc18302..3c9b3ed8 100644 --- a/src/main/java/com/gam/api/common/ErrorHandler.java +++ b/src/main/java/com/gam/api/common/ErrorHandler.java @@ -33,7 +33,7 @@ public ResponseEntity handleIllegalArgumentException(IllegalArgumen @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleMethodArgumentNotValidException(MethodArgumentNotValidException exception){ - ApiResponse response = ApiResponse.fail(EMPTY_METHOD_ARGUMENT.getMessage()); + ApiResponse response = ApiResponse.fail(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage()); return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST); } diff --git a/src/main/java/com/gam/api/domain/admin/controller/AdminController.java b/src/main/java/com/gam/api/domain/admin/controller/AdminController.java index 43e60df0..134d322a 100644 --- a/src/main/java/com/gam/api/domain/admin/controller/AdminController.java +++ b/src/main/java/com/gam/api/domain/admin/controller/AdminController.java @@ -6,6 +6,7 @@ import com.gam.api.domain.user.entity.GamUserDetails; import com.gam.api.domain.admin.service.AdminService; import io.swagger.annotations.ApiOperation; +import javax.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.http.ResponseEntity; @@ -50,7 +51,7 @@ public ResponseEntity getMagazineDetail(@RequestParam Long magazine @ApiOperation(value = "매거진 - 수정") @PatchMapping("/magazine/{magazineId}") - public ResponseEntity editMagazine(@PathVariable Long magazineId, @RequestBody MagazineRequestDTO request) { + public ResponseEntity editMagazine(@PathVariable Long magazineId, @Valid @RequestBody MagazineRequestDTO request) { adminService.editMagazine(magazineId, request); return ResponseEntity.ok(ApiResponse.success(ResponseMessage.SUCCESS_EDIT_MAGAZINE.getMessage())); } diff --git a/src/main/java/com/gam/api/domain/admin/dto/magazine/request/MagazineRequestDTO.java b/src/main/java/com/gam/api/domain/admin/dto/magazine/request/MagazineRequestDTO.java index 0fff0b19..e2c0f83f 100644 --- a/src/main/java/com/gam/api/domain/admin/dto/magazine/request/MagazineRequestDTO.java +++ b/src/main/java/com/gam/api/domain/admin/dto/magazine/request/MagazineRequestDTO.java @@ -7,20 +7,18 @@ import java.util.List; public record MagazineRequestDTO( - @NotNull - @NotBlank + @NotNull(message = "magazine title은 null일 수 없습니다.") + @NotBlank(message = "magazine title은 빈스트링 일 수 없습니다.") String title, - @NotNull - @NotBlank + @NotNull(message = "magazine photo는 null일 수 없습니다.") List magazinePhotos, - @NotNull - @NotBlank + @NotNull(message = "magazine intro는 null일 수 없습니다.") + @NotBlank(message = "magazine intro는 빈스트링 일 수 없습니다.") String magazineIntro, - @NotNull - @NotBlank + @NotNull(message = "magazine interviewPerson은 null일 수 없습니다.") + @NotBlank(message = "magazine interviewPerson은 빈스트링 일 수 없습니다.") String interviewPerson, - @NotNull - @NotBlank + @NotNull(message = "magazine questions는 null일 수 없습니다.") List questions ) { @Builder diff --git a/src/main/java/com/gam/api/domain/admin/service/AdminServiceImpl.java b/src/main/java/com/gam/api/domain/admin/service/AdminServiceImpl.java index 2604b593..8dba72e6 100644 --- a/src/main/java/com/gam/api/domain/admin/service/AdminServiceImpl.java +++ b/src/main/java/com/gam/api/domain/admin/service/AdminServiceImpl.java @@ -3,6 +3,7 @@ import com.gam.api.common.message.ExceptionMessage; import com.gam.api.domain.admin.dto.magazine.request.MagazineRequestDTO; +import com.gam.api.domain.admin.dto.magazine.request.MagazineRequestDTO.QuestionVO; import com.gam.api.domain.admin.dto.magazine.response.MagazineListResponseDTO; import com.gam.api.domain.admin.dto.magazine.response.MagazineDetailResponseDTO; @@ -13,6 +14,10 @@ import com.gam.api.domain.magazine.repository.QuestionRepository; import com.gam.api.domain.user.repository.UserRepository; import com.gam.api.domain.work.repository.WorkRepository; +import java.util.ArrayList; +import java.util.Collections; +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.stereotype.Service; @@ -27,9 +32,9 @@ public class AdminServiceImpl implements AdminService { private final MagazineRepository magazineRepository; - private final QuestionRepository questionRepository; private final UserRepository userRepository; private final WorkRepository workRepository; + private final int MAX_MAGAZINE_PHOTO_COUNT = 4; @Override public List getMagazines() { @@ -49,7 +54,7 @@ public void deleteMagazine(Long magazineId) { @Override public void createMagazine(MagazineRequestDTO request) { val mainPhotoCount = request.magazinePhotos().size(); - if (mainPhotoCount > 4) { + if (mainPhotoCount > MAX_MAGAZINE_PHOTO_COUNT) { throw new IllegalArgumentException(ExceptionMessage.INVALID_MAIN_PHOTOS_COUNT.getMessage()); } @@ -64,104 +69,74 @@ public void createMagazine(MagazineRequestDTO request) { val magazinePhotos = request.magazinePhotos().toArray(new String[request.magazinePhotos().size()]); magazine.setMagazine_photos(magazinePhotos); - request.questions().stream() - .map((questionVO) -> { - Question question = Question.builder() - .questionOrder(questionVO.questionOrder()) - .question(questionVO.question()) - .answer(questionVO.answer()) - .build(); - - if (questionVO.answerImage() == "") { - question.setAnswerImage(null); - question.setImageCaption(null); - } else { - question.setAnswerImage(questionVO.answerImage()); - question.setImageCaption(questionVO.imageCaption()); - } - question.setMagazine(magazine); - return question; - }).collect(Collectors.toList()); + toQuestionEntity(magazine, request.questions()); } @Override + @Transactional public void editMagazine(Long magazineId, MagazineRequestDTO request) { val magazine = magazineRepository.findById(magazineId) - .orElseThrow(()-> new EntityNotFoundException()); + .orElseThrow(() -> new EntityNotFoundException()); - if (magazine.getMagazineTitle() != request.title()) { - magazine.setMagazineTitle(request.title()); - } - if (magazine.getIntroduction() != request.magazineIntro()) { - magazine.setIntroduction(request.magazineIntro()); - } - if (magazine.getInterviewPerson() != request.interviewPerson()) { - magazine.setInterviewPerson(request.interviewPerson()); - } + magazine.setMagazineTitle(request.title()); + magazine.setIntroduction(request.magazineIntro()); + magazine.setInterviewPerson(request.interviewPerson()); val magazinePhotos = request.magazinePhotos().toArray(new String[request.magazinePhotos().size()]); magazine.setMagazine_photos(magazinePhotos); magazineRepository.save(magazine); - val currentQuestions = magazine.getQuestions(); - val requestQuestions = request.questions().stream() - .map((questionVO) -> { + List currentQuestions = new ArrayList<>(magazine.getQuestions()); + Collections.sort(request.questions(), (q1, q2) -> Integer.compare(q1.questionOrder(), q2.questionOrder())); + + int requestQuestionSize = request.questions().size(); + + if(requestQuestionSize <= currentQuestions.size()) { // 질문이 삭제 됐을 경우 + for (int i = 0; i < requestQuestionSize; i++) { + updateQuestionDetails(currentQuestions.get(i), request.questions().get(i)); + } + if(requestQuestionSize < currentQuestions.size()) { + magazine.getQuestions().removeAll(currentQuestions.subList(request.questions().size(), currentQuestions.size())); + } + return; + } + + for (int i = 0; i < currentQuestions.size(); i++) { // 질문이 추가 될 경우 + updateQuestionDetails(currentQuestions.get(i), request.questions().get(i)); + } + List createQuestion = request.questions().subList(currentQuestions.size(), request.questions().size()); + toQuestionEntity(magazine, createQuestion); + } + + private void updateQuestionDetails(Question oldQuestion, QuestionVO newQuestion) { + oldQuestion.setQuestionOrder(newQuestion.questionOrder()); + oldQuestion.setQuestion(newQuestion.question()); + oldQuestion.setAnswer(newQuestion.answer()); + oldQuestion.setAnswerImage(newQuestion.answerImage()); + oldQuestion.setImageCaption(newQuestion.imageCaption()); + } + + @Transactional + public void toQuestionEntity(Magazine magazine, List request) { + request.stream() + .forEach((questionVO) -> { Question question = Question.builder() .questionOrder(questionVO.questionOrder()) .question(questionVO.question()) .answer(questionVO.answer()) .build(); - if (questionVO.answerImage() == "") { + if (questionVO.answerImage().isBlank()) { question.setAnswerImage(null); question.setImageCaption(null); } else { question.setAnswerImage(questionVO.answerImage()); question.setImageCaption(questionVO.imageCaption()); } - return question; - }).collect(Collectors.toList()); - - checkEntityDiff(currentQuestions, requestQuestions); - - if (currentQuestions.size() < requestQuestions.size()) { - val createCount = requestQuestions.size() - currentQuestions.size(); - val currentQuestionSize = currentQuestions.size(); - for (int i = 0 ; i checkEntityDiff(List currentQuestions, List requestQuestions) { - val changeSize = currentQuestions.size(); - for (int i = 0; i questions) { this.questions = questions; } - @Builder public Magazine(String thumbNail, String magazineTitle, String introduction, String interviewPerson) { this.thumbNail = thumbNail; diff --git a/src/main/java/com/gam/api/domain/magazine/entity/Question.java b/src/main/java/com/gam/api/domain/magazine/entity/Question.java index 98297de5..1894962c 100644 --- a/src/main/java/com/gam/api/domain/magazine/entity/Question.java +++ b/src/main/java/com/gam/api/domain/magazine/entity/Question.java @@ -70,4 +70,17 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(getQuestionOrder(), getQuestion(), getAnswer(), getAnswerImage(), getImageCaption()); } + + @Override + public String toString() { + return "Question{" + + "id=" + id + + ", magazine=" + magazine + + ", questionOrder=" + questionOrder + + ", question='" + question + '\'' + + ", answer='" + answer + '\'' + + ", answerImage='" + answerImage + '\'' + + ", imageCaption='" + imageCaption + '\'' + + '}'; + } } diff --git a/src/main/java/com/gam/api/domain/report/dto/request/ReportCreateRequestDTO.java b/src/main/java/com/gam/api/domain/report/dto/request/ReportCreateRequestDTO.java index 01c98983..5dd83962 100644 --- a/src/main/java/com/gam/api/domain/report/dto/request/ReportCreateRequestDTO.java +++ b/src/main/java/com/gam/api/domain/report/dto/request/ReportCreateRequestDTO.java @@ -5,8 +5,8 @@ public record ReportCreateRequestDTO ( Long targetUserId, - @NotBlank - @NotNull + @NotBlank(message = "신고내용은 빈스트링일 수 없습니다.") + @NotNull(message = "신고내용은 null일 수 없습니다.") String content, Long workId ){ diff --git a/src/main/java/com/gam/api/external/s3/controller/S3Controller.java b/src/main/java/com/gam/api/domain/s3/controller/S3Controller.java similarity index 87% rename from src/main/java/com/gam/api/external/s3/controller/S3Controller.java rename to src/main/java/com/gam/api/domain/s3/controller/S3Controller.java index fb5fafe3..dd602592 100644 --- a/src/main/java/com/gam/api/external/s3/controller/S3Controller.java +++ b/src/main/java/com/gam/api/domain/s3/controller/S3Controller.java @@ -1,8 +1,8 @@ -package com.gam.api.external.s3.controller; +package com.gam.api.domain.s3.controller; import com.gam.api.common.message.ResponseMessage; -import com.gam.api.external.s3.dto.request.PresignedRequestDTO; -import com.gam.api.external.s3.service.S3ServiceImpl; +import com.gam.api.domain.s3.dto.request.PresignedRequestDTO; +import com.gam.api.domain.s3.service.S3ServiceImpl; import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import lombok.val; diff --git a/src/main/java/com/gam/api/external/s3/dto/request/ImageDeleteRequestDTO.java b/src/main/java/com/gam/api/domain/s3/dto/request/ImageDeleteRequestDTO.java similarity index 56% rename from src/main/java/com/gam/api/external/s3/dto/request/ImageDeleteRequestDTO.java rename to src/main/java/com/gam/api/domain/s3/dto/request/ImageDeleteRequestDTO.java index ed3261c0..72eadc1d 100644 --- a/src/main/java/com/gam/api/external/s3/dto/request/ImageDeleteRequestDTO.java +++ b/src/main/java/com/gam/api/domain/s3/dto/request/ImageDeleteRequestDTO.java @@ -1,4 +1,4 @@ -package com.gam.api.external.s3.dto.request; +package com.gam.api.domain.s3.dto.request; public record ImageDeleteRequestDTO(String fileName) { } diff --git a/src/main/java/com/gam/api/external/s3/dto/request/PresignedRequestDTO.java b/src/main/java/com/gam/api/domain/s3/dto/request/PresignedRequestDTO.java similarity index 65% rename from src/main/java/com/gam/api/external/s3/dto/request/PresignedRequestDTO.java rename to src/main/java/com/gam/api/domain/s3/dto/request/PresignedRequestDTO.java index dbd2d4d2..0cd881a9 100644 --- a/src/main/java/com/gam/api/external/s3/dto/request/PresignedRequestDTO.java +++ b/src/main/java/com/gam/api/domain/s3/dto/request/PresignedRequestDTO.java @@ -1,4 +1,4 @@ -package com.gam.api.external.s3.dto.request; +package com.gam.api.domain.s3.dto.request; import java.util.List; diff --git a/src/main/java/com/gam/api/external/s3/dto/response/PresignedResponseDTO.java b/src/main/java/com/gam/api/domain/s3/dto/response/PresignedResponseDTO.java similarity index 88% rename from src/main/java/com/gam/api/external/s3/dto/response/PresignedResponseDTO.java rename to src/main/java/com/gam/api/domain/s3/dto/response/PresignedResponseDTO.java index 70cdbee7..6b64d09e 100644 --- a/src/main/java/com/gam/api/external/s3/dto/response/PresignedResponseDTO.java +++ b/src/main/java/com/gam/api/domain/s3/dto/response/PresignedResponseDTO.java @@ -1,4 +1,4 @@ -package com.gam.api.external.s3.dto.response; +package com.gam.api.domain.s3.dto.response; import lombok.Builder; diff --git a/src/main/java/com/gam/api/external/s3/service/S3Service.java b/src/main/java/com/gam/api/domain/s3/service/S3Service.java similarity index 58% rename from src/main/java/com/gam/api/external/s3/service/S3Service.java rename to src/main/java/com/gam/api/domain/s3/service/S3Service.java index 287c3926..37a6d51b 100644 --- a/src/main/java/com/gam/api/external/s3/service/S3Service.java +++ b/src/main/java/com/gam/api/domain/s3/service/S3Service.java @@ -1,7 +1,7 @@ -package com.gam.api.external.s3.service; +package com.gam.api.domain.s3.service; -import com.gam.api.external.s3.dto.request.PresignedRequestDTO; -import com.gam.api.external.s3.dto.response.PresignedResponseDTO; +import com.gam.api.domain.s3.dto.request.PresignedRequestDTO; +import com.gam.api.domain.s3.dto.response.PresignedResponseDTO; import java.util.List; public interface S3Service { diff --git a/src/main/java/com/gam/api/external/s3/service/S3ServiceImpl.java b/src/main/java/com/gam/api/domain/s3/service/S3ServiceImpl.java similarity index 95% rename from src/main/java/com/gam/api/external/s3/service/S3ServiceImpl.java rename to src/main/java/com/gam/api/domain/s3/service/S3ServiceImpl.java index 66c10e52..54170cc3 100644 --- a/src/main/java/com/gam/api/external/s3/service/S3ServiceImpl.java +++ b/src/main/java/com/gam/api/domain/s3/service/S3ServiceImpl.java @@ -1,10 +1,10 @@ -package com.gam.api.external.s3.service; +package com.gam.api.domain.s3.service; import com.gam.api.common.exception.AwsException; import com.gam.api.common.message.*; import com.gam.api.config.S3Config; -import com.gam.api.external.s3.dto.request.PresignedRequestDTO; -import com.gam.api.external.s3.dto.response.PresignedResponseDTO; +import com.gam.api.domain.s3.dto.request.PresignedRequestDTO; +import com.gam.api.domain.s3.dto.response.PresignedResponseDTO; import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.http.HttpStatus; diff --git a/src/main/java/com/gam/api/domain/user/dto/request/UserOnboardRequestDTO.java b/src/main/java/com/gam/api/domain/user/dto/request/UserOnboardRequestDTO.java index 4be1ffdf..8abb5331 100644 --- a/src/main/java/com/gam/api/domain/user/dto/request/UserOnboardRequestDTO.java +++ b/src/main/java/com/gam/api/domain/user/dto/request/UserOnboardRequestDTO.java @@ -2,13 +2,13 @@ import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.Size; public record UserOnboardRequestDTO( - @NotBlank - @NotEmpty + @Size(min= 1, max= 15, message = "userName의 길이는 1글자 이상 15글자 이하여야 합니다.") String userName, - @NotBlank - @NotEmpty + @NotBlank(message = "info는 \"\"일 수 없습니다.") + @NotEmpty(message = "info는 null일 수 없습니다.") String info, @NotEmpty(message = "tags는 null일 수 없습니다, 하나 이상의 tag를 선택 해 주세요.") int[] tags diff --git a/src/main/java/com/gam/api/domain/work/dto/request/WorkEditRequestDTO.java b/src/main/java/com/gam/api/domain/work/dto/request/WorkEditRequestDTO.java index e2590ebc..e1375be2 100644 --- a/src/main/java/com/gam/api/domain/work/dto/request/WorkEditRequestDTO.java +++ b/src/main/java/com/gam/api/domain/work/dto/request/WorkEditRequestDTO.java @@ -6,9 +6,9 @@ public record WorkEditRequestDTO( Long workId, - @NotBlank + @NotBlank(message = "작업물 이미지를 추가해주세요") String image, - @NotBlank + @NotBlank(message = "작업물 제목은 빈스트링 일 수 없습니다.") String title, String detail ) { diff --git a/src/main/java/com/gam/api/domain/work/service/WorkServiceImpl.java b/src/main/java/com/gam/api/domain/work/service/WorkServiceImpl.java index 5e6f32e8..8dc5c4fc 100644 --- a/src/main/java/com/gam/api/domain/work/service/WorkServiceImpl.java +++ b/src/main/java/com/gam/api/domain/work/service/WorkServiceImpl.java @@ -13,7 +13,7 @@ import com.gam.api.domain.work.entity.Work; import com.gam.api.domain.user.repository.UserRepository; import com.gam.api.domain.work.repository.WorkRepository; -import com.gam.api.external.s3.service.S3ServiceImpl; +import com.gam.api.domain.s3.service.S3ServiceImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val;