diff --git a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java index 016807f..d04ab71 100644 --- a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java +++ b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java @@ -49,6 +49,7 @@ public enum BaseResponseMessage { 편지가_성공적으로_조회되었습니다("편지가 성공적으로 조회되었습니다"), 일치하는_편지가_없습니다("일치하는 편지가 없습니다"), 편지_공개_여부가_수정되었습니다("편지 공개 여부가 수정되었습니다"), + 편지가_성공적으로_삭제_되었습니다("편지가 성공적으로 삭제 되었습니다"), //news 뉴스_조회가_성공했습니다("뉴스 조회가 성공했습니다"), diff --git a/src/main/java/com/neighbors/tohero/application/letter/dto/DeleteLetterRequest.java b/src/main/java/com/neighbors/tohero/application/letter/dto/DeleteLetterRequest.java new file mode 100644 index 0000000..7f7f523 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/letter/dto/DeleteLetterRequest.java @@ -0,0 +1,13 @@ +package com.neighbors.tohero.application.letter.dto; + +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +public record DeleteLetterRequest ( + @NotNull + @Max(Long.MAX_VALUE) + @Min(0) + long letterId +){ +} diff --git a/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java b/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java index 68c983d..5360930 100644 --- a/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java +++ b/src/main/java/com/neighbors/tohero/application/letter/service/LetterService.java @@ -10,6 +10,7 @@ import com.neighbors.tohero.common.jwt.JwtUserDetails; import com.neighbors.tohero.domain.domain.address.service.GetAddress; import com.neighbors.tohero.domain.domain.letter.service.CreateLetter; +import com.neighbors.tohero.domain.domain.letter.service.DeleteLetter; import com.neighbors.tohero.domain.domain.letter.service.UpdateLetter; import com.neighbors.tohero.domain.domain.mainPage.model.Letter; import com.neighbors.tohero.domain.domain.mainPage.service.GetLetter; @@ -28,6 +29,7 @@ public class LetterService { private final GetLetter getLetter; private final GetAddress getAddress; private final UpdateLetter updateLetter; + private final DeleteLetter deleteLetter; public BaseResponse createLetter(final JwtUserDetails jwtUserDetail, final CreateLetterRequest createLetterRequest) { @@ -82,6 +84,16 @@ public BaseResponse updateLetterPublic(long userId, ); } + @Transactional + public BaseResponse deleteLetter(long userId, long letterId){ + deleteLetter.deleteLetterByUserIdAndLetterId(userId, letterId); + + return new BaseResponse<>( + BaseResponseStatus.OK, + BaseResponseMessage.편지가_성공적으로_삭제_되었습니다.getMessage() + ); + } + private BaseResponse createGuestLetter(final String nickname, final CreateLetterRequest createLetterRequest) { long createdLetterId = createLetter.createGuestLetter( diff --git a/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java b/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java index 6ed25d5..dfc5b22 100644 --- a/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java +++ b/src/main/java/com/neighbors/tohero/common/security/AuthenticationUtil.java @@ -32,6 +32,7 @@ private void initOnlyUserRequest() { addToOnlyUserRequest("GET", "/letter"); addToOnlyUserRequest("PUT", "/letter"); addToOnlyUserRequest("GET", "/auth/refreshToken"); + addToOnlyUserRequest("DELETE", "/letter"); } private void addToOnlyUserRequest(String method, String url) { diff --git a/src/main/java/com/neighbors/tohero/domain/domain/letter/service/DeleteLetter.java b/src/main/java/com/neighbors/tohero/domain/domain/letter/service/DeleteLetter.java new file mode 100644 index 0000000..f1148cf --- /dev/null +++ b/src/main/java/com/neighbors/tohero/domain/domain/letter/service/DeleteLetter.java @@ -0,0 +1,16 @@ +package com.neighbors.tohero.domain.domain.letter.service; + +import com.neighbors.tohero.common.annotaion.DomainService; +import com.neighbors.tohero.domain.query.LetterRepository; +import lombok.RequiredArgsConstructor; + +@DomainService +@RequiredArgsConstructor +public class DeleteLetter { + + private final LetterRepository letterRepository; + + public void deleteLetterByUserIdAndLetterId(long userId, long letterId) { + letterRepository.deleteLetter(repo -> repo.deleteByUserIdAndLetterId(userId, letterId)); + } +} diff --git a/src/main/java/com/neighbors/tohero/domain/query/LetterRepository.java b/src/main/java/com/neighbors/tohero/domain/query/LetterRepository.java index 6508980..2e9d2cf 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/LetterRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/LetterRepository.java @@ -16,4 +16,5 @@ public interface LetterRepository { void remainLetterWithoutUser(long userId); Letter getLetter(Function> function); void updateLetter(Consumer consumer); + void deleteLetter(Consumer consumer); } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java index b4eacfd..4bee6bb 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/query/impl/LetterRepositoryImpl.java @@ -75,4 +75,9 @@ public Letter getLetter(Function> public void updateLetter(Consumer consumer) { consumer.accept(letterEntityRepository); } + + @Override + public void deleteLetter(Consumer consumer) { + consumer.accept(letterEntityRepository); + } } diff --git a/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java b/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java index dba4d73..b77d3b5 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java @@ -34,4 +34,11 @@ void updateLetterPublic( @Param("letterId") long letterId, @Param("isPublic") boolean isPublic ); + + @Modifying + @Query("DELETE FROM LetterEntity le WHERE le.user.userId = :userId AND le.letterId = :letterId") + void deleteByUserIdAndLetterId( + @Param("userId") long userId, + @Param("letterId") long letterId + ); } diff --git a/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java b/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java index 860317f..dd24ed6 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java @@ -2,6 +2,7 @@ import com.neighbors.tohero.application.baseResponse.BaseResponse; import com.neighbors.tohero.application.letter.dto.CreateLetterRequest; +import com.neighbors.tohero.application.letter.dto.DeleteLetterRequest; import com.neighbors.tohero.application.letter.dto.GetLetterDetailRequest; import com.neighbors.tohero.application.letter.dto.UpdateLetterPublic; import com.neighbors.tohero.application.letter.service.LetterService; @@ -22,7 +23,7 @@ public class LetterController { private final LetterService letterService; - @Operation(summary = "편지 API", description = "편지를 생성하는 API입니다. content, isPublic은 필수 정보입니다. TargetJob, addressId, heroName은 사용자에게 입력받은 여부에 따라 json에 포함/미포함 할 수 있습니다. readingAlarm은 열람여부를 메시지로 받을지 여부이며, 로그인한 유저일 경우만 json에 포함시키면 됩니다. ") + @Operation(summary = "편지 API", description = "편지를 생성하는 API입니다. content, isPublic은 필수 정보입니다. TargetJob, addressId, heroName은 사용자에게 입력받은 여부에 따라 json에 포함/미포함 할 수 있습니다. readingAlarm은 열람여부를 메시지로 받을지 여부이며, 로그인한 유저일 경우만 json에 포함시키면 됩니다. TargetJob에 경찰서면 POLICE_OFFICER, 소방서면 FIRE_FIGHTER로 입력해주시면 됩니다.") @PostMapping("") public ResponseEntity createLetter( @Parameter(hidden=true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail, @@ -55,4 +56,14 @@ public ResponseEntity updateLetterPublic( return ResponseEntity.ok() .body(letterService.updateLetterPublic(jwtUserDetail.getUserId(), updateLetterPublic)); } + + @Operation(summary = "편지 API", description = "편지를 삭제하는 API입니다. 로그인한 유저만 사용할 수 있습니다.") + @DeleteMapping("") + public ResponseEntity deleteLetter( + @Parameter(hidden = true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail, + @RequestBody @Validated DeleteLetterRequest deleteLetterRequest + ){ + return ResponseEntity.ok() + .body(letterService.deleteLetter(jwtUserDetail.getUserId(), deleteLetterRequest.letterId())); + } }