diff --git a/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java b/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java index 86f2f664..f6506316 100644 --- a/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java +++ b/src/main/java/leets/weeth/domain/board/application/dto/PostDTO.java @@ -20,8 +20,10 @@ public record Save( @NotNull String title, @NotNull String content, @NotNull Category category, - @NotNull String studyName, - @NotNull int week, + String studyName, + int week, + @NotNull Part part, + @NotNull Integer cardinalNumber, @Valid List<@NotNull FileSaveRequest> files ){} @@ -30,14 +32,28 @@ public record SaveEducation( @NotNull String title, @NotNull String content, @NotNull List parts, + @NotNull Integer cardinalNumber, @Valid List<@NotNull FileSaveRequest> files ){} @Builder public record Update( - @NotNull String title, - @NotNull String content, - @Valid List<@NotNull FileSaveRequest> files + String title, + String content, + String studyName, + Integer week, + Part part, + Integer cardinalNumber, + @Valid List files + ){} + + @Builder + public record UpdateEducation( + String title, + String content, + List parts, + Integer cardinalNumber, + @Valid List files ){} @Builder @@ -48,7 +64,12 @@ public record Response( Role role, String title, String content, - LocalDateTime time,//modifiedAt + String studyName, + Integer week, + Integer cardinalNumber, + Part part, + List parts, + LocalDateTime time, Integer commentCount, List comments, List fileUrls diff --git a/src/main/java/leets/weeth/domain/board/application/mapper/PostMapper.java b/src/main/java/leets/weeth/domain/board/application/mapper/PostMapper.java index 8f416902..02ac2369 100644 --- a/src/main/java/leets/weeth/domain/board/application/mapper/PostMapper.java +++ b/src/main/java/leets/weeth/domain/board/application/mapper/PostMapper.java @@ -6,7 +6,6 @@ import leets.weeth.domain.comment.application.dto.CommentDTO; import leets.weeth.domain.comment.application.mapper.CommentMapper; import leets.weeth.domain.file.application.dto.response.FileResponse; -import leets.weeth.domain.user.domain.entity.Cardinal; import leets.weeth.domain.user.domain.entity.User; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -22,11 +21,11 @@ public interface PostMapper { @Mapping(target = "createdAt", ignore = true), @Mapping(target = "modifiedAt", ignore = true), @Mapping(target = "user", source = "user"), - @Mapping(target = "part", expression = "java(user.getUserPart())"), - @Mapping(target = "parts", expression = "java(List.of(user.getUserPart()))"), - @Mapping(target = "cardinalNumber", expression = "java(latest.getCardinalNumber())") + @Mapping(target = "part", source = "dto.part"), + @Mapping(target = "parts", expression = "java(List.of(dto.part()))"), + @Mapping(target = "cardinalNumber", source = "dto.cardinalNumber") }) - Post fromPostDto(PostDTO.Save dto, User user, Cardinal latest); + Post fromPostDto(PostDTO.Save dto, User user); @Mapping(target = "id", ignore = true) @Mapping(target = "createdAt", ignore = true) @@ -34,9 +33,9 @@ public interface PostMapper { @Mapping(target = "user", source = "user") @Mapping(target = "part", ignore = true) @Mapping(target = "parts", source = "dto.parts") - @Mapping(target = "cardinalNumber", expression = "java(latest.getCardinalNumber())") + @Mapping(target = "cardinalNumber", source = "dto.cardinalNumber") @Mapping(target = "category", constant = "Education") - Post fromEducationDto(PostDTO.SaveEducation dto, User user, Cardinal latest); + Post fromEducationDto(PostDTO.SaveEducation dto, User user); @Mappings({ @Mapping(target = "name", source = "post.user.name"), diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java b/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java index bf6a2fea..89a50ff7 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/PostUseCaseImpl.java @@ -1,5 +1,9 @@ package leets.weeth.domain.board.application.usecase; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import leets.weeth.domain.board.application.dto.PartPostDTO; import leets.weeth.domain.board.application.dto.PostDTO; import leets.weeth.domain.board.application.exception.CategoryAccessDeniedException; @@ -22,7 +26,6 @@ import leets.weeth.domain.file.domain.service.FileGetService; import leets.weeth.domain.file.domain.service.FileSaveService; import leets.weeth.domain.user.application.exception.UserNotMatchException; -import leets.weeth.domain.user.domain.entity.Cardinal; import leets.weeth.domain.user.domain.entity.User; import leets.weeth.domain.user.domain.entity.enums.Role; import leets.weeth.domain.user.domain.service.CardinalGetService; @@ -70,8 +73,8 @@ public void save(PostDTO.Save request, Long userId) { throw new CategoryAccessDeniedException(); } - Cardinal latest = cardinalGetService.findLatestInProgress(); - Post post = mapper.fromPostDto(request, user, latest); + cardinalGetService.findByUserSide(request.cardinalNumber()); + Post post = mapper.fromPostDto(request, user); postSaveService.save(post); List files = fileMapper.toFileList(request.files(), post); @@ -83,11 +86,7 @@ public void save(PostDTO.Save request, Long userId) { public void saveEducation(PostDTO.SaveEducation request, Long userId) { User user = userGetService.find(userId); - Cardinal latest = cardinalGetService.findInProgress().stream() - .max(Comparator.comparing(Cardinal::getCardinalNumber)) - .orElseThrow(); - - Post post = mapper.fromEducationDto(request, user, latest); + Post post = mapper.fromEducationDto(request, user); postSaveService.save(post); @@ -174,15 +173,33 @@ public Slice searchPost(String keyword, int pageNumber, int public void update(Long postId, PostDTO.Update dto, Long userId) { Post post = validateOwner(postId, userId); - List fileList = getFiles(postId); - fileDeleteService.delete(fileList); + if (dto.files() != null) { + List fileList = getFiles(postId); + fileDeleteService.delete(fileList); - List files = fileMapper.toFileList(dto.files(), post); - fileSaveService.save(files); + List files = fileMapper.toFileList(dto.files(), post); + fileSaveService.save(files); + } postUpdateService.update(post, dto); } + @Override + @Transactional + public void updateEducation(Long postId, PostDTO.UpdateEducation dto, Long userId) { + Post post = validateOwner(postId, userId); + + if (dto.files() != null) { + List fileList = getFiles(postId); + fileDeleteService.delete(fileList); + + List files = fileMapper.toFileList(dto.files(), post); + fileSaveService.save(files); + } + + postUpdateService.updateEducation(post, dto); + } + @Override @Transactional public void delete(Long postId, Long userId) { diff --git a/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java b/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java index aec234ba..4b93811f 100644 --- a/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java +++ b/src/main/java/leets/weeth/domain/board/application/usecase/PostUsecase.java @@ -22,6 +22,8 @@ public interface PostUsecase { void update(Long postId, PostDTO.Update dto, Long userId) throws UserNotMatchException; + void updateEducation(Long postId, PostDTO.UpdateEducation dto, Long userId) throws UserNotMatchException; + void delete(Long postId, Long userId) throws UserNotMatchException; Slice searchPost(String keyword, int pageNumber, int pageSize); diff --git a/src/main/java/leets/weeth/domain/board/domain/entity/Board.java b/src/main/java/leets/weeth/domain/board/domain/entity/Board.java index d71c6b2a..5e01f3de 100644 --- a/src/main/java/leets/weeth/domain/board/domain/entity/Board.java +++ b/src/main/java/leets/weeth/domain/board/domain/entity/Board.java @@ -68,7 +68,12 @@ public void updateUpperClass(NoticeDTO.Update dto) { } public void updateUpperClass(PostDTO.Update dto) { - this.title = dto.title(); - this.content = dto.content(); + if (dto.title() != null) this.title = dto.title(); + if (dto.content() != null) this.content = dto.content(); + } + + public void updateUpperClass(PostDTO.UpdateEducation dto) { + if (dto.title() != null) this.title = dto.title(); + if (dto.content() != null) this.content = dto.content(); } } diff --git a/src/main/java/leets/weeth/domain/board/domain/entity/Post.java b/src/main/java/leets/weeth/domain/board/domain/entity/Post.java index d976235c..be1fe06d 100644 --- a/src/main/java/leets/weeth/domain/board/domain/entity/Post.java +++ b/src/main/java/leets/weeth/domain/board/domain/entity/Post.java @@ -7,6 +7,7 @@ import jakarta.persistence.EnumType; import jakarta.persistence.Enumerated; import jakarta.persistence.OneToMany; +import java.util.ArrayList; import java.util.List; import leets.weeth.domain.board.application.dto.PostDTO; import leets.weeth.domain.board.domain.converter.PartListConverter; @@ -38,7 +39,7 @@ public class Post extends Board { @Column(nullable = false, columnDefinition = "varchar(255)") @Convert(converter = PartListConverter.class) - private List parts; + private List parts = new ArrayList<>(); @Enumerated(EnumType.STRING) private Category category; @@ -57,5 +58,19 @@ public void addComment(Comment comment) { public void update(PostDTO.Update dto) { this.updateUpperClass(dto); + if (dto.studyName() != null) this.studyName = dto.studyName(); + if (dto.week() != null) this.week = dto.week(); + if (dto.part() != null) { + this.part = dto.part(); + this.parts = List.of(dto.part()); + } + if (dto.cardinalNumber() != null) this.cardinalNumber = dto.cardinalNumber(); + } + + public void updateEducation(PostDTO.UpdateEducation dto) { + this.updateUpperClass(dto); + this.part = null; + if (dto.parts() != null) this.parts = dto.parts(); + if (dto.cardinalNumber() != null) this.cardinalNumber = dto.cardinalNumber(); } } diff --git a/src/main/java/leets/weeth/domain/board/domain/service/PostUpdateService.java b/src/main/java/leets/weeth/domain/board/domain/service/PostUpdateService.java index 159d7722..05426560 100644 --- a/src/main/java/leets/weeth/domain/board/domain/service/PostUpdateService.java +++ b/src/main/java/leets/weeth/domain/board/domain/service/PostUpdateService.java @@ -1,16 +1,10 @@ package leets.weeth.domain.board.domain.service; -import jakarta.transaction.Transactional; import leets.weeth.domain.board.application.dto.PostDTO; -import leets.weeth.domain.board.application.mapper.PostMapper; import leets.weeth.domain.board.domain.entity.Post; -import leets.weeth.domain.board.domain.repository.PostRepository; -import leets.weeth.domain.user.domain.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; -import java.util.List; - @Service @RequiredArgsConstructor public class PostUpdateService { @@ -19,4 +13,7 @@ public void update(Post post, PostDTO.Update dto){ post.update(dto); } + public void updateEducation(Post post, PostDTO.UpdateEducation dto){ + post.updateEducation(dto); + } } diff --git a/src/main/java/leets/weeth/domain/board/presentation/EducationAdminController.java b/src/main/java/leets/weeth/domain/board/presentation/EducationAdminController.java index c5ccaec1..106eaa6c 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/EducationAdminController.java +++ b/src/main/java/leets/weeth/domain/board/presentation/EducationAdminController.java @@ -1,5 +1,6 @@ package leets.weeth.domain.board.presentation; +import static leets.weeth.domain.board.presentation.ResponseMessage.EDUCATION_UPDATED_SUCCESS; import static leets.weeth.domain.board.presentation.ResponseMessage.POST_CREATED_SUCCESS; import io.swagger.v3.oas.annotations.Operation; @@ -8,9 +9,12 @@ import jakarta.validation.Valid; import leets.weeth.domain.board.application.dto.PostDTO; import leets.weeth.domain.board.application.usecase.PostUsecase; +import leets.weeth.domain.user.application.exception.UserNotMatchException; import leets.weeth.global.auth.annotation.CurrentUser; import leets.weeth.global.common.response.CommonResponse; import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -30,4 +34,13 @@ public CommonResponse saveEducation(@RequestBody @Valid PostDTO.SaveEduc return CommonResponse.createSuccess(POST_CREATED_SUCCESS.getMessage()); } + + @PatchMapping(value = "/{boardId}") + @Operation(summary="교육자료 게시글 수정") + public CommonResponse update(@PathVariable Long boardId, + @RequestBody @Valid PostDTO.UpdateEducation dto, + @Parameter(hidden = true) @CurrentUser Long userId) throws UserNotMatchException { + postUsecase.updateEducation(boardId, dto, userId); + return CommonResponse.createSuccess(EDUCATION_UPDATED_SUCCESS.getMessage()); + } } diff --git a/src/main/java/leets/weeth/domain/board/presentation/PostController.java b/src/main/java/leets/weeth/domain/board/presentation/PostController.java index bee20ecb..fa5ed919 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/PostController.java +++ b/src/main/java/leets/weeth/domain/board/presentation/PostController.java @@ -82,8 +82,8 @@ public CommonResponse> findPost(@RequestParam String return CommonResponse.createSuccess(POST_FIND_BY_ID_SUCCESS.getMessage(),postUsecase.searchPost(keyword, pageNumber, pageSize)); } - @PatchMapping(value = "/{boardId}") - @Operation(summary="특정 게시글 수정") + @PatchMapping(value = "/{boardId}/part") + @Operation(summary="파트 게시글 수정") public CommonResponse update(@PathVariable Long boardId, @RequestBody @Valid PostDTO.Update dto, @Parameter(hidden = true) @CurrentUser Long userId) throws UserNotMatchException { diff --git a/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java b/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java index 74fa5946..14df900e 100644 --- a/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java +++ b/src/main/java/leets/weeth/domain/board/presentation/ResponseMessage.java @@ -14,12 +14,14 @@ public enum ResponseMessage { NOTICE_FIND_BY_ID_SUCCESS("공지사항이 성공적으로 조회되었습니다."), //PostController 관련 POST_CREATED_SUCCESS("게시글이 성공적으로 생성되었습니다."), - POST_UPDATED_SUCCESS("게시글이 성공적으로 수정되었습니다."), + POST_UPDATED_SUCCESS("파트 게시글이 성공적으로 수정되었습니다."), POST_DELETED_SUCCESS("게시글이 성공적으로 삭제되었습니다."), POST_FIND_ALL_SUCCESS("게시글 목록이 성공적으로 조회되었습니다."), POST_PART_FIND_ALL_SUCCESS("파트별 게시글 목록이 성공적으로 조회되었습니다."), POST_EDU_FIND_SUCCESS("교육 게시글 목록이 성공적으로 조회되었습니다."), - POST_FIND_BY_ID_SUCCESS("게시글이 성공적으로 조회되었습니다."); + POST_FIND_BY_ID_SUCCESS("게시글이 성공적으로 조회되었습니다."), + + EDUCATION_UPDATED_SUCCESS("교육자료가 성공적으로 수정되었습니다."); private final String message; }