From d0704197160c722f6102464a34c056e8fd22700b Mon Sep 17 00:00:00 2001 From: Jeongyeon Park Date: Fri, 2 Aug 2024 16:10:47 +0900 Subject: [PATCH] =?UTF-8?q?#1=20Refactor=20:=20Note=20Controller=EC=97=90?= =?UTF-8?q?=20AuthenticationPrinciple=20=EC=B6=94=EA=B0=80=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../apipayLoad/code/status/ErrorStatus.java | 1 + .../controller/TastingNoteController.java | 40 ++++++++++++++----- .../converter/TastingNoteConverter.java | 4 +- .../service/memberService/MemberService.java | 2 + .../memberService/MemberServiceImpl.java | 5 +++ .../TastingNoteService.java | 6 +-- .../TastingNoteServiceImpl.java | 18 +++++++-- 7 files changed, 58 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/drinkeg/drinkeg/apipayLoad/code/status/ErrorStatus.java b/src/main/java/com/drinkeg/drinkeg/apipayLoad/code/status/ErrorStatus.java index 0e69b55d..c7cf4b6c 100644 --- a/src/main/java/com/drinkeg/drinkeg/apipayLoad/code/status/ErrorStatus.java +++ b/src/main/java/com/drinkeg/drinkeg/apipayLoad/code/status/ErrorStatus.java @@ -21,6 +21,7 @@ public enum ErrorStatus implements BaseCode { // Note Error TASTING_NOTE_NOT_FOUND(HttpStatus.BAD_REQUEST, "NOTE4001", "테이스팅 노트가 없습니다."), + NOT_YOUR_NOTE(HttpStatus.BAD_REQUEST, "NOTE4002", "본인의 노트가 아닙니다."), // WineNote Error WINE_NOTE_NOT_FOUND(HttpStatus.BAD_REQUEST, "WINE_NOTE4001", "와인 노트가 없습니다."), diff --git a/src/main/java/com/drinkeg/drinkeg/controller/TastingNoteController.java b/src/main/java/com/drinkeg/drinkeg/controller/TastingNoteController.java index 526cce78..f1ad132b 100644 --- a/src/main/java/com/drinkeg/drinkeg/controller/TastingNoteController.java +++ b/src/main/java/com/drinkeg/drinkeg/controller/TastingNoteController.java @@ -2,6 +2,7 @@ import com.drinkeg.drinkeg.apipayLoad.ApiResponse; import com.drinkeg.drinkeg.domain.Member; +import com.drinkeg.drinkeg.dto.PrincipalDetail; import com.drinkeg.drinkeg.dto.TastingNoteDTO.request.NoteRequestDTO; import com.drinkeg.drinkeg.dto.TastingNoteDTO.request.NoteUpdateRequestDTO; import com.drinkeg.drinkeg.dto.TastingNoteDTO.response.NotePriviewResponseDTO; @@ -13,6 +14,7 @@ import com.drinkeg.drinkeg.service.wineService.WineService; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -28,9 +30,13 @@ public class TastingNoteController { // 새 노트 작성 @PostMapping("/new-note") - public ApiResponse saveNote(@RequestBody @Valid NoteRequestDTO noteRequestDTO) { + public ApiResponse saveNote(@AuthenticationPrincipal PrincipalDetail principalDetail, @RequestBody @Valid NoteRequestDTO noteRequestDTO) { - tastingNoteService.saveNote(noteRequestDTO); + // 현재 로그인한 사용자 정보 가져오기 + String username = principalDetail.getUsername(); + Member foundMember = memberService.findMemberByUsername(username); + + tastingNoteService.saveNote(noteRequestDTO, foundMember); return ApiResponse.onSuccess("노트 작성 완료"); } @@ -44,33 +50,47 @@ public ApiResponse> saveNote(@RequestBody NoteWineRequ // 선택한 노트 보기 @GetMapping("/{noteId}") - public ApiResponse showNote(@PathVariable("noteId") Long noteId) { + public ApiResponse showNote(@AuthenticationPrincipal PrincipalDetail principalDetail, @PathVariable("noteId") Long noteId) { + + // 현재 로그인한 사용자 정보 가져오기 + String username = principalDetail.getUsername(); + Member foundMember = memberService.findMemberByUsername(username); NoteResponseDTO noteResponseDTO = tastingNoteService.showNoteById(noteId); return ApiResponse.onSuccess(noteResponseDTO); } // 전체 노트 보기 - @GetMapping("/all-note/{memberId}") - public ApiResponse> showAllNote(@PathVariable("memberId") Long memberId) { + @GetMapping("/all-note") + public ApiResponse> showAllNote(@AuthenticationPrincipal PrincipalDetail principalDetail) { - Member foundMember = memberService.findMemberById(memberId); + // 현재 로그인한 사용자 정보 가져오기 + String username = principalDetail.getUsername(); + Member foundMember = memberService.findMemberByUsername(username); List allNoteByMember = tastingNoteService.findAllNoteByMember(foundMember); return ApiResponse.onSuccess(allNoteByMember); } @PatchMapping("/{noteId}") - public ApiResponse updateTastingNote(@PathVariable("noteId") Long noteId, @RequestBody @Valid NoteUpdateRequestDTO noteUpdateRequestDTO) { + public ApiResponse updateTastingNote(@AuthenticationPrincipal PrincipalDetail principalDetail, @PathVariable("noteId") Long noteId, @RequestBody @Valid NoteUpdateRequestDTO noteUpdateRequestDTO) { - tastingNoteService.updateTastingNote(noteId, noteUpdateRequestDTO); + // 현재 로그인한 사용자 정보 가져오기 + String username = principalDetail.getUsername(); + Member foundMember = memberService.findMemberByUsername(username); + + tastingNoteService.updateTastingNote(noteId, noteUpdateRequestDTO, foundMember); return ApiResponse.onSuccess("노트 수정 완료"); } @DeleteMapping("/{noteId}") - public ApiResponse deleteTastingNote(@PathVariable("noteId") Long noteId) { + public ApiResponse deleteTastingNote(@AuthenticationPrincipal PrincipalDetail principalDetail, @PathVariable("noteId") Long noteId) { + + // 현재 로그인한 사용자 정보 가져오기 + String username = principalDetail.getUsername(); + Member foundMember = memberService.findMemberByUsername(username); - tastingNoteService.deleteTastingNote(noteId); + tastingNoteService.deleteTastingNote(noteId, foundMember); return ApiResponse.onSuccess("노트 삭제 완료"); } diff --git a/src/main/java/com/drinkeg/drinkeg/converter/TastingNoteConverter.java b/src/main/java/com/drinkeg/drinkeg/converter/TastingNoteConverter.java index ac4550fd..b7fb3325 100644 --- a/src/main/java/com/drinkeg/drinkeg/converter/TastingNoteConverter.java +++ b/src/main/java/com/drinkeg/drinkeg/converter/TastingNoteConverter.java @@ -1,5 +1,6 @@ package com.drinkeg.drinkeg.converter; +import com.drinkeg.drinkeg.domain.Member; import com.drinkeg.drinkeg.domain.TastingNote; import com.drinkeg.drinkeg.domain.Wine; import com.drinkeg.drinkeg.dto.TastingNoteDTO.request.NoteRequestDTO; @@ -10,7 +11,8 @@ public class TastingNoteConverter { // NoteRequestDTO를 TastingNote Entity로 변환 - public static TastingNote toTastingNoteEntity(NoteRequestDTO noteRequestDTO, @NotNull Wine wine) { + // NotNull은 null이 아님을 보장하는 어노테이션 + public static TastingNote toTastingNoteEntity(NoteRequestDTO noteRequestDTO, @NotNull Member member, @NotNull Wine wine) { return TastingNote.builder() .wine(wine) .color(noteRequestDTO.getColor()) diff --git a/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberService.java b/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberService.java index be8401a0..11d3e9ff 100644 --- a/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberService.java +++ b/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberService.java @@ -5,4 +5,6 @@ public interface MemberService { public Member findMemberById(Long memberId); + + public Member findMemberByUsername(String username); } diff --git a/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberServiceImpl.java b/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberServiceImpl.java index b38c66ff..48ab3c3b 100644 --- a/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberServiceImpl.java +++ b/src/main/java/com/drinkeg/drinkeg/service/memberService/MemberServiceImpl.java @@ -21,4 +21,9 @@ public Member findMemberById(Long memberId) { }); } + @Override + public Member findMemberByUsername(String username) { + return memberRepository.findByUsername(username); + } + } diff --git a/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteService.java b/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteService.java index 1cbd5cc1..e2e95705 100644 --- a/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteService.java +++ b/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteService.java @@ -11,14 +11,14 @@ public interface TastingNoteService { - public void saveNote(NoteRequestDTO noteRequestDTO); + public void saveNote(NoteRequestDTO noteRequestDTO, Member member); public NoteResponseDTO showNoteById(Long noteId); public List findAllNoteByMember(Member member); - public void updateTastingNote(Long noteId, NoteUpdateRequestDTO noteUpdateRequestDTO); + public void updateTastingNote(Long noteId, NoteUpdateRequestDTO noteUpdateRequestDTO, Member member); - public void deleteTastingNote(Long noteId); + public void deleteTastingNote(Long noteId, Member member); } diff --git a/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteServiceImpl.java b/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteServiceImpl.java index 94034910..3d949aa4 100644 --- a/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteServiceImpl.java +++ b/src/main/java/com/drinkeg/drinkeg/service/tastingNoteService/TastingNoteServiceImpl.java @@ -29,7 +29,7 @@ public class TastingNoteServiceImpl implements TastingNoteService { private final MemberRepository memberRepository; @Override - public void saveNote(NoteRequestDTO noteRequestDTO) { + public void saveNote(NoteRequestDTO noteRequestDTO, Member member) { // 와인을 찾는다. Long wineId = noteRequestDTO.getWineId(); @@ -39,7 +39,7 @@ public void saveNote(NoteRequestDTO noteRequestDTO) { ); // TastingNote를 저장한다. - TastingNote tastingNoteEntity = TastingNoteConverter.toTastingNoteEntity(noteRequestDTO, wine); + TastingNote tastingNoteEntity = TastingNoteConverter.toTastingNoteEntity(noteRequestDTO, member, wine); TastingNote savedNote = tastingNoteRepository.save(tastingNoteEntity); } @@ -73,7 +73,7 @@ public List findAllNoteByMember(Member member) { } @Override - public void updateTastingNote(Long noteId, NoteUpdateRequestDTO noteUpdateRequestDTO) { + public void updateTastingNote(Long noteId, NoteUpdateRequestDTO noteUpdateRequestDTO, Member member) { // noteId로 TastingNote를 찾는다. TastingNote foundNote = tastingNoteRepository.findById(noteId).orElseThrow(() -> { @@ -81,6 +81,11 @@ public void updateTastingNote(Long noteId, NoteUpdateRequestDTO noteUpdateReques } ); + // TastingNote의 Member가 요청한 Member와 같은지 확인한다. + if(!foundNote.getMember().equals(member)) { + throw new GeneralException(ErrorStatus.NOT_YOUR_NOTE); + } + // TastingNote를 업데이트한다. if(noteUpdateRequestDTO.getWineId() != null) { Wine wine = wineRepository.findById(noteUpdateRequestDTO.getWineId()).orElseThrow(() -> { @@ -130,7 +135,7 @@ public void updateTastingNote(Long noteId, NoteUpdateRequestDTO noteUpdateReques } @Override - public void deleteTastingNote(Long noteId) { + public void deleteTastingNote(Long noteId, Member member) { // noteId로 TastingNote를 찾는다. TastingNote foundNote = tastingNoteRepository.findById(noteId).orElseThrow(() -> { @@ -138,6 +143,11 @@ public void deleteTastingNote(Long noteId) { } ); + // TastingNote의 Member가 요청한 Member와 같은지 확인한다. + if(!foundNote.getMember().equals(member)) { + throw new GeneralException(ErrorStatus.NOT_YOUR_NOTE); + } + // TastingNote를 삭제한다. tastingNoteRepository.delete(foundNote); }