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 a838556..016807f 100644 --- a/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java +++ b/src/main/java/com/neighbors/tohero/application/baseResponse/BaseResponseMessage.java @@ -48,6 +48,7 @@ public enum BaseResponseMessage { 편지_생성이_실패_했습니다("편지 생성이 실패했습니다"), 편지가_성공적으로_조회되었습니다("편지가 성공적으로 조회되었습니다"), 일치하는_편지가_없습니다("일치하는 편지가 없습니다"), + 편지_공개_여부가_수정되었습니다("편지 공개 여부가 수정되었습니다"), //news 뉴스_조회가_성공했습니다("뉴스 조회가 성공했습니다"), diff --git a/src/main/java/com/neighbors/tohero/application/letter/dto/UpdateLetterPublic.java b/src/main/java/com/neighbors/tohero/application/letter/dto/UpdateLetterPublic.java new file mode 100644 index 0000000..def14a8 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/letter/dto/UpdateLetterPublic.java @@ -0,0 +1,16 @@ +package com.neighbors.tohero.application.letter.dto; + +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; + +public record UpdateLetterPublic( + @NotNull + @Max(Long.MAX_VALUE) + @Min(0) + long letterId, + + @NotNull + boolean isPublic +) { +} diff --git a/src/main/java/com/neighbors/tohero/application/letter/dto/UpdateLetterPublicResponse.java b/src/main/java/com/neighbors/tohero/application/letter/dto/UpdateLetterPublicResponse.java new file mode 100644 index 0000000..e608c0f --- /dev/null +++ b/src/main/java/com/neighbors/tohero/application/letter/dto/UpdateLetterPublicResponse.java @@ -0,0 +1,11 @@ +package com.neighbors.tohero.application.letter.dto; + +public record UpdateLetterPublicResponse ( + boolean before, + boolean after +){ + + public static UpdateLetterPublicResponse of(boolean after) { + return new UpdateLetterPublicResponse(!after, after); + } +} 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 13d13c2..68c983d 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,8 +10,10 @@ 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.UpdateLetter; import com.neighbors.tohero.domain.domain.mainPage.model.Letter; import com.neighbors.tohero.domain.domain.mainPage.service.GetLetter; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -25,6 +27,7 @@ public class LetterService { private final CreateLetter createLetter; private final GetLetter getLetter; private final GetAddress getAddress; + private final UpdateLetter updateLetter; public BaseResponse createLetter(final JwtUserDetails jwtUserDetail, final CreateLetterRequest createLetterRequest) { @@ -68,6 +71,18 @@ public BaseResponse getMyLetters(long userId){ ); } + @Transactional + public BaseResponse updateLetterPublic(long userId, UpdateLetterPublic updateLetterPublic){ + updateLetter.updateLetterPublic(userId, updateLetterPublic.letterId(), updateLetterPublic.isPublic()); + + return new BaseResponse<>( + BaseResponseStatus.OK, + BaseResponseMessage.편지_공개_여부가_수정되었습니다.getMessage(), + UpdateLetterPublicResponse.of(updateLetterPublic.isPublic()) + ); + } + + private BaseResponse createGuestLetter(final String nickname, final CreateLetterRequest createLetterRequest) { long createdLetterId = createLetter.createGuestLetter( nickname, diff --git a/src/main/java/com/neighbors/tohero/domain/domain/letter/service/UpdateLetter.java b/src/main/java/com/neighbors/tohero/domain/domain/letter/service/UpdateLetter.java new file mode 100644 index 0000000..3e9fce1 --- /dev/null +++ b/src/main/java/com/neighbors/tohero/domain/domain/letter/service/UpdateLetter.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 UpdateLetter { + + private final LetterRepository letterRepository; + + public void updateLetterPublic(long userId, long letterId, boolean isPublic){ + letterRepository.updateLetter(repo -> repo.updateLetterPublic(userId, letterId, isPublic)); + } +} 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 af243b7..6508980 100644 --- a/src/main/java/com/neighbors/tohero/domain/query/LetterRepository.java +++ b/src/main/java/com/neighbors/tohero/domain/query/LetterRepository.java @@ -3,11 +3,10 @@ import com.neighbors.tohero.domain.domain.mainPage.model.Letter; import com.neighbors.tohero.infrastructure.entity.LetterEntity; import com.neighbors.tohero.infrastructure.repository.LetterEntityRepository; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Repository; import java.util.List; import java.util.Optional; +import java.util.function.Consumer; import java.util.function.Function; public interface LetterRepository { @@ -16,4 +15,5 @@ public interface LetterRepository { Letter createLetter(Letter letter); void remainLetterWithoutUser(long userId); Letter getLetter(Function> function); + void updateLetter(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 2b9bd94..b4eacfd 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 @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Optional; +import java.util.function.Consumer; import java.util.function.Function; @Repository @@ -69,4 +70,9 @@ public Letter getLetter(Function> return letterMapper.toDomain(letterEntity); } + + @Override + public void updateLetter(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 f13d20d..dba4d73 100644 --- a/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java +++ b/src/main/java/com/neighbors/tohero/infrastructure/repository/LetterEntityRepository.java @@ -5,6 +5,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; @@ -25,4 +26,12 @@ public interface LetterEntityRepository extends JpaRepository findByIdAndPublic(@Param("letterId") long letterId); + + @Modifying + @Query("UPDATE LetterEntity le SET le.isPublic = :isPublic WHERE le.user.userId = :userId AND le.letterId = :letterId") + void updateLetterPublic( + @Param("userId") long userId, + @Param("letterId") long letterId, + @Param("isPublic") boolean isPublic + ); } 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 9bb192e..fa4a2ea 100644 --- a/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java +++ b/src/main/java/com/neighbors/tohero/presentation/controller/LetterController.java @@ -3,6 +3,7 @@ import com.neighbors.tohero.application.baseResponse.BaseResponse; import com.neighbors.tohero.application.letter.dto.CreateLetterRequest; import com.neighbors.tohero.application.letter.dto.GetLetterDetailRequest; +import com.neighbors.tohero.application.letter.dto.UpdateLetterPublic; import com.neighbors.tohero.application.letter.service.LetterService; import com.neighbors.tohero.common.jwt.JwtUserDetails; import io.swagger.v3.oas.annotations.Parameter; @@ -40,4 +41,13 @@ public ResponseEntity getMyLetters(@Parameter(hidden = true) @Auth return ResponseEntity.ok() .body(letterService.getMyLetters(jwtUserDetail.getUserId())); } + + @PutMapping("") + public ResponseEntity updateLetterPublic( + @Parameter(hidden = true) @AuthenticationPrincipal JwtUserDetails jwtUserDetail, + @RequestBody @Validated UpdateLetterPublic updateLetterPublic + ){ + return ResponseEntity.ok() + .body(letterService.updateLetterPublic(jwtUserDetail.getUserId(), updateLetterPublic)); + } }