diff --git a/src/main/java/org/hankki/hankkiserver/api/favorite/controller/FavoriteController.java b/src/main/java/org/hankki/hankkiserver/api/favorite/controller/FavoriteController.java index 8154057b..e80f5945 100644 --- a/src/main/java/org/hankki/hankkiserver/api/favorite/controller/FavoriteController.java +++ b/src/main/java/org/hankki/hankkiserver/api/favorite/controller/FavoriteController.java @@ -5,6 +5,7 @@ import org.hankki.hankkiserver.api.dto.HankkiResponse; import org.hankki.hankkiserver.api.favorite.controller.request.FavoriteDeleteRequest; import org.hankki.hankkiserver.api.favorite.controller.request.FavoritePostRequest; +import org.hankki.hankkiserver.api.favorite.controller.request.FavoriteSharedPostRequest; import org.hankki.hankkiserver.api.favorite.service.FavoriteCommandService; import org.hankki.hankkiserver.api.favorite.service.FavoriteQueryService; import org.hankki.hankkiserver.api.favorite.service.command.*; @@ -65,4 +66,10 @@ public HankkiResponse getFavorite(@UserId final Long userId public HankkiResponse getFavoritesWithStatus(@UserId Long id, @RequestParam("candidate") final Long storeId) { return HankkiResponse.success(CommonSuccessCode.OK, favoriteQueryService.findFavoritesWithStatus(FavoritesWithStatusGetCommand.of(id, storeId))); } -} \ No newline at end of file + + @PostMapping("/favorites/{favoriteId}/shared") + public HankkiResponse createSharedFavorite(@UserId final Long userId, @PathVariable(name = "favoriteId") long favoriteId, @RequestBody @Valid final FavoriteSharedPostRequest request) { + favoriteCommandService.createSharedFavorite(FavoriteSharedPostCommand.of(userId, favoriteId, request.title(), request.details())); + return HankkiResponse.success(CommonSuccessCode.CREATED); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/favorite/controller/request/FavoriteSharedPostRequest.java b/src/main/java/org/hankki/hankkiserver/api/favorite/controller/request/FavoriteSharedPostRequest.java new file mode 100644 index 00000000..77576fd3 --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/favorite/controller/request/FavoriteSharedPostRequest.java @@ -0,0 +1,13 @@ +package org.hankki.hankkiserver.api.favorite.controller.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import java.util.List; + +public record FavoriteSharedPostRequest ( + @NotBlank(message = "제목이 비었습니다.") + @Size(max = 18, message = "제목 길이가 18자를 초과했습니다.") + String title, + @Size(min = 1, max = 2, message = "해시태그 리스트 size가 1 이상 2 이하가 아닙니다.") + List<@Size(min = 2, max= 9, message = "해시태그가 # 포함 9자를 초과했습니다.") String> details +) { } diff --git a/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteCommandService.java b/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteCommandService.java index 57c8e51f..e271c3a9 100644 --- a/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteCommandService.java +++ b/src/main/java/org/hankki/hankkiserver/api/favorite/service/FavoriteCommandService.java @@ -3,6 +3,7 @@ import java.util.List; import lombok.RequiredArgsConstructor; import org.hankki.hankkiserver.api.auth.service.UserFinder; +import org.hankki.hankkiserver.api.favorite.service.command.FavoriteSharedPostCommand; import org.hankki.hankkiserver.api.favorite.service.command.FavoriteStoreDeleteCommand; import org.hankki.hankkiserver.api.favorite.service.command.FavoriteStorePostCommand; import org.hankki.hankkiserver.api.favorite.service.command.FavoritesDeleteCommand; @@ -37,17 +38,12 @@ public class FavoriteCommandService { private final FavoriteDeleter favoriteDeleter; @Transactional - public Long createFavorite(final FavoritePostCommand command) { - - User findUser = userFinder.getUser(command.userId()); - String title = command.title(); - checkTitleExists(title, findUser); - return favoriteUpdater.save(Favorite.create(findUser, title, String.join(" ", command.details()))); + public void createFavorite(final FavoritePostCommand command) { + favoriteUpdater.save(makeFavoriteByTitleAndDetails(command.userId(), command.title(), command.details())); } @Transactional public void deleteFavorites(final FavoritesDeleteCommand command) { - List favorites = favoriteFinder.findAllByIds(command.favoriteIds()); favorites.forEach(favorite -> { @@ -60,7 +56,6 @@ public void deleteFavorites(final FavoritesDeleteCommand command) { @Transactional public Long createFavoriteStore(final FavoriteStorePostCommand command) { - Favorite favorite = favoriteFinder.findByIdWithUser(command.favoriteId()); Store store = storeFinder.findByIdWhereDeletedIsFalse(command.storeId()); @@ -76,13 +71,18 @@ public Long createFavoriteStore(final FavoriteStorePostCommand command) { @Transactional public void deleteFavoriteStore(final FavoriteStoreDeleteCommand command) { - Favorite favorite = favoriteFinder.findByIdWithUser(command.favoriteId()); favoriteStoreDeleter.delete(favoriteStoreFinder.findByFavoriteIdAndStoreId(favorite.getId(), command.storeId())); - favorite.updateImageByFavoriteStoreCount(favoriteStoreFinder.countByFavorite(favorite)); } + @Transactional + public void createSharedFavorite(final FavoriteSharedPostCommand command) { + Favorite favorite = makeFavoriteByTitleAndDetails(command.userId(), command.title(), command.details()); + favoriteUpdater.save(favorite); + copySharedFavoriteStore(command.sharedFavoriteId(), favorite); + } + private void validateUserAuthorization(final User findUser, final User commandUser) { if (!findUser.equals(commandUser)) { throw new UnauthorizedException(UserErrorCode.USER_FORBIDDEN); @@ -98,4 +98,18 @@ private void checkTitleExists(final String title, final User user){ throw new ConflictException(FavoriteErrorCode.FAVORITE_TITLE_EXISTS); }); } -} \ No newline at end of file + + private void copySharedFavoriteStore(final long sharedId, final Favorite myFavorite) { + findStoresById(sharedId).forEach(it -> favoriteStoreUpdater.save(FavoriteStore.create(it, myFavorite))); + } + + private List findStoresById(final long id) { + return favoriteStoreFinder.findByFavoriteId(id).stream().map(FavoriteStore::getStore).toList(); + } + + private Favorite makeFavoriteByTitleAndDetails(final long userId, final String title, List details) { + User findUser = userFinder.getUser(userId); + checkTitleExists(title, findUser); + return Favorite.create(findUser, title, String.join(" ", details)); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/favorite/service/command/FavoriteSharedPostCommand.java b/src/main/java/org/hankki/hankkiserver/api/favorite/service/command/FavoriteSharedPostCommand.java new file mode 100644 index 00000000..8236788d --- /dev/null +++ b/src/main/java/org/hankki/hankkiserver/api/favorite/service/command/FavoriteSharedPostCommand.java @@ -0,0 +1,14 @@ +package org.hankki.hankkiserver.api.favorite.service.command; + +import java.util.List; + +public record FavoriteSharedPostCommand ( + long userId, + long sharedFavoriteId, + String title, + List details +) { + public static FavoriteSharedPostCommand of(final long userId, final long sharedFavoriteId, final String title, final List details) { + return new FavoriteSharedPostCommand(userId, sharedFavoriteId, title, details); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/api/favoritestore/service/FavoriteStoreFinder.java b/src/main/java/org/hankki/hankkiserver/api/favoritestore/service/FavoriteStoreFinder.java index ab6b3da7..08a4975e 100644 --- a/src/main/java/org/hankki/hankkiserver/api/favoritestore/service/FavoriteStoreFinder.java +++ b/src/main/java/org/hankki/hankkiserver/api/favoritestore/service/FavoriteStoreFinder.java @@ -27,4 +27,8 @@ public FavoriteStore findByFavoriteIdAndStoreId(final Long favoriteId, final Lon public boolean isExist(final Long favoriteId, final Long storeId) { return favoriteStoreRepository.isExist(favoriteId, storeId); } -} \ No newline at end of file + + public List findByFavoriteId(final long favoriteId) { + return favoriteStoreRepository.findByFavoriteId(favoriteId); + } +} diff --git a/src/main/java/org/hankki/hankkiserver/domain/favoritestore/repository/FavoriteStoreRepository.java b/src/main/java/org/hankki/hankkiserver/domain/favoritestore/repository/FavoriteStoreRepository.java index 239de7de..0a74fa03 100644 --- a/src/main/java/org/hankki/hankkiserver/domain/favoritestore/repository/FavoriteStoreRepository.java +++ b/src/main/java/org/hankki/hankkiserver/domain/favoritestore/repository/FavoriteStoreRepository.java @@ -23,4 +23,6 @@ public interface FavoriteStoreRepository extends JpaRepository findByFavoriteId(Long favoriteId); +}