Skip to content

Commit

Permalink
Feat : Diary CRUD 구현 (#9)
Browse files Browse the repository at this point in the history
  • Loading branch information
MinsFuture authored Jul 30, 2024
1 parent a925d20 commit edaddd7
Show file tree
Hide file tree
Showing 5 changed files with 125 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -55,12 +58,36 @@ public ResponseEntity<ApiDiaryResponse<List<DiaryOverViewResponseDto>>> getDiary
public ResponseEntity<ApiDiaryResponse<List<BoardOverViewResponseDto>>> getBoardOverviews(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size,
@PathVariable("diaryId") Long id
@PathVariable("diaryId") Long id,
@AuthenticationPrincipal PrincipalDetails principalDetails
){

ApiDiaryResponse<List<BoardOverViewResponseDto>> boardOverviews = diaryService.getBoardOverviews(page, size, id);
ApiDiaryResponse<List<BoardOverViewResponseDto>> boardOverviews = diaryService.getBoardOverviews(page, size, id, principalDetails);

return ResponseEntity.status(boardOverviews.getCode()).body(boardOverviews);
}

@PutMapping("{diaryId}")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<ApiBasicResponse> 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<ApiBasicResponse> deleteDiary(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@PathVariable("diaryId") Long diaryId
){
ApiBasicResponse response = diaryService.deleteDiary(principalDetails, diaryId);

return ResponseEntity.status(response.getCode()).body(response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.knu.fromnow.api.domain.diary.dto.request;

import lombok.Getter;

@Getter
public class UpdateDiaryDto {
private String newTitle;
}
10 changes: 8 additions & 2 deletions src/main/java/com/knu/fromnow/api/domain/diary/entity/Diary.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -38,10 +40,10 @@ public class Diary {
@Enumerated(EnumType.STRING)
private DiaryType diaryType;

@OneToMany(mappedBy = "diary")
@OneToMany(mappedBy = "diary", cascade = CascadeType.REMOVE)
private List<DiaryMember> diaryMembers = new ArrayList<>();

@OneToMany(mappedBy = "diary")
@OneToMany(mappedBy = "diary", cascade = CascadeType.REMOVE)
private List<Board> boardList = new ArrayList<>();

private LocalDateTime createdTime;
Expand All @@ -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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -95,11 +98,80 @@ public ApiDiaryResponse<List<DiaryOverViewResponseDto>> getDiaryOverView(Princip
.build();
}

public ApiDiaryResponse<List<BoardOverViewResponseDto>> getBoardOverviews(int page, int size, Long diaryId){
public ApiDiaryResponse<List<BoardOverViewResponseDto>> 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<DiaryMember> 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<Board> boards = boardRepository.findByDiaryId(diaryId, pageRequest);

List<Board> contents = boards.getContent();

List<BoardOverViewResponseDto> boardOverViewResponseDtos = getBoardOverViewResponseDtos(contents);

return ApiDiaryResponse.<List<BoardOverViewResponseDto>>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<BoardOverViewResponseDto> getBoardOverViewResponseDtos(List<Board> contents) {
List<BoardOverViewResponseDto> boardOverViewResponseDtos = new ArrayList<>();

for (Board board : contents) {
Expand All @@ -120,12 +192,8 @@ public ApiDiaryResponse<List<BoardOverViewResponseDto>> getBoardOverviews(int pa

boardOverViewResponseDtos.add(boardOverViewResponseDto);
}

return ApiDiaryResponse.<List<BoardOverViewResponseDto>>builder()
.status(true)
.code(200)
.message("글 불러오기 성공!")
.data(boardOverViewResponseDtos)
.build();
return boardOverViewResponseDtos;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit edaddd7

Please sign in to comment.