Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIX] 매거진 수정 api 변경, @Valid 적용, domain/s3로 폴더링 변경 #151

Merged
merged 7 commits into from
Mar 10, 2024
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
2 changes: 1 addition & 1 deletion src/main/java/com/gam/api/common/ErrorHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public ResponseEntity<ApiResponse> handleIllegalArgumentException(IllegalArgumen

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ApiResponse> handleMethodArgumentNotValidException(MethodArgumentNotValidException exception){
ApiResponse response = ApiResponse.fail(EMPTY_METHOD_ARGUMENT.getMessage());
ApiResponse response = ApiResponse.fail(exception.getBindingResult().getAllErrors().get(0).getDefaultMessage());
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

getAllErrors의 0번째말고 다른 인덱스의 값들은 어떤게 들어있나요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

아래와 같습니당!
{ "success": false, "message": "[Field error in object 'userOnboardRequestDTO' on field 'userName': rejected value []; codes [Size.userOnboardRequestDTO.userName,Size.userName,Size.java.lang.String,Size]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [userOnboardRequestDTO.userName,userName]; arguments []; default message [userName],15,1]; default message [userName의 길이는 1글자 이상 15글자 이하여야 합니다.]]", "data": "" }

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이게 0번째 인덱스의 값인가요?

return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -50,7 +51,7 @@ public ResponseEntity<ApiResponse> getMagazineDetail(@RequestParam Long magazine

@ApiOperation(value = "매거진 - 수정")
@PatchMapping("/magazine/{magazineId}")
public ResponseEntity<ApiResponse> editMagazine(@PathVariable Long magazineId, @RequestBody MagazineRequestDTO request) {
public ResponseEntity<ApiResponse> editMagazine(@PathVariable Long magazineId, @Valid @RequestBody MagazineRequestDTO request) {
adminService.editMagazine(magazineId, request);
return ResponseEntity.ok(ApiResponse.success(ResponseMessage.SUCCESS_EDIT_MAGAZINE.getMessage()));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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<QuestionVO> questions
) {
@Builder
Expand Down
125 changes: 50 additions & 75 deletions src/main/java/com/gam/api/domain/admin/service/AdminServiceImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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<MagazineListResponseDTO> getMagazines() {
Expand All @@ -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());
}

Expand All @@ -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<Question> 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<QuestionVO> 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<QuestionVO> 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<createCount; i++) {
val createQuestion = questionRepository.save(requestQuestions.get(currentQuestionSize+i));
createQuestion.setMagazine(magazine);
}
}
questionRepository.saveAll(currentQuestions);
}
private List<Question> checkEntityDiff(List<Question> currentQuestions, List<Question> requestQuestions) {
val changeSize = currentQuestions.size();
for (int i = 0; i<changeSize; i++) {
if (!currentQuestions.get(i).equals(requestQuestions.get(i))) {
editChangeQuestion(currentQuestions.get(i), requestQuestions.get(i));
}
}
return currentQuestions;
question.setMagazine(magazine);
});
}

private Question editChangeQuestion(Question currentEntity, Question requestEntity) {
if (currentEntity.getQuestionOrder() != requestEntity.getQuestionOrder()) {
currentEntity.setQuestionOrder(requestEntity.getQuestionOrder());
}
if (currentEntity.getQuestion() != requestEntity.getQuestion()) {
currentEntity.setQuestion(requestEntity.getQuestion());
}
if (currentEntity.getAnswer() != requestEntity.getAnswer()) {
currentEntity.setAnswer(requestEntity.getAnswer());
}
if (currentEntity.getAnswerImage() != requestEntity.getAnswerImage()) {
currentEntity.setAnswerImage(requestEntity.getAnswerImage());
}
if (currentEntity.getImageCaption() != requestEntity.getImageCaption()) {
currentEntity.setImageCaption(requestEntity.getImageCaption());
}
return currentEntity;
}

@Override
public void deleteUserAccount(Long userId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,6 @@ public class Magazine extends TimeStamped {

public void scrapCountDown(){ this.scrapCount -= 1; }

public void setQuestions(List<Question> questions) { this.questions = questions; }

@Builder
public Magazine(String thumbNail, String magazineTitle, String introduction, String interviewPerson) {
this.thumbNail = thumbNail;
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/com/gam/api/domain/magazine/entity/Question.java
Original file line number Diff line number Diff line change
Expand Up @@ -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 + '\'' +
'}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

public record ReportCreateRequestDTO (
Long targetUserId,
@NotBlank
@NotNull
@NotBlank(message = "신고내용은 빈스트링일 수 없습니다.")
@NotNull(message = "신고내용은 null일 수 없습니다.")
String content,
Long workId
){
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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) {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gam.api.external.s3.dto.request;
package com.gam.api.domain.s3.dto.request;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gam.api.external.s3.dto.response;
package com.gam.api.domain.s3.dto.response;

import lombok.Builder;

Expand Down
Original file line number Diff line number Diff line change
@@ -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 {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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는 \"\"일 수 없습니다.")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오 ""은 뭘까요?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"" 빈 스트링 들어올 경우에 message를 나타냅니다!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"" 인 이유가 궁금했습니다!

@NotEmpty(message = "info는 null일 수 없습니다.")
String info,
@NotEmpty(message = "tags는 null일 수 없습니다, 하나 이상의 tag를 선택 해 주세요.")
int[] tags
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

public record WorkEditRequestDTO(
Long workId,
@NotBlank
@NotBlank(message = "작업물 이미지를 추가해주세요")
String image,
@NotBlank
@NotBlank(message = "작업물 제목은 빈스트링 일 수 없습니다.")
String title,
String detail
) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Loading