From 7d3a87140cccc931b02bbe7b204befe0bea0fa4b Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 01:58:11 +0900 Subject: [PATCH 01/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(RecruitRespon?= =?UTF-8?q?se):=20=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94,=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=84=B1=EA=B3=B5?= =?UTF-8?q?=20=EC=8B=9C=20=EC=9D=91=EB=8B=B5=20DTO=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recruit/web/dto/RecruitResponseDTO.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/gaji/service/domain/recruit/web/dto/RecruitResponseDTO.java b/src/main/java/gaji/service/domain/recruit/web/dto/RecruitResponseDTO.java index c4323b36..9fb86ccf 100644 --- a/src/main/java/gaji/service/domain/recruit/web/dto/RecruitResponseDTO.java +++ b/src/main/java/gaji/service/domain/recruit/web/dto/RecruitResponseDTO.java @@ -63,5 +63,23 @@ public static class CommentResponseDTO { public static class CommentListDTO { int commentCount; List commentList; + + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class StudyLikesIdDTO { + Long studyLikesId; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class StudyBookmarkIdDTO { + Long studyBookmarkId; + } } From 64970e134bf1436fc99fc5749066817cf44ba59c Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:00:14 +0900 Subject: [PATCH 02/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature:=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84=EC=9A=94=EC=99=80=20?= =?UTF-8?q?=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=83=9D=EC=84=B1=EC=9E=90=20?= =?UTF-8?q?=EB=B9=8C=EB=8D=94=ED=8C=A8=ED=84=B4=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/domain/recruit/entity/RecruitPostBookmark.java | 7 ++++++- .../service/domain/recruit/entity/RecruitPostLikes.java | 6 ++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/recruit/entity/RecruitPostBookmark.java b/src/main/java/gaji/service/domain/recruit/entity/RecruitPostBookmark.java index 5999d7bc..c62a9c7b 100644 --- a/src/main/java/gaji/service/domain/recruit/entity/RecruitPostBookmark.java +++ b/src/main/java/gaji/service/domain/recruit/entity/RecruitPostBookmark.java @@ -4,6 +4,7 @@ import gaji.service.domain.user.entity.User; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -23,5 +24,9 @@ public class RecruitPostBookmark { @JoinColumn(name = "room_id") private Room room; - + @Builder + public RecruitPostBookmark(User user, Room room) { + this.user = user; + this.room = room; + } } diff --git a/src/main/java/gaji/service/domain/recruit/entity/RecruitPostLikes.java b/src/main/java/gaji/service/domain/recruit/entity/RecruitPostLikes.java index 193f978c..388cc48f 100644 --- a/src/main/java/gaji/service/domain/recruit/entity/RecruitPostLikes.java +++ b/src/main/java/gaji/service/domain/recruit/entity/RecruitPostLikes.java @@ -4,6 +4,7 @@ import gaji.service.domain.user.entity.User; import jakarta.persistence.*; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -24,4 +25,9 @@ public class RecruitPostLikes { @JoinColumn(name = "room_id") private Room room; + @Builder + public RecruitPostLikes(User user, Room room) { + this.user = user; + this.room = room; + } } From b1065ab4c94465681aac57cf5bde6fce3acafada Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:02:39 +0900 Subject: [PATCH 03/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature:=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84=EC=9A=94,=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=EC=99=80=20=EC=9D=91=EB=8B=B5=20DTO=EB=A5=BC?= =?UTF-8?q?=20=EB=B3=80=ED=99=98=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?Converter=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recruit/converter/RecruitConverter.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java b/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java index 17e1ab32..7243eeaa 100644 --- a/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java +++ b/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java @@ -3,6 +3,8 @@ import gaji.service.domain.common.entity.Category; import gaji.service.domain.common.entity.SelectCategory; import gaji.service.domain.enums.CategoryEnum; +import gaji.service.domain.recruit.entity.RecruitPostBookmark; +import gaji.service.domain.recruit.entity.RecruitPostLikes; import gaji.service.domain.user.entity.User; import gaji.service.domain.enums.Role; import gaji.service.domain.recruit.entity.StudyComment; @@ -110,4 +112,30 @@ public static RecruitResponseDTO.CommentListDTO toCommentListDTO(int commentCoun .build(); } + public static RecruitPostLikes toRecruitPostLikes(User user, Room room) { + return RecruitPostLikes.builder() + .user(user) + .room(room) + .build(); + } + + public static RecruitResponseDTO.StudyLikesIdDTO toStudyLikesIdDTO(RecruitPostLikes likes) { + return RecruitResponseDTO.StudyLikesIdDTO.builder() + .studyLikesId(likes.getId()) + .build(); + } + + public static RecruitPostBookmark toRecruitPostBookmark(User user, Room room) { + return RecruitPostBookmark.builder() + .user(user) + .room(room) + .build(); + } + + public static RecruitResponseDTO.StudyBookmarkIdDTO toStudyBookmarkIdDTO(RecruitPostBookmark bookmark) { + return RecruitResponseDTO.StudyBookmarkIdDTO.builder() + .studyBookmarkId(bookmark.getId()) + .build(); + } + } From 3d3a31dc1c58d276b52d994d9a9548643864fd7f Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:04:02 +0900 Subject: [PATCH 04/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(RecruitComman?= =?UTF-8?q?dService):=20=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94,=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EB=B9=84=EC=A6=88?= =?UTF-8?q?=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/RecruitCommandService.java | 4 ++ .../service/RecruitCommandServiceImpl.java | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java index 8aed2575..e1c748df 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java @@ -7,4 +7,8 @@ public interface RecruitCommandService { RecruitResponseDTO.CreateRoomDTO createRoom(RecruitRequestDTO.CreateRoomDTO request, Long userId); + + RecruitResponseDTO.StudyLikesIdDTO likeStudy(Long userId, Long roomId); + + RecruitResponseDTO.StudyBookmarkIdDTO bookmarkStudy(Long userId, Long roomId); } diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java index edbb0d75..6d8eef2a 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -5,7 +5,15 @@ import gaji.service.domain.common.repository.CategoryRepository; import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostTypeEnum; +import gaji.service.domain.post.converter.PostConverter; +import gaji.service.domain.post.entity.Post; +import gaji.service.domain.post.entity.PostLikes; +import gaji.service.domain.recruit.code.RecruitErrorStatus; import gaji.service.domain.recruit.converter.RecruitConverter; +import gaji.service.domain.recruit.entity.RecruitPostBookmark; +import gaji.service.domain.recruit.entity.RecruitPostLikes; +import gaji.service.domain.recruit.repository.RecruitPostBookmarkRepository; +import gaji.service.domain.recruit.repository.RecruitPostLikesRepository; import gaji.service.domain.recruit.repository.SelectCategoryRepository; import gaji.service.domain.recruit.web.dto.RecruitRequestDTO; import gaji.service.domain.recruit.web.dto.RecruitResponseDTO; @@ -13,10 +21,12 @@ import gaji.service.domain.room.entity.Room; import gaji.service.domain.room.service.MaterialCommandService; import gaji.service.domain.room.service.RoomCommandService; +import gaji.service.domain.room.service.RoomQueryService; import gaji.service.domain.studyMate.entity.StudyMate; import gaji.service.domain.studyMate.repository.StudyMateRepository; import gaji.service.domain.user.entity.User; import gaji.service.domain.user.service.UserQueryService; +import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -30,10 +40,13 @@ public class RecruitCommandServiceImpl implements RecruitCommandService { private final RoomCommandService roomCommandService; private final UserQueryService userQueryService; + private final RoomQueryService roomQueryService; private final SelectCategoryRepository selectCategoryRepository; private final CategoryRepository categoryRepository; private final StudyMateRepository studyMateRepository; private final MaterialCommandService materialCommandService; + private final RecruitPostLikesRepository recruitPostLikesRepository; + private final RecruitPostBookmarkRepository recruitPostBookmarkRepository; private static final String DEFAULT_THUMBNAIL_URL = "https://gaji-bucket.s3.ap-northeast-2.amazonaws.com/study/gaji.png"; @@ -104,4 +117,36 @@ private String generateInviteCode() { return code.toString(); } + + @Override + @Transactional + public RecruitResponseDTO.StudyLikesIdDTO likeStudy(Long userId, Long roomId) { + User user = userQueryService.findUserById(userId); + Room room = roomQueryService.findRoomById(roomId); + + if (recruitPostLikesRepository.existsByUserAndRoom(user, room)) { + throw new RestApiException(RecruitErrorStatus._ROOM_ALREADY_LIKE); + } + + RecruitPostLikes studyLikes = recruitPostLikesRepository.save(RecruitConverter.toRecruitPostLikes(user, room)); + room.increaseLike(); + + return RecruitConverter.toStudyLikesIdDTO(studyLikes); + } + + @Override + @Transactional + public RecruitResponseDTO.StudyBookmarkIdDTO bookmarkStudy(Long userId, Long roomId) { + User user = userQueryService.findUserById(userId); + Room room = roomQueryService.findRoomById(roomId); + + if (recruitPostBookmarkRepository.existsByUserAndRoom(user, room)) { + throw new RestApiException(RecruitErrorStatus._ROOM_ALREADY_BOOKMARK); + } + + RecruitPostBookmark studyBookmark = recruitPostBookmarkRepository.save(RecruitConverter.toRecruitPostBookmark(user, room)); + room.increaseBookmark(); + + return RecruitConverter.toStudyBookmarkIdDTO(studyBookmark); + } } From d990053d41c382460036f6a4883cc13fbf63140d Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:05:34 +0900 Subject: [PATCH 05/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature:=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84=EC=9A=94=EC=99=80=20?= =?UTF-8?q?=EB=B6=81=EB=A7=88=ED=81=AC=EC=97=90=20=EC=A0=91=EA=B7=BC?= =?UTF-8?q?=ED=95=A0=20repository=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/RecruitPostBookmarkRepository.java | 13 +++++++++++++ .../repository/RecruitPostLikesRepository.java | 12 ++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/main/java/gaji/service/domain/recruit/repository/RecruitPostBookmarkRepository.java create mode 100644 src/main/java/gaji/service/domain/recruit/repository/RecruitPostLikesRepository.java diff --git a/src/main/java/gaji/service/domain/recruit/repository/RecruitPostBookmarkRepository.java b/src/main/java/gaji/service/domain/recruit/repository/RecruitPostBookmarkRepository.java new file mode 100644 index 00000000..42df9301 --- /dev/null +++ b/src/main/java/gaji/service/domain/recruit/repository/RecruitPostBookmarkRepository.java @@ -0,0 +1,13 @@ +package gaji.service.domain.recruit.repository; + +import gaji.service.domain.recruit.entity.RecruitPostBookmark; +import gaji.service.domain.recruit.entity.RecruitPostLikes; +import gaji.service.domain.room.entity.Room; +import gaji.service.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RecruitPostBookmarkRepository extends JpaRepository { + boolean existsByUserAndRoom(User user, Room room); + + void deleteByUserAndRoom(User user, Room room); +} diff --git a/src/main/java/gaji/service/domain/recruit/repository/RecruitPostLikesRepository.java b/src/main/java/gaji/service/domain/recruit/repository/RecruitPostLikesRepository.java new file mode 100644 index 00000000..0711e9df --- /dev/null +++ b/src/main/java/gaji/service/domain/recruit/repository/RecruitPostLikesRepository.java @@ -0,0 +1,12 @@ +package gaji.service.domain.recruit.repository; + +import gaji.service.domain.recruit.entity.RecruitPostLikes; +import gaji.service.domain.room.entity.Room; +import gaji.service.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface RecruitPostLikesRepository extends JpaRepository { + boolean existsByUserAndRoom(User user, Room room); + + void deleteByUserAndRoom(User user, Room room); +} From 984ea7d286623923d7d88a4953d533c8cae550b2 Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:06:26 +0900 Subject: [PATCH 06/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(RecruitErrorS?= =?UTF-8?q?tatus):=20=EC=9D=B4=EB=AF=B8=20=EC=A1=B4=EC=9E=AC=ED=95=98?= =?UTF-8?q?=EB=8A=94=20=EC=A2=8B=EC=95=84=EC=9A=94=EC=99=80=20=EB=B6=81?= =?UTF-8?q?=EB=A7=88=ED=81=AC=20=EA=B4=80=EB=A0=A8=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gaji/service/domain/recruit/code/RecruitErrorStatus.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java b/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java index 33c9dfdb..5b203583 100644 --- a/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java +++ b/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java @@ -13,6 +13,9 @@ public enum RecruitErrorStatus implements BaseErrorCodeInterface { _USER_NOT_FOUND(HttpStatus.BAD_REQUEST, "USER_4001","사용자를 찾을 수 없습니다."), // 임시 생성 _RECRUIT_POST_NOT_FOUND(HttpStatus.BAD_REQUEST, "RECRUIT_4001", "모집 게시글을 찾을 수 없습니다."), _RECRUIT_CATEGORY_NOT_FOUND(HttpStatus.BAD_REQUEST, "RECRUIT_4002", "해당 카테고리가 존재하지 않습니다."), + + _ROOM_ALREADY_LIKE(HttpStatus.BAD_REQUEST, "LIKE_4001", "이미 좋아요 된 게시글 입니다."), + _ROOM_ALREADY_BOOKMARK(HttpStatus.BAD_REQUEST, "BOOKMARK_4001", "이미 북마크 된 게시글 입니다."), ; private final HttpStatus httpStatus; From 52e428e3298902ea8c4d30b3da09c4ca00813e33 Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:07:13 +0900 Subject: [PATCH 07/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(Room):=20?= =?UTF-8?q?=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84=EC=9A=94?= =?UTF-8?q?=EC=99=80=20=EB=B6=81=EB=A7=88=ED=81=AC=EB=A5=BC=20=EC=A6=9D?= =?UTF-8?q?=EA=B0=80=EC=8B=9C=ED=82=A4=EB=8A=94=20=EB=A9=94=EC=86=8C?= =?UTF-8?q?=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/gaji/service/domain/room/entity/Room.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/gaji/service/domain/room/entity/Room.java b/src/main/java/gaji/service/domain/room/entity/Room.java index 23273db6..84fc3ebf 100644 --- a/src/main/java/gaji/service/domain/room/entity/Room.java +++ b/src/main/java/gaji/service/domain/room/entity/Room.java @@ -146,4 +146,12 @@ public void prePersist() { this.bookmarks = 0; this.recruitPostTypeEnum = RecruitPostTypeEnum.RECRUITING; } + + public void increaseLike() { + this.likes++; + } + + public void increaseBookmark() { + this.bookmarks++; + } } From 94a345218275e5071e631915ef6bdc8a2b8ada9e Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:07:55 +0900 Subject: [PATCH 08/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(RecruitContro?= =?UTF-8?q?ller):=20=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94,=20=EB=B6=81=EB=A7=88=ED=81=AC=20Controller=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/RecruitController.java | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java b/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java index b73e077c..ddfde174 100644 --- a/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java +++ b/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java @@ -1,5 +1,8 @@ package gaji.service.domain.recruit.web.controller; +import gaji.service.domain.post.converter.PostConverter; +import gaji.service.domain.post.entity.PostLikes; +import gaji.service.domain.post.web.dto.PostResponseDTO; import gaji.service.domain.recruit.converter.RecruitConverter; import gaji.service.domain.recruit.service.RecruitCommandService; import gaji.service.domain.recruit.service.RecruitQueryService; @@ -10,7 +13,10 @@ import gaji.service.global.base.BaseResponse; import gaji.service.jwt.service.TokenProviderService; import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; import jakarta.validation.Valid; +import jakarta.validation.constraints.Min; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -27,7 +33,9 @@ public class RecruitController { @PostMapping("") @Operation(summary = "스터디 모집 게시글 생성 API", description = "스터디 모집 게시글을 생성하는 API입니다.") - public BaseResponse createRoom(@RequestBody @Valid RecruitRequestDTO.CreateRoomDTO request, @RequestHeader("Authorization") String authorizationHeader) { + public BaseResponse createRoom( + @RequestBody @Valid RecruitRequestDTO.CreateRoomDTO request, + @RequestHeader("Authorization") String authorizationHeader) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); RecruitResponseDTO.CreateRoomDTO responseDTO = recruitCommandService.createRoom(request, userId); return BaseResponse.onSuccess(responseDTO); @@ -46,5 +54,25 @@ public BaseResponse getCommentList(@PathVaria RecruitResponseDTO.CommentListDTO responseDTO = studyCommentQueryService.getCommentList(roomId); return BaseResponse.onSuccess(responseDTO); } + + @PostMapping("/{roomId}/likes") + @Operation(summary = "스터디 모집 게시글 좋아요 API", description = "스터디 모집 게시글 좋아요 누르는 API입니다.") + public BaseResponse likeStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + RecruitResponseDTO.StudyLikesIdDTO responseDTO = recruitCommandService.likeStudy(userId, roomId); + return BaseResponse.onSuccess(responseDTO); + } + + @PostMapping("/{roomId}/bookmarks") + @Operation(summary = "스터디 모집 게시글 북마크 API", description = "스터디 모집 게시글 북마크 누르는 API입니다.") + public BaseResponse bookmarkStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + RecruitResponseDTO.StudyBookmarkIdDTO responseDTO = recruitCommandService.bookmarkStudy(userId, roomId); + return BaseResponse.onSuccess(responseDTO); + } } From 62282b6a6796ab973c5c74dc56bea3d99ec65e91 Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:10:18 +0900 Subject: [PATCH 09/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(Room):=20?= =?UTF-8?q?=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EA=B0=90=EC=86=8C=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/gaji/service/domain/room/entity/Room.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/gaji/service/domain/room/entity/Room.java b/src/main/java/gaji/service/domain/room/entity/Room.java index 84fc3ebf..3791ea71 100644 --- a/src/main/java/gaji/service/domain/room/entity/Room.java +++ b/src/main/java/gaji/service/domain/room/entity/Room.java @@ -151,7 +151,15 @@ public void increaseLike() { this.likes++; } + public void decreaseLike() { + this.likes--; + } + public void increaseBookmark() { this.bookmarks++; } + + public void decreaseBookmark() { + this.bookmarks--; + } } From d7e85f3762d78216bc3b1249f41697660d2a43bc Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:11:20 +0900 Subject: [PATCH 10/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(RecruitErrorS?= =?UTF-8?q?tatus):=20=EC=9D=B4=EB=AF=B8=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EB=B0=8F=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=B7=A8=EC=86=8C?= =?UTF-8?q?=EB=90=9C=20=EA=B2=BD=EC=9A=B0=20=EA=B4=80=EB=A0=A8=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gaji/service/domain/recruit/code/RecruitErrorStatus.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java b/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java index 5b203583..5c63c4be 100644 --- a/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java +++ b/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java @@ -15,7 +15,10 @@ public enum RecruitErrorStatus implements BaseErrorCodeInterface { _RECRUIT_CATEGORY_NOT_FOUND(HttpStatus.BAD_REQUEST, "RECRUIT_4002", "해당 카테고리가 존재하지 않습니다."), _ROOM_ALREADY_LIKE(HttpStatus.BAD_REQUEST, "LIKE_4001", "이미 좋아요 된 게시글 입니다."), + _ROOM_ALREADY_NO_LIKE(HttpStatus.BAD_REQUEST, "LIKE_4002", "이미 좋아요 취소된 게시글 입니다."), + _ROOM_ALREADY_BOOKMARK(HttpStatus.BAD_REQUEST, "BOOKMARK_4001", "이미 북마크 된 게시글 입니다."), + _ROOM_ALREADY_NO_BOOKMARK(HttpStatus.BAD_REQUEST, "BOOKMARK_4002", "이미 북마크 취소된 게시글 입니다."), ; private final HttpStatus httpStatus; From bfaf1989acb5290318eb0fc9f31b23a9973b2e6d Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:12:11 +0900 Subject: [PATCH 11/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(RecruitContro?= =?UTF-8?q?ller):=20=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EB=B0=8F=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C=20Controller=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/RecruitController.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java b/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java index ddfde174..3a475561 100644 --- a/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java +++ b/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java @@ -65,6 +65,16 @@ public BaseResponse likeStudy( return BaseResponse.onSuccess(responseDTO); } + @DeleteMapping("/{roomId}/likes") + @Operation(summary = "스터디 모집 게시글 좋아요 취소 API", description = "스터디 모집 게시글 좋아요 취소하는 API 입니다.") + public BaseResponse unLikeStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + recruitCommandService.unLikeStudy(userId, roomId); + return BaseResponse.onSuccess(null); + } + @PostMapping("/{roomId}/bookmarks") @Operation(summary = "스터디 모집 게시글 북마크 API", description = "스터디 모집 게시글 북마크 누르는 API입니다.") public BaseResponse bookmarkStudy( @@ -74,5 +84,15 @@ public BaseResponse bookmarkStudy( RecruitResponseDTO.StudyBookmarkIdDTO responseDTO = recruitCommandService.bookmarkStudy(userId, roomId); return BaseResponse.onSuccess(responseDTO); } + + @DeleteMapping("/{roomId}/bookmarks") + @Operation(summary = "스터디 모집 게시글 북마크 취소 API", description = "스터디 모집 게시글 북마크 취소하는 API 입니다.") + public BaseResponse unBookmarkStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + recruitCommandService.unBookmarkStudy(userId, roomId); + return BaseResponse.onSuccess(null); + } } From f2afcdc12d844ae3b870ab261999c01a0bc8af42 Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:12:44 +0900 Subject: [PATCH 12/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature:=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84=EC=9A=94=20=EB=B0=8F=20?= =?UTF-8?q?=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=B7=A8=EC=86=8C=20=EB=B9=84?= =?UTF-8?q?=EC=A6=88=EB=8B=88=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/RecruitCommandService.java | 4 ++++ .../service/RecruitCommandServiceImpl.java | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java index e1c748df..fb8a7eed 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java @@ -10,5 +10,9 @@ public interface RecruitCommandService { RecruitResponseDTO.StudyLikesIdDTO likeStudy(Long userId, Long roomId); + void unLikeStudy(Long userId, Long roomId); + RecruitResponseDTO.StudyBookmarkIdDTO bookmarkStudy(Long userId, Long roomId); + + void unBookmarkStudy(Long userId, Long roomId); } diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java index 6d8eef2a..85c9b697 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -134,6 +134,16 @@ public RecruitResponseDTO.StudyLikesIdDTO likeStudy(Long userId, Long roomId) { return RecruitConverter.toStudyLikesIdDTO(studyLikes); } + @Override + @Transactional + public void unLikeStudy(Long userId, Long roomId) { + User user = userQueryService.findUserById(userId); + Room room = roomQueryService.findRoomById(roomId); + + recruitPostLikesRepository.deleteByUserAndRoom(user, room); + room.decreaseLike(); + } + @Override @Transactional public RecruitResponseDTO.StudyBookmarkIdDTO bookmarkStudy(Long userId, Long roomId) { @@ -149,4 +159,14 @@ public RecruitResponseDTO.StudyBookmarkIdDTO bookmarkStudy(Long userId, Long roo return RecruitConverter.toStudyBookmarkIdDTO(studyBookmark); } + + @Override + @Transactional + public void unBookmarkStudy(Long userId, Long roomId) { + User user = userQueryService.findUserById(userId); + Room room = roomQueryService.findRoomById(roomId); + + recruitPostBookmarkRepository.deleteByUserAndRoom(user, room); + room.decreaseBookmark(); + } } From 019f780365e32eaeb560eedc21b10047d551c093 Mon Sep 17 00:00:00 2001 From: spenshark Date: Thu, 15 Aug 2024 02:22:48 +0900 Subject: [PATCH 13/13] =?UTF-8?q?=E2=9C=A8=20[#85]=20feature(RecruitComman?= =?UTF-8?q?dService):=20=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EB=B0=8F=20=EB=B6=81=EB=A7=88=ED=81=AC=EA=B0=80=20?= =?UTF-8?q?=EC=97=86=EB=8A=94=20=EA=B2=BD=EC=9A=B0=20=EC=97=90=EB=9F=AC=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recruit/service/RecruitCommandServiceImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java index 85c9b697..2911247c 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -5,16 +5,13 @@ import gaji.service.domain.common.repository.CategoryRepository; import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostTypeEnum; -import gaji.service.domain.post.converter.PostConverter; -import gaji.service.domain.post.entity.Post; -import gaji.service.domain.post.entity.PostLikes; import gaji.service.domain.recruit.code.RecruitErrorStatus; import gaji.service.domain.recruit.converter.RecruitConverter; import gaji.service.domain.recruit.entity.RecruitPostBookmark; import gaji.service.domain.recruit.entity.RecruitPostLikes; import gaji.service.domain.recruit.repository.RecruitPostBookmarkRepository; import gaji.service.domain.recruit.repository.RecruitPostLikesRepository; -import gaji.service.domain.recruit.repository.SelectCategoryRepository; +import gaji.service.domain.common.repository.SelectCategoryRepository; import gaji.service.domain.recruit.web.dto.RecruitRequestDTO; import gaji.service.domain.recruit.web.dto.RecruitResponseDTO; import gaji.service.domain.room.entity.Material; @@ -140,6 +137,10 @@ public void unLikeStudy(Long userId, Long roomId) { User user = userQueryService.findUserById(userId); Room room = roomQueryService.findRoomById(roomId); + if (!recruitPostLikesRepository.existsByUserAndRoom(user, room)) { + throw new RestApiException(RecruitErrorStatus._ROOM_ALREADY_NO_LIKE); + } + recruitPostLikesRepository.deleteByUserAndRoom(user, room); room.decreaseLike(); } @@ -166,6 +167,9 @@ public void unBookmarkStudy(Long userId, Long roomId) { User user = userQueryService.findUserById(userId); Room room = roomQueryService.findRoomById(roomId); + if (!recruitPostBookmarkRepository.existsByUserAndRoom(user, room)) { + throw new RestApiException(RecruitErrorStatus._ROOM_ALREADY_NO_BOOKMARK); + } recruitPostBookmarkRepository.deleteByUserAndRoom(user, room); room.decreaseBookmark(); }