diff --git a/src/main/java/com/knu/fromnow/api/domain/diary/controller/ApiDiaryController.java b/src/main/java/com/knu/fromnow/api/domain/diary/controller/ApiDiaryController.java index f57c580..31c42af 100644 --- a/src/main/java/com/knu/fromnow/api/domain/diary/controller/ApiDiaryController.java +++ b/src/main/java/com/knu/fromnow/api/domain/diary/controller/ApiDiaryController.java @@ -2,6 +2,7 @@ import com.knu.fromnow.api.domain.diary.dto.request.CreateDiaryDto; +import com.knu.fromnow.api.domain.diary.dto.request.UpdateDiaryDto; import com.knu.fromnow.api.domain.diary.dto.response.ApiDiaryResponse; import com.knu.fromnow.api.domain.diary.dto.response.BoardOverViewResponseDto; import com.knu.fromnow.api.domain.diary.dto.response.DiaryOverViewResponseDto; @@ -12,9 +13,11 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -55,12 +58,36 @@ public ResponseEntity>> getDiary public ResponseEntity>> getBoardOverviews( @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, - @PathVariable("diaryId") Long id + @PathVariable("diaryId") Long id, + @AuthenticationPrincipal PrincipalDetails principalDetails ){ - ApiDiaryResponse> boardOverviews = diaryService.getBoardOverviews(page, size, id); + ApiDiaryResponse> boardOverviews = diaryService.getBoardOverviews(page, size, id, principalDetails); return ResponseEntity.status(boardOverviews.getCode()).body(boardOverviews); } + @PutMapping("{diaryId}") + @PreAuthorize("isAuthenticated()") + public ResponseEntity updateDiaryTitle( + @RequestBody UpdateDiaryDto updateDiarydto, + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable("diaryId") Long diaryId + ){ + ApiBasicResponse response = diaryService.updateDiaryTitle(updateDiarydto, principalDetails, diaryId); + + return ResponseEntity.status(response.getCode()).body(response); + } + + @DeleteMapping("{diaryId}") + @PreAuthorize("isAuthenticated()") + public ResponseEntity deleteDiary( + @AuthenticationPrincipal PrincipalDetails principalDetails, + @PathVariable("diaryId") Long diaryId + ){ + ApiBasicResponse response = diaryService.deleteDiary(principalDetails, diaryId); + + return ResponseEntity.status(response.getCode()).body(response); + } + } diff --git a/src/main/java/com/knu/fromnow/api/domain/diary/dto/request/UpdateDiaryDto.java b/src/main/java/com/knu/fromnow/api/domain/diary/dto/request/UpdateDiaryDto.java new file mode 100644 index 0000000..d68f1fe --- /dev/null +++ b/src/main/java/com/knu/fromnow/api/domain/diary/dto/request/UpdateDiaryDto.java @@ -0,0 +1,8 @@ +package com.knu.fromnow.api.domain.diary.dto.request; + +import lombok.Getter; + +@Getter +public class UpdateDiaryDto { + private String newTitle; +} diff --git a/src/main/java/com/knu/fromnow/api/domain/diary/entity/Diary.java b/src/main/java/com/knu/fromnow/api/domain/diary/entity/Diary.java index c6fbb73..6cf00f4 100644 --- a/src/main/java/com/knu/fromnow/api/domain/diary/entity/Diary.java +++ b/src/main/java/com/knu/fromnow/api/domain/diary/entity/Diary.java @@ -1,7 +1,9 @@ package com.knu.fromnow.api.domain.diary.entity; import com.knu.fromnow.api.domain.board.entity.Board; +import com.knu.fromnow.api.domain.diary.dto.request.UpdateDiaryDto; import com.knu.fromnow.api.domain.member.entity.Member; +import jakarta.persistence.CascadeType; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.EnumType; @@ -38,10 +40,10 @@ public class Diary { @Enumerated(EnumType.STRING) private DiaryType diaryType; - @OneToMany(mappedBy = "diary") + @OneToMany(mappedBy = "diary", cascade = CascadeType.REMOVE) private List diaryMembers = new ArrayList<>(); - @OneToMany(mappedBy = "diary") + @OneToMany(mappedBy = "diary", cascade = CascadeType.REMOVE) private List boardList = new ArrayList<>(); private LocalDateTime createdTime; @@ -57,4 +59,8 @@ public Diary(DiaryType diaryType, String title, LocalDateTime createdTime, Membe this.owner = owner; this.createdTime = LocalDateTime.now(); } + + public void updateDiaryTitle(UpdateDiaryDto updateDiaryDto){ + this.title = updateDiaryDto.getNewTitle(); + } } diff --git a/src/main/java/com/knu/fromnow/api/domain/diary/service/DiaryService.java b/src/main/java/com/knu/fromnow/api/domain/diary/service/DiaryService.java index ba1b061..ff51e5a 100644 --- a/src/main/java/com/knu/fromnow/api/domain/diary/service/DiaryService.java +++ b/src/main/java/com/knu/fromnow/api/domain/diary/service/DiaryService.java @@ -3,6 +3,7 @@ import com.knu.fromnow.api.domain.board.entity.Board; import com.knu.fromnow.api.domain.board.repository.BoardRepository; import com.knu.fromnow.api.domain.diary.dto.request.CreateDiaryDto; +import com.knu.fromnow.api.domain.diary.dto.request.UpdateDiaryDto; import com.knu.fromnow.api.domain.diary.dto.response.ApiDiaryResponse; import com.knu.fromnow.api.domain.diary.dto.response.BoardOverViewResponseDto; import com.knu.fromnow.api.domain.diary.dto.response.DiaryOverViewResponseDto; @@ -14,7 +15,9 @@ import com.knu.fromnow.api.domain.member.entity.PrincipalDetails; import com.knu.fromnow.api.domain.member.repository.MemberRepository; import com.knu.fromnow.api.domain.photo.entity.Photo; +import com.knu.fromnow.api.global.error.custom.DiaryException; import com.knu.fromnow.api.global.error.custom.MemberException; +import com.knu.fromnow.api.global.error.errorcode.DiaryErrorCode; import com.knu.fromnow.api.global.error.errorcode.MemberErrorCode; import com.knu.fromnow.api.global.spec.ApiBasicResponse; import lombok.RequiredArgsConstructor; @@ -95,11 +98,80 @@ public ApiDiaryResponse> getDiaryOverView(Princip .build(); } - public ApiDiaryResponse> getBoardOverviews(int page, int size, Long diaryId){ + public ApiDiaryResponse> getBoardOverviews(int page, int size, Long diaryId, PrincipalDetails principalDetails){ + Member member = memberRepository.findByEmail(principalDetails.getEmail()) + .orElseThrow(() -> new MemberException(MemberErrorCode.No_EXIST_EMAIL_MEMBER_EXCEPTION)); + + List diaryMembers = member.getDiaryMembers(); + boolean hasMatchingMember = diaryMembers.stream() + .anyMatch(diaryMember -> diaryMember.getMember().equals(member)); + + if(!hasMatchingMember){ + throw new MemberException(MemberErrorCode.NO_MATCHING_MEMBER_EXCEPTION); + } + PageRequest pageRequest = PageRequest.of(page, size, Sort.by("createdTime").descending()); Page boards = boardRepository.findByDiaryId(diaryId, pageRequest); - List contents = boards.getContent(); + + List boardOverViewResponseDtos = getBoardOverViewResponseDtos(contents); + + return ApiDiaryResponse.>builder() + .status(true) + .code(200) + .message("글 불러오기 성공!") + .data(boardOverViewResponseDtos) + .build(); + } + + public ApiBasicResponse updateDiaryTitle(UpdateDiaryDto updateDiaryDto, PrincipalDetails principalDetails, Long diaryId){ + Member member = memberRepository.findByEmail(principalDetails.getEmail()) + .orElseThrow(() -> new MemberException(MemberErrorCode.No_EXIST_EMAIL_MEMBER_EXCEPTION)); + + Diary diary = diaryRepository.findById(diaryId) + .orElseThrow(() -> new DiaryException(DiaryErrorCode.NO_EXIST_DIARY_EXCEPTION)); + + if(!diary.getOwner().equals(member)){ + throw new MemberException(MemberErrorCode.NO_OWNER_EXCEPTION); + } + + diary.updateDiaryTitle(updateDiaryDto); + + diaryRepository.save(diary); + + return ApiBasicResponse.builder() + .status(true) + .code(200) + .message("다이어리 이름 업데이트 성공! newTitle : " + updateDiaryDto.getNewTitle()) + .build(); + } + + public ApiBasicResponse deleteDiary(PrincipalDetails principalDetails, Long diaryId) { + Member member = memberRepository.findByEmail(principalDetails.getEmail()) + .orElseThrow(() -> new MemberException(MemberErrorCode.No_EXIST_EMAIL_MEMBER_EXCEPTION)); + + Diary diary = diaryRepository.findById(diaryId) + .orElseThrow(() -> new DiaryException(DiaryErrorCode.NO_EXIST_DIARY_EXCEPTION)); + + if(!diary.getOwner().equals(member)){ + throw new MemberException(MemberErrorCode.NO_OWNER_EXCEPTION); + } + + diaryRepository.delete(diary); + + return ApiBasicResponse.builder() + .status(true) + .code(200) + .message("다이어리 삭제 성공") + .build(); + } + + /** + * Pagination한 Board로 responseDto를 만드는 메서드 + * @param contents + * @return + */ + private static List getBoardOverViewResponseDtos(List contents) { List boardOverViewResponseDtos = new ArrayList<>(); for (Board board : contents) { @@ -120,12 +192,8 @@ public ApiDiaryResponse> getBoardOverviews(int pa boardOverViewResponseDtos.add(boardOverViewResponseDto); } - - return ApiDiaryResponse.>builder() - .status(true) - .code(200) - .message("글 불러오기 성공!") - .data(boardOverViewResponseDtos) - .build(); + return boardOverViewResponseDtos; } + + } diff --git a/src/main/java/com/knu/fromnow/api/global/error/errorcode/MemberErrorCode.java b/src/main/java/com/knu/fromnow/api/global/error/errorcode/MemberErrorCode.java index 83a0eb0..5f34685 100644 --- a/src/main/java/com/knu/fromnow/api/global/error/errorcode/MemberErrorCode.java +++ b/src/main/java/com/knu/fromnow/api/global/error/errorcode/MemberErrorCode.java @@ -8,7 +8,9 @@ public enum MemberErrorCode { No_EXIST_EMAIL_MEMBER_EXCEPTION(404, "email에 해당하는 member가 없습니다"), NO_EXIST_IDENTIFIER_MEMBER_EXCEPTION(404, "identifier에 해당하는 member가 없습니다"), - CONFLICT_PROFILE_NAME_MEMBER_EXCEPTION(409, "이미 존재하는 profileName 입니다"); + CONFLICT_PROFILE_NAME_MEMBER_EXCEPTION(409, "이미 존재하는 profileName 입니다"), + NO_MATCHING_MEMBER_EXCEPTION(404, "해당 다이어리에 소속된 멤버가 아닙니다. 다이어리를 조회 할 권한이 없습니다"), + NO_OWNER_EXCEPTION(404, "해당 다이어리의 Owner가 아닙니다."); MemberErrorCode(int code, String message) { this.code = code;