From eb61728d4a8bfb47ed80dc9f31c8581db4dcd5f2 Mon Sep 17 00:00:00 2001 From: spenshark Date: Sun, 18 Aug 2024 22:24:49 +0900 Subject: [PATCH 01/44] =?UTF-8?q?=F0=9F=94=A8=20[#112]=20fix:=20=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=EB=A5=BC=20String=EC=9D=B4=20?= =?UTF-8?q?=EC=95=84=EB=8B=8C=20id=20=EA=B0=92=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recruit/converter/RecruitConverter.java | 5 +- .../service/RecruitCommandServiceImpl.java | 27 +++++----- .../recruit/service/RecruitQueryService.java | 4 +- .../service/RecruitQueryServiceImpl.java | 49 ++++++++++++++----- .../web/controller/RecruitController.java | 16 +++--- .../recruit/web/dto/RecruitRequestDTO.java | 6 +-- .../recruit/web/dto/RecruitResponseDTO.java | 4 +- 7 files changed, 70 insertions(+), 41 deletions(-) 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 8729e132..bc2c919c 100644 --- a/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java +++ b/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java @@ -5,13 +5,14 @@ import gaji.service.domain.enums.Role; import gaji.service.domain.recruit.entity.RecruitPostBookmark; import gaji.service.domain.recruit.entity.RecruitPostLikes; +import gaji.service.domain.studyMate.entity.StudyApplicant; +import gaji.service.domain.user.entity.User; import gaji.service.domain.recruit.entity.StudyComment; import gaji.service.domain.recruit.web.dto.RecruitRequestDTO; import gaji.service.domain.recruit.web.dto.RecruitResponseDTO; import gaji.service.domain.room.entity.Material; import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.entity.StudyMate; -import gaji.service.domain.user.entity.User; import gaji.service.global.converter.DateConverter; import org.springframework.data.domain.Slice; import org.springframework.stereotype.Component; @@ -161,7 +162,7 @@ public static RecruitResponseDTO.PreviewResponseDTO toPreviewDTO(Room room) { .recruitStatus(room.getRecruitPostTypeEnum()) .applicant(room.getStudyApplicantList().size()) .name(room.getName()) - .deadLine(ChronoUnit.DAYS.between(room.getRecruitEndDay(), LocalDate.now())) + .deadLine(ChronoUnit.DAYS.between(LocalDate.now(), room.getRecruitEndDay())) .description(room.getDescription()) .createdAt(DateConverter.convertToRelativeTimeFormat(room.getCreatedAt())) .recruitMaxCount(room.getPeopleMaximum()) 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 d7513ea9..c43963fd 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -1,5 +1,6 @@ package gaji.service.domain.recruit.service; +import gaji.service.domain.common.converter.CategoryConverter; import gaji.service.domain.common.entity.Category; import gaji.service.domain.common.entity.SelectCategory; import gaji.service.domain.common.service.CategoryService; @@ -17,11 +18,13 @@ 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.StudyApplicant; import gaji.service.domain.studyMate.entity.StudyMate; -import gaji.service.domain.studyMate.repository.StudyMateRepository; +import gaji.service.domain.studyMate.service.StudyMateQueryService; import gaji.service.domain.user.entity.User; import gaji.service.domain.user.service.UserQueryService; import gaji.service.global.exception.RestApiException; +import gaji.service.global.exception.code.status.GlobalErrorStatus; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -37,7 +40,9 @@ public class RecruitCommandServiceImpl implements RecruitCommandService { private final UserQueryService userQueryService; private final CategoryService categoryService; private final RoomQueryService roomQueryService; - private final StudyMateRepository studyMateRepository; + private final StudyMateCommandService studyMateCommandService; + private final StudyMateQueryService studyMateQueryService; + private final StudyApplicantService studyApplicantService; private final MaterialCommandService materialCommandService; private final RecruitPostLikesRepository recruitPostLikesRepository; private final RecruitPostBookmarkRepository recruitPostBookmarkRepository; @@ -63,7 +68,7 @@ public RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.Cre Room room = RecruitConverter.toRoom(request, user, request.getThumbnailUrl(), inviteCode, peopleMaximum); StudyMate studyMate = RecruitConverter.toStudyMate(user, room); - studyMateRepository.save(studyMate); + studyMateCommandService.saveStudyMate(studyMate); if (request.getMaterialList() != null && !request.getMaterialList().isEmpty()){ Material material; @@ -76,16 +81,14 @@ public RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.Cre roomCommandService.saveRoom(room); - Category category = Category.builder() - .category(request.getCategory()) - .build(); - categoryService.saveCategory(category); + if (request.getCategoryId() == null) { + throw new RestApiException(GlobalErrorStatus._INVALID_CATEGORY); + } + + Long categoryId = request.getCategoryId(); + Category category = categoryService.findByCategoryId(categoryId); - SelectCategory selectCategory = SelectCategory.builder() - .category(category) - .entityId(room.getId()) - .type(PostTypeEnum.ROOM) - .build(); + SelectCategory selectCategory = CategoryConverter.toSelectCategory(category, room.getId(), PostTypeEnum.ROOM); categoryService.saveSelectCategory(selectCategory); return RecruitConverter.toResponseDTO(room); diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java index 85a4518f..8492cc5a 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java @@ -9,7 +9,7 @@ public interface RecruitQueryService { RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId); RecruitResponseDTO.PreviewListResponseDTO getPreviewList( - CategoryEnum category, PreviewFilter filter, SortType sort, String query, Long value, int pageSize); + Long categoryId, PreviewFilter filter, SortType sort, String query, Long value, int pageSize); - RecruitResponseDTO.DefaultPreviewListResponseDTO getDefaultPreview(boolean isFirst, Integer nextCategoryIndex, int pageSize); + RecruitResponseDTO.DefaultPreviewListResponseDTO getDefaultPreview(boolean isFirst, int nextCategoryId, int pageSize); } diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java index 4e19bdcd..f11edcb6 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java @@ -2,6 +2,7 @@ import gaji.service.domain.common.entity.SelectCategory; import gaji.service.domain.common.service.CategoryService; +import gaji.service.domain.common.web.dto.CategoryResponseDTO; import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostTypeEnum; import gaji.service.domain.enums.PreviewFilter; @@ -23,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; @Service @@ -57,7 +57,12 @@ public RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId) { @Override @Transactional(readOnly = true) public RecruitResponseDTO.PreviewListResponseDTO getPreviewList( - CategoryEnum category, PreviewFilter filter, SortType sort, String query, Long value, int pageSize) { + Long categoryId, PreviewFilter filter, SortType sort, String query, Long value, int pageSize) { + + CategoryEnum category = null; + if (categoryId != null) { + category = categoryService.findByCategoryId(categoryId).getCategory(); + } validateQuery(query); @@ -67,22 +72,30 @@ public RecruitResponseDTO.PreviewListResponseDTO getPreviewList( } @Override - public RecruitResponseDTO.DefaultPreviewListResponseDTO getDefaultPreview(boolean isFirst, Integer nextCategoryIndex, int pageSize) { + public RecruitResponseDTO.DefaultPreviewListResponseDTO getDefaultPreview(boolean isFirst, int nextCategoryId, int pageSize) { Pageable pageable = PageRequest.of(0, pageSize); List defaultPreviewList = new ArrayList<>(); + List categoryList = categoryService.findAllCategory(); - List categoryList = new ArrayList<>(Arrays.asList(CategoryEnum.values())); - int count; + boolean hasNext = true; + int count = 0; + int getPreviewCount; if (isFirst) { - nextCategoryIndex = 0; - count = 4; + nextCategoryId = 0; + getPreviewCount = 4; } else { - count = nextCategoryIndex + 1; + nextCategoryId--; + getPreviewCount = 1; } - for (int i = nextCategoryIndex; i < count; i++) { - CategoryEnum category = categoryList.get(i); + while (count < getPreviewCount) { + if (categoryList.size() <= nextCategoryId) { + hasNext = false; + break; + } + + CategoryEnum category = categoryList.get(nextCategoryId++).getCategory(); RecruitResponseDTO.DefaultPreviewDTO previewList = recruitRepository.findByCategory(category, pageable); @@ -90,13 +103,25 @@ public RecruitResponseDTO.DefaultPreviewListResponseDTO getDefaultPreview(boolea if (previewList.getPreviewList() == null || previewList.getPreviewList().isEmpty()) { continue; } - + count++; defaultPreviewList.add(previewList); } + if (hasNext) { + RecruitResponseDTO.DefaultPreviewDTO previewList = + recruitRepository.findByCategory(categoryList.get(nextCategoryId).getCategory(), PageRequest.of(0, 1)); + + if (previewList.getPreviewList().isEmpty()) { + hasNext = false; + nextCategoryId = -1; + } + } + + return RecruitResponseDTO.DefaultPreviewListResponseDTO.builder() .defaultPreviewList(defaultPreviewList) - .nextIndex(count) + .nextCategoryId(++nextCategoryId) + .hasNext(hasNext) .build(); } 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 66c9f4fb..eb017d6d 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 @@ -29,7 +29,7 @@ public class RecruitController { private final StudyCommentQueryService studyCommentQueryService; @PostMapping("") - @Operation(summary = "스터디 모집 게시글 생성 성성 API", description = "스터디 모집 게시글을 생성하는 API입니다.") + @Operation(summary = "스터디 모집 게시글 생성 API", description = "스터디 모집 게시글을 생성하는 API입니다.") public BaseResponse createRoom( @RequestBody @Valid RecruitRequestDTO.CreateRoomDTO request, @RequestHeader("Authorization") String authorizationHeader) { @@ -96,7 +96,7 @@ public BaseResponse likeStudy( @Operation(summary = "스터디 모집 게시글 좋아요 취소 API", description = "스터디 모집 게시글 좋아요 취소하는 API 입니다.") public BaseResponse unLikeStudy( @RequestHeader("Authorization") String authorizationHeader, - @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); recruitCommandService.unLikeStudy(userId, roomId); return BaseResponse.onSuccess(null); @@ -116,7 +116,7 @@ public BaseResponse bookmarkStudy( @Operation(summary = "스터디 모집 게시글 북마크 취소 API", description = "스터디 모집 게시글 북마크 취소하는 API 입니다.") public BaseResponse unBookmarkStudy( @RequestHeader("Authorization") String authorizationHeader, - @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); recruitCommandService.unBookmarkStudy(userId, roomId); return BaseResponse.onSuccess(null); @@ -125,25 +125,25 @@ public BaseResponse unBookmarkStudy( @GetMapping("/preview") @Operation(summary = "스터디 모집 게시글 미리보기 목록 조회 API", description = "모집 게시글 목록을 조회하는 API 입니다.") public BaseResponse getPreviewList( - @RequestParam(required = false) CategoryEnum category, + @RequestParam(required = false) Long categoryId, @RequestParam(required = false) PreviewFilter filter, @RequestParam(defaultValue = "recent") SortType sort, @RequestParam(required = false) String query, @RequestParam(required = false) @Min(value = 0, message = "lastValue는 0 이상 입니다.") Long lastValue, - @RequestParam(value = "page", defaultValue = "20") @Min(value = 1, message = "pageSize는 0보다 커야 합니다.") int pageSize){ + @RequestParam(value = "page", defaultValue = "20") @Min(value = 1, message = "pageSize는 0보다 커야 합니다.") int pageSize) { - RecruitResponseDTO.PreviewListResponseDTO responseDTO = recruitQueryService.getPreviewList(category, filter, sort, query, lastValue, pageSize); + RecruitResponseDTO.PreviewListResponseDTO responseDTO = recruitQueryService.getPreviewList(categoryId, filter, sort, query, lastValue, pageSize); return BaseResponse.onSuccess(responseDTO); } @GetMapping("/preview-default") @Operation(summary = "스터디 미리보기 목록 조회 기본 페이지 API", description = "스터디 목록 조회 기본 페이지입니다.") public BaseResponse getDefaultPreviewList( - @RequestParam(defaultValue = "0") @Min(value = 0, message = "index는 0 이상 이어야 합니다.") Integer nextCategoryIndex, + @RequestParam(defaultValue = "0") @Min(value = 1, message = "nextCategoryId는 1이상 이어야 합니다.") int nextCategoryId, @RequestParam(defaultValue = "true") boolean isFirst, @RequestParam(value = "page", defaultValue = "5") @Min(value = 1, message = "pageSize는 0보다 커야 합니다.") int pageSize) { - RecruitResponseDTO.DefaultPreviewListResponseDTO responseDTO = recruitQueryService.getDefaultPreview(isFirst, nextCategoryIndex, pageSize); + RecruitResponseDTO.DefaultPreviewListResponseDTO responseDTO = recruitQueryService.getDefaultPreview(isFirst, nextCategoryId, pageSize); return BaseResponse.onSuccess(responseDTO); } } diff --git a/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java b/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java index 3ba8e1a2..e6e6cb38 100644 --- a/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java +++ b/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java @@ -72,9 +72,9 @@ public static class CreateRoomDTO { @Min(value = 1, message = "최대 인원은 1이상 이어야 합니다.") private int peopleMaximum; - @Schema(description = "카테고리 목록") - @ExistCategory - private CategoryEnum category; + @Schema(description = "카테고리의 id") + @Min(value = 1, message = "id는 1이상 이어야 합니다.") + private Long categoryId; } @Schema(description = "스터디 댓글 작성 DTO") 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 1f3c3b67..88dfd4e6 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 @@ -1,6 +1,5 @@ package gaji.service.domain.recruit.web.dto; - import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.RecruitPostTypeEnum; import gaji.service.domain.enums.UserActive; @@ -142,6 +141,7 @@ public static class DefaultPreviewDTO { @AllArgsConstructor public static class DefaultPreviewListResponseDTO { List defaultPreviewList; - int nextIndex; + boolean hasNext; + int nextCategoryId; } } From 5f9faa40b311fff4cd489766752554fd3aae992e Mon Sep 17 00:00:00 2001 From: spenshark Date: Mon, 19 Aug 2024 04:35:17 +0900 Subject: [PATCH 02/44] =?UTF-8?q?=E2=9C=A8=20[#112]=20feature:=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EA=B0=80=EC=A7=80=EA=B8=B0=20api=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 --- .../recruit/converter/RecruitConverter.java | 10 +++++++-- .../service/RecruitCommandService.java | 2 ++ .../service/RecruitCommandServiceImpl.java | 22 ++++++++++++++++--- .../web/controller/RecruitController.java | 11 ++++++++++ .../recruit/web/dto/RecruitResponseDTO.java | 8 +++++++ .../studyMate/code/StudyMateErrorStatus.java | 5 +++-- .../repository/StudyMateRepository.java | 3 +++ .../service/StudyMateCommandService.java | 7 ++++++ .../service/StudyMateCommandServiceImpl.java | 16 ++++++++++++++ .../service/StudyMateQueryService.java | 4 ++++ .../service/StudyMateQueryServiceImpl.java | 7 ++++++ 11 files changed, 88 insertions(+), 7 deletions(-) create mode 100644 src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java create mode 100644 src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java 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 bc2c919c..98effcf4 100644 --- a/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java +++ b/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java @@ -59,11 +59,11 @@ public static Material toMaterial(String materialPath, Room room) { .build(); } - public static StudyMate toStudyMate(User user, Room room) { + public static StudyMate toStudyMate(User user, Room room, Role role) { return StudyMate.builder() .user(user) .room(room) - .role(Role.READER) + .role(role) .build(); } @@ -172,4 +172,10 @@ public static RecruitResponseDTO.PreviewResponseDTO toPreviewDTO(Room room) { public static List toPreviewDTOLIST(List roomList) { return roomList.stream().map(RecruitConverter::toPreviewDTO).collect(Collectors.toList()); } + + public static RecruitResponseDTO.JoinStudyResponseDTO toJoinStudyResponseDTO(Long roomId) { + return RecruitResponseDTO.JoinStudyResponseDTO.builder() + .roomId(roomId) + .build(); + } } 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 965390e6..9cfae6b2 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java @@ -14,4 +14,6 @@ public interface RecruitCommandService { RecruitResponseDTO.StudyBookmarkIdDTO bookmarkStudy(Long userId, Long roomId); void unBookmarkStudy(Long userId, Long roomId); + + RecruitResponseDTO.JoinStudyResponseDTO joinStudy(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 c43963fd..7d62b18c 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -5,6 +5,7 @@ import gaji.service.domain.common.entity.SelectCategory; import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.enums.PostTypeEnum; +import gaji.service.domain.enums.Role; import gaji.service.domain.recruit.code.RecruitErrorStatus; import gaji.service.domain.recruit.converter.RecruitConverter; import gaji.service.domain.recruit.entity.RecruitPostBookmark; @@ -18,8 +19,9 @@ 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.StudyApplicant; +import gaji.service.domain.studyMate.code.StudyMateErrorStatus; import gaji.service.domain.studyMate.entity.StudyMate; +import gaji.service.domain.studyMate.service.StudyMateCommandService; import gaji.service.domain.studyMate.service.StudyMateQueryService; import gaji.service.domain.user.entity.User; import gaji.service.domain.user.service.UserQueryService; @@ -42,7 +44,6 @@ public class RecruitCommandServiceImpl implements RecruitCommandService { private final RoomQueryService roomQueryService; private final StudyMateCommandService studyMateCommandService; private final StudyMateQueryService studyMateQueryService; - private final StudyApplicantService studyApplicantService; private final MaterialCommandService materialCommandService; private final RecruitPostLikesRepository recruitPostLikesRepository; private final RecruitPostBookmarkRepository recruitPostBookmarkRepository; @@ -67,7 +68,7 @@ public RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.Cre User user = userQueryService.findUserById(userId); Room room = RecruitConverter.toRoom(request, user, request.getThumbnailUrl(), inviteCode, peopleMaximum); - StudyMate studyMate = RecruitConverter.toStudyMate(user, room); + StudyMate studyMate = RecruitConverter.toStudyMate(user, room, Role.READER); studyMateCommandService.saveStudyMate(studyMate); if (request.getMaterialList() != null && !request.getMaterialList().isEmpty()){ @@ -166,4 +167,19 @@ public void unBookmarkStudy(Long userId, Long roomId) { recruitPostBookmarkRepository.deleteByUserAndRoom(user, room); room.decreaseBookmark(); } + + @Override + public RecruitResponseDTO.JoinStudyResponseDTO joinStudy(Long userId, Long roomId) { + User user = userQueryService.findUserById(userId); + Room room = roomQueryService.findRoomById(roomId); + + if (studyMateQueryService.existsByUserAndRoom(user, room)) { + throw new RestApiException(StudyMateErrorStatus._USER_ALREADY_JOIN); + } + + StudyMate studyMate = RecruitConverter.toStudyMate(user, room, Role.MEMBER); + studyMateCommandService.saveStudyMate(studyMate); + + return RecruitConverter.toJoinStudyResponseDTO(roomId); + } } 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 eb017d6d..2377a6cd 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 @@ -146,5 +146,16 @@ public BaseResponse getDefault RecruitResponseDTO.DefaultPreviewListResponseDTO responseDTO = recruitQueryService.getDefaultPreview(isFirst, nextCategoryId, pageSize); return BaseResponse.onSuccess(responseDTO); } + + @PostMapping("/{roomId}") + @Operation(summary = "스터디 가지기 API", description = "스터디에 참여하는 API 입니다.") + public BaseResponse joinStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + return BaseResponse.onSuccess( + recruitCommandService.joinStudy(userId, roomId) + ); + } } 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 88dfd4e6..01701b3d 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 @@ -144,4 +144,12 @@ public static class DefaultPreviewListResponseDTO { boolean hasNext; int nextCategoryId; } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class JoinStudyResponseDTO { + Long roomId; + } } diff --git a/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java b/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java index 5fde3b74..7d8c9141 100644 --- a/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java +++ b/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java @@ -11,8 +11,9 @@ @AllArgsConstructor public enum StudyMateErrorStatus implements BaseErrorCodeInterface { // 스터디룸 게시판 - _USER_NOT_IN_STUDYROOM(HttpStatus.BAD_REQUEST, "StudyMateError_4001", "회원이 해당 스터디룸에 참여하고 있지 않습니다."); - + _USER_NOT_IN_STUDYROOM(HttpStatus.BAD_REQUEST, "StudyMateError_4001", "회원이 해당 스터디룸에 참여하고 있지 않습니다."), + _USER_ALREADY_JOIN(HttpStatus.BAD_REQUEST, "StudyMateError_4002", "이미 참여중인 회원입니다."), + ; private final HttpStatus httpStatus; diff --git a/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java b/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java index a5258b22..eb53fc36 100644 --- a/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java +++ b/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java @@ -2,6 +2,7 @@ import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.entity.StudyMate; +import gaji.service.domain.user.entity.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -13,4 +14,6 @@ public interface StudyMateRepository extends JpaRepository { Optional findByUserIdAndRoomId(Long userId, Long roomId); List findByRoom(Room room); + + boolean existsByUserAndRoom(User user, Room room); } \ No newline at end of file diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java new file mode 100644 index 00000000..0972b206 --- /dev/null +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java @@ -0,0 +1,7 @@ +package gaji.service.domain.studyMate.service; + +import gaji.service.domain.studyMate.entity.StudyMate; + +public interface StudyMateCommandService { + void saveStudyMate(StudyMate studyMate); +} diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java new file mode 100644 index 00000000..364088f7 --- /dev/null +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java @@ -0,0 +1,16 @@ +package gaji.service.domain.studyMate.service; + +import gaji.service.domain.studyMate.entity.StudyMate; +import gaji.service.domain.studyMate.repository.StudyMateRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class StudyMateCommandServiceImpl implements StudyMateCommandService{ + private final StudyMateRepository studyMateRepository; + + public void saveStudyMate(StudyMate studyMate) { + studyMateRepository.save(studyMate); + } +} diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java index 89372289..29b3caa8 100644 --- a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java @@ -1,9 +1,13 @@ package gaji.service.domain.studyMate.service; +import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.entity.StudyMate; +import gaji.service.domain.user.entity.User; public interface StudyMateQueryService { StudyMate findByUserIdAndRoomId(Long id, Long roomId); StudyMate findById(Long studyMateId); + + boolean existsByUserAndRoom(User user, Room room); } diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java index 155adc7e..2af8ff7a 100644 --- a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java @@ -1,8 +1,10 @@ package gaji.service.domain.studyMate.service; +import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.code.StudyMateErrorStatus; import gaji.service.domain.studyMate.entity.StudyMate; import gaji.service.domain.studyMate.repository.StudyMateRepository; +import gaji.service.domain.user.entity.User; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -26,4 +28,9 @@ public StudyMate findById(Long studyMateId){ .orElseThrow(() -> new RestApiException(StudyMateErrorStatus._USER_NOT_IN_STUDYROOM)); } + @Override + public boolean existsByUserAndRoom(User user, Room room) { + return studyMateRepository.existsByUserAndRoom(user, room); + } + } From f315970e008bbd17b4f972e9cc221348a87445c0 Mon Sep 17 00:00:00 2001 From: spenshark Date: Mon, 19 Aug 2024 06:06:47 +0900 Subject: [PATCH 03/44] =?UTF-8?q?=E2=9C=A8=20[#112]=20feature:=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EB=82=98=EA=B0=80=EA=B8=B0=20=EB=B0=8F=20?= =?UTF-8?q?=EB=82=B4=EB=B3=B4=EB=82=B4=EA=B8=B0=20API=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 | 38 +++++++++++++++++++ .../web/controller/RecruitController.java | 21 ++++++++++ .../studyMate/code/StudyMateErrorStatus.java | 2 + .../repository/StudyMateRepository.java | 2 + .../service/StudyMateCommandService.java | 4 ++ .../service/StudyMateCommandServiceImpl.java | 11 ++++++ .../service/StudyMateQueryService.java | 2 + .../service/StudyMateQueryServiceImpl.java | 7 ++++ 9 files changed, 91 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 9cfae6b2..5767705f 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java @@ -16,4 +16,8 @@ public interface RecruitCommandService { void unBookmarkStudy(Long userId, Long roomId); RecruitResponseDTO.JoinStudyResponseDTO joinStudy(Long userId, Long roomId); + + void leaveStudy(Long userId, Long roomId); + + void kickStudy(Long userId, Long roomId, Long targetId); } 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 7d62b18c..11f92080 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -169,6 +169,7 @@ public void unBookmarkStudy(Long userId, Long roomId) { } @Override + @Transactional public RecruitResponseDTO.JoinStudyResponseDTO joinStudy(Long userId, Long roomId) { User user = userQueryService.findUserById(userId); Room room = roomQueryService.findRoomById(roomId); @@ -182,4 +183,41 @@ public RecruitResponseDTO.JoinStudyResponseDTO joinStudy(Long userId, Long roomI return RecruitConverter.toJoinStudyResponseDTO(roomId); } + + @Override + @Transactional + public void leaveStudy(Long userId, Long roomId) { + User user = userQueryService.findUserById(userId); + Room room = roomQueryService.findRoomById(roomId); + + if (!studyMateQueryService.existsByUserAndRoom(user, room)) { + throw new RestApiException(StudyMateErrorStatus._USER_NOT_IN_STUDYROOM); + } else { + if (studyMateQueryService.checkLeader(user, room)) { + throw new RestApiException(StudyMateErrorStatus._LEADER_IMPOSSIBLE_LEAVE); + } + studyMateCommandService.deleteByUserAndRoom(user, room); + } + } + + @Override + @Transactional + public void kickStudy(Long userId, Long roomId, Long targetId) { + Room room = roomQueryService.findRoomById(roomId); + User target = userQueryService.findUserById(targetId); + + StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(userId, roomId); + if (studyMate.getRole() != Role.READER) { + throw new RestApiException(StudyMateErrorStatus._ONLY_LEADER_POSSIBLE); + } + + if (!studyMateQueryService.existsByUserAndRoom(target, room)) { + throw new RestApiException(StudyMateErrorStatus._USER_NOT_IN_STUDYROOM); + } else { + if (studyMateQueryService.checkLeader(target, room)) { + throw new RestApiException(StudyMateErrorStatus._LEADER_IMPOSSIBLE_LEAVE); + } + studyMateCommandService.deleteByUserAndRoom(target, room); + } + } } 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 2377a6cd..3afb6204 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 @@ -157,5 +157,26 @@ public BaseResponse joinStudy( recruitCommandService.joinStudy(userId, roomId) ); } + + @DeleteMapping("/{roomId}/leave") + @Operation(summary = "스터디 나가기 API", description = "스터디에서 나가는 API 입니다.") + public BaseResponse leaveStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + recruitCommandService.leaveStudy(userId, roomId); + return BaseResponse.onSuccess(null); + } + + @DeleteMapping("/{roomId}/kick/{targetId}") + @Operation(summary = "스터디 내보내기 API", description = "스터디에서 내보내는 API 입니다.") + public BaseResponse kickStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId, + @PathVariable @Min(value = 1, message = "targetId 1 이상 이어야 합니다.") Long targetId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + recruitCommandService.kickStudy(userId, roomId, targetId); + return BaseResponse.onSuccess(null); + } } diff --git a/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java b/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java index 7d8c9141..da576180 100644 --- a/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java +++ b/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java @@ -13,6 +13,8 @@ public enum StudyMateErrorStatus implements BaseErrorCodeInterface { // 스터디룸 게시판 _USER_NOT_IN_STUDYROOM(HttpStatus.BAD_REQUEST, "StudyMateError_4001", "회원이 해당 스터디룸에 참여하고 있지 않습니다."), _USER_ALREADY_JOIN(HttpStatus.BAD_REQUEST, "StudyMateError_4002", "이미 참여중인 회원입니다."), + _ONLY_LEADER_POSSIBLE(HttpStatus.BAD_REQUEST, "StudyMateError_4003", "스터디 리더만 가능한 작업입니다."), + _LEADER_IMPOSSIBLE_LEAVE(HttpStatus.BAD_REQUEST, "StudyMateError_4004", "스터디 리더는 나갈 수 없습니다."), ; diff --git a/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java b/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java index eb53fc36..83542659 100644 --- a/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java +++ b/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java @@ -16,4 +16,6 @@ public interface StudyMateRepository extends JpaRepository { List findByRoom(Room room); boolean existsByUserAndRoom(User user, Room room); + + void deleteByUserAndRoom(User user, Room room); } \ No newline at end of file diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java index 0972b206..f63faed5 100644 --- a/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandService.java @@ -1,7 +1,11 @@ package gaji.service.domain.studyMate.service; +import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.entity.StudyMate; +import gaji.service.domain.user.entity.User; public interface StudyMateCommandService { void saveStudyMate(StudyMate studyMate); + + void deleteByUserAndRoom(User user, Room room); } diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java index 364088f7..07c0e374 100644 --- a/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateCommandServiceImpl.java @@ -1,16 +1,27 @@ package gaji.service.domain.studyMate.service; +import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.entity.StudyMate; import gaji.service.domain.studyMate.repository.StudyMateRepository; +import gaji.service.domain.user.entity.User; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class StudyMateCommandServiceImpl implements StudyMateCommandService{ private final StudyMateRepository studyMateRepository; + @Override + @Transactional public void saveStudyMate(StudyMate studyMate) { studyMateRepository.save(studyMate); } + + @Override + @Transactional + public void deleteByUserAndRoom(User user, Room room) { + studyMateRepository.deleteByUserAndRoom(user, room); + } } diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java index 29b3caa8..e43ba8b5 100644 --- a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryService.java @@ -10,4 +10,6 @@ public interface StudyMateQueryService { StudyMate findById(Long studyMateId); boolean existsByUserAndRoom(User user, Room room); + + boolean checkLeader(User user, Room room); } diff --git a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java index 2af8ff7a..40fc8605 100644 --- a/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/studyMate/service/StudyMateQueryServiceImpl.java @@ -1,5 +1,6 @@ package gaji.service.domain.studyMate.service; +import gaji.service.domain.enums.Role; import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.code.StudyMateErrorStatus; import gaji.service.domain.studyMate.entity.StudyMate; @@ -33,4 +34,10 @@ public boolean existsByUserAndRoom(User user, Room room) { return studyMateRepository.existsByUserAndRoom(user, room); } + @Override + public boolean checkLeader(User user, Room room) { + StudyMate studyMate = findByUserIdAndRoomId(user.getId(), room.getId()); + return studyMate.getRole() == Role.READER; + } + } From f238261bd32f243797ba00351e93f6bf673ab1ab Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 10:26:56 +0900 Subject: [PATCH 04/44] =?UTF-8?q?=E2=9C=A8=20[#97]=20feature:=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C,?= =?UTF-8?q?=20=EB=8C=93=EA=B8=80=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= =?UTF-8?q?=EC=8B=9C=20isWriter=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EB=8F=84=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=ED=95=98=EB=8F=84=EB=A1=9D=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 --- .../converter/CommunityCommentConverter.java | 21 ++++++++++++++----- .../converter/CommunityPostConverter.java | 7 ++++++- .../post/service/CommunityCommentService.java | 3 ++- .../service/CommunityCommentServiceImpl.java | 7 ++++++- .../CommunityPostCommandServiceImpl.java | 8 +++---- .../service/CommunityPostQueryService.java | 3 ++- .../CommunityPostQueryServiceImpl.java | 7 ++++++- .../CommunityPostRestController.java | 7 +++++-- .../dto/CommunityPostCommentResponseDTO.java | 1 + .../web/dto/CommunityPostResponseDTO.java | 3 +++ 10 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java index 5ab364d8..9e3ebc75 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java @@ -1,14 +1,21 @@ package gaji.service.domain.post.converter; import gaji.service.domain.post.entity.CommunityComment; +import gaji.service.domain.post.service.CommunityCommentService; import gaji.service.domain.post.web.dto.CommunityPostCommentResponseDTO; import gaji.service.global.converter.DateConverter; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +@RequiredArgsConstructor +@Component public class CommunityCommentConverter { + private final CommunityCommentService communityCommentService; public static CommunityPostCommentResponseDTO.WriteCommentDTO toWriteCommentDTO(CommunityComment comment) { return CommunityPostCommentResponseDTO.WriteCommentDTO.builder() @@ -16,7 +23,7 @@ public static CommunityPostCommentResponseDTO.WriteCommentDTO toWriteCommentDTO( .build(); } - public static CommunityPostCommentResponseDTO.PostCommentDTO toPostCommentDTO(CommunityComment comment) { + public static CommunityPostCommentResponseDTO.PostCommentDTO toPostCommentDTO(CommunityComment comment, boolean isWriter) { return CommunityPostCommentResponseDTO.PostCommentDTO.builder() .commentId(comment.getId()) .userId(comment.getUser().getId()) @@ -24,14 +31,18 @@ public static CommunityPostCommentResponseDTO.PostCommentDTO toPostCommentDTO(Co .body(comment.getBody()) .groupNum(comment.getGroupNum()) .depth(comment.getDepth()) + .isWriter(isWriter) .createdAt(DateConverter.convertWriteTimeFormat(LocalDate.from(comment.getCreatedAt()), " 작성")) .build(); } - public static CommunityPostCommentResponseDTO.PostCommentListDTO toPostCommentListDTO(List commentList, boolean hasNext) { - List postCommentDTOList = commentList.stream() - .map(CommunityCommentConverter::toPostCommentDTO) - .collect(Collectors.toList()); + public CommunityPostCommentResponseDTO.PostCommentListDTO toPostCommentListDTO(List commentList, boolean hasNext, Long userId) { + List postCommentDTOList = new ArrayList<>(); + + for (CommunityComment communityComment : commentList) { + boolean isWriter = (userId == null) ? false : communityCommentService.isCommentWriter(userId, communityComment); + postCommentDTOList.add(CommunityCommentConverter.toPostCommentDTO(communityComment, isWriter)); + } return CommunityPostCommentResponseDTO.PostCommentListDTO.builder() .commentList(postCommentDTOList) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index ffa11300..0592dfeb 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -12,6 +12,7 @@ import gaji.service.domain.post.entity.PostLikes; import gaji.service.domain.post.service.CommunityPostBookMarkService; import gaji.service.domain.post.service.CommunityPostLikesService; +import gaji.service.domain.post.service.CommunityPostQueryService; import gaji.service.domain.post.web.dto.PostRequestDTO; import gaji.service.domain.post.web.dto.CommunityPostResponseDTO; import gaji.service.domain.user.entity.User; @@ -29,6 +30,7 @@ public class CommunityPostConverter { private final HashtagService hashtagService; private final CommunityPostBookMarkService postBookMarkService; private final CommunityPostLikesService postLikesService; + private final CommunityPostQueryService communityPostQueryService; // 초기 PostStatus 지정 public static PostStatusEnum getInitialPostStatus(PostTypeEnum type) { @@ -112,7 +114,7 @@ public CommunityPostResponseDTO.PostPreviewDTO toPostPreviewDTO(CommnuityPost po } public CommunityPostResponseDTO.PostPreviewListDTO toPostPreviewListDTO(List postList, boolean hasNext) { - CommunityPostConverter postConverter = new CommunityPostConverter(hashtagService, postBookMarkService, postLikesService); + CommunityPostConverter postConverter = new CommunityPostConverter(hashtagService, postBookMarkService, postLikesService, communityPostQueryService); List postPreviewDTOList = postList.stream() .map(postConverter::toPostPreviewDTO) .collect(Collectors.toList()); @@ -128,8 +130,10 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post List hashtagNameAndIdDTOList = HashtagConverter.toHashtagNameAndIdDTOList(selectHashtagList); boolean isBookmarked = (userId == null) ? false : postBookMarkService.existsByUserAndPost(userId, post); boolean isLiked = (userId == null) ? false : postLikesService.existsByUserAndPost(userId, post); + boolean isWriter = (userId == null) ? false : communityPostQueryService.isPostWriter(userId, post); return CommunityPostResponseDTO.PostDetailDTO.builder() +// .category() .userId(post.getUser().getId()) .type(post.getType()) .createdAt(DateConverter.convertWriteTimeFormat(LocalDate.from(post.getCreatedAt()), "")) @@ -140,6 +144,7 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post .hashtagList(hashtagNameAndIdDTOList) .isBookMarked(isBookmarked) .isLiked(isLiked) + .isWriter(isWriter) .body(post.getBody()) .build(); } diff --git a/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java b/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java index eba62850..f2984df7 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java @@ -14,6 +14,7 @@ public interface CommunityCommentService { void hardDeleteComment(CommunityComment comment); CommunityComment findByCommentId(Long commentId); Slice getCommentListByPost(Long postId, Integer lastGroupNum, int page, int size); - void validCommentOwner(Long userId, CommunityComment comment); + boolean isCommentWriter(Long userId, CommunityComment comment); + void validCommentWriter(Long userId, CommunityComment comment); } diff --git a/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java index 4a5a2d91..f3341733 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java @@ -58,7 +58,12 @@ public CommunityComment findByCommentId(Long commentId) { } @Override - public void validCommentOwner(Long userId, CommunityComment comment) { + public boolean isCommentWriter(Long userId, CommunityComment comment) { + return comment.getUser().getId().equals(userId); + } + + @Override + public void validCommentWriter(Long userId, CommunityComment comment) { if (!comment.getUser().getId().equals(userId)) { throw new RestApiException(CommunityCommentErrorStatus._NOT_AUTHORIZED); } diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java index 31e9db7d..d52a09c1 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java @@ -88,7 +88,7 @@ public void hardDeleteComment(Long userId, Long commentId) { CommunityComment findComment = communityCommentService.findByCommentId(commentId); // 검증 - communityCommentService.validCommentOwner(userId, findComment); + communityCommentService.validCommentWriter(userId, findComment); // 삭제 communityCommentService.hardDeleteComment(findComment); @@ -103,7 +103,7 @@ public void hardDeleteCommunityPost(Long userId, Long postId) { CommnuityPost findPost = communityPostQueryService.findPostByPostId(postId); // 검증 - communityPostQueryService.validPostOwner(userId, findPost); + communityPostQueryService.validPostWriter(userId, findPost); // 삭제 hashtagService.deleteAllByEntityIdAndType(findPost.getId(), findPost.getType()); @@ -132,7 +132,7 @@ public void cancelbookmarkCommunityPost(Long userId, Long postId) { CommnuityPost findPost = communityPostQueryService.findPostByPostId(postId); // 검증 - communityPostQueryService.validPostOwner(findUser.getId(), findPost); + communityPostQueryService.validPostWriter(findUser.getId(), findPost); // 삭제 postBookmarkRepository.deleteByUserAndPost(findUser, findPost); @@ -164,7 +164,7 @@ public void cancelLikeCommunityPost(Long userId, Long postId) { CommnuityPost findPost = communityPostQueryService.findPostByPostId(postId); // 검증 - communityPostQueryService.validPostOwner(findUser.getId(), findPost); + communityPostQueryService.validPostWriter(findUser.getId(), findPost); // 삭제 postLikesRepository.deleteByUserAndPost(findUser, findPost); diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java index d43c21c1..31513dfd 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java @@ -22,7 +22,8 @@ Slice getPostList(Integer lastPopularityScore, int size); Slice searchPostList(); CommnuityPost getPostDetail(Long postId); - void validPostOwner(Long userId, CommnuityPost post); + boolean isPostWriter(Long userId, CommnuityPost post); + void validPostWriter(Long userId, CommnuityPost post); void validExistsPostLikes(Long userId, CommnuityPost post); void validExistsPostBookmark(Long userId, CommnuityPost post); } diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java index a073ec29..d50d3867 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java @@ -69,7 +69,12 @@ public CommnuityPost findPostByPostId(Long postId) { } @Override - public void validPostOwner(Long userId, CommnuityPost post) { + public boolean isPostWriter(Long userId, CommnuityPost post) { + return post.getUser().getId().equals(userId); + } + + @Override + public void validPostWriter(Long userId, CommnuityPost post) { if (!post.getUser().getId().equals(userId)) { throw new RestApiException(CommunityPostErrorStatus._NOT_AUTHORIZED); } diff --git a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java index d60faec8..86b4101f 100644 --- a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java +++ b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java @@ -37,6 +37,7 @@ public class CommunityPostRestController { private final CommunityCommentService commentService; private final TokenProviderService tokenProviderService; private final CommunityPostConverter communityPostConverter; + private final CommunityCommentConverter communityCommentConverter; @PostMapping @Operation(summary = "커뮤니티 게시글 업로드 API", description = "커뮤니티의 게시글을 업로드하는 API입니다. 게시글 유형과 제목, 본문 내용을 검증합니다.") @@ -132,13 +133,15 @@ public BaseResponse hardDeleteComment(@RequestHeader("Authorization") String aut @GetMapping("/{postId}/comments") @Operation(summary = "커뮤니티 게시글 댓글 목록 조회 API", description = "lastGroupNum에 마지막으로 조회한 댓글의 grounNum과, size로 조회할 데이터의 개수를 보내주세요.") - public BaseResponse getCommentList(@Min(value = 1, message = "postId는 1 이상 이어야 합니다.") @PathVariable Long postId, + public BaseResponse getCommentList(@RequestHeader(value = "Authorization", required = false) String authorizationHeader, + @Min(value = 1, message = "postId는 1 이상 이어야 합니다.") @PathVariable Long postId, @Min(value = 0, message = "lastGroupNum은 0 이상 이어야 합니다.") @RequestParam(required = false) Integer lastGroupNum, // 마지막 댓글 ID @Min(value = 0, message = "page는 0 이상 이어야 합니다.") @RequestParam(defaultValue = "0") int page, @Min(value = 1, message = "size는 1 이상 이어야 합니다.") @RequestParam(defaultValue = "10") int size) // 페이지 크기 (기본값 10)) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); Slice commentSlice = commentService.getCommentListByPost(postId, lastGroupNum, page, size); - CommunityPostCommentResponseDTO.PostCommentListDTO postCommentDTOList = CommunityCommentConverter.toPostCommentListDTO(commentSlice.getContent(), commentSlice.hasNext()); + CommunityPostCommentResponseDTO.PostCommentListDTO postCommentDTOList = communityCommentConverter.toPostCommentListDTO(commentSlice.getContent(), commentSlice.hasNext(), userId); return BaseResponse.onSuccess(postCommentDTOList); } diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java index 330cb567..98b2c520 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java @@ -30,6 +30,7 @@ public static class PostCommentDTO { private Integer groupNum; private int depth; private String createdAt; + private boolean isWriter; } @Builder diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java index 11db2441..3a1ee788 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java @@ -1,6 +1,7 @@ package gaji.service.domain.post.web.dto; import gaji.service.domain.common.web.dto.HashtagResponseDTO; +import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; @@ -69,6 +70,7 @@ public static class PostPreviewListDTO { @NoArgsConstructor @AllArgsConstructor public static class PostDetailDTO { +// private CategoryEnum category; private Long userId; private PostTypeEnum type; private String createdAt; @@ -78,6 +80,7 @@ public static class PostDetailDTO { private String title; private boolean isBookMarked; private boolean isLiked; + private boolean isWriter; // 게시글을 조회한 사람이 작성자가 맞는지 private String body; private List hashtagList = new ArrayList<>(); } From 17732e80a9c69707693e24957c22cbef1d29e653 Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 14:46:32 +0900 Subject: [PATCH 05/44] =?UTF-8?q?:hammer:=20[#97]=20fix:=20=EB=B9=88=20?= =?UTF-8?q?=EB=AC=B8=EC=9E=90=EC=97=B4=EC=9D=B8=EC=A7=80=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=ED=95=98=EB=8A=94=20=EA=B5=AC=EB=AC=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 동적 쿼리를 사용하기 때문에 SortType이 빈 문자열이어도 정상적으로 실행됨. 오히려 null인지 체크하는 구문을 사용하면 log.error 로직에 의해 오류가 발생되므로 해당 구문 삭제 --- .../gaji/service/domain/post/converter/PostStatusConverter.java | 1 - .../gaji/service/domain/post/converter/PostTypeConverter.java | 1 - .../gaji/service/domain/post/converter/SortTypeConverter.java | 1 - 3 files changed, 3 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/converter/PostStatusConverter.java b/src/main/java/gaji/service/domain/post/converter/PostStatusConverter.java index 06714ef2..844b0b40 100644 --- a/src/main/java/gaji/service/domain/post/converter/PostStatusConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/PostStatusConverter.java @@ -10,7 +10,6 @@ public class PostStatusConverter implements Converter { @Override public PostStatusEnum convert(String param) { - if (!StringUtils.hasText(param)) throw new RestApiException(CommunityPostErrorStatus._INVALID_POST_STATUS); return PostStatusEnum.from(param); } } diff --git a/src/main/java/gaji/service/domain/post/converter/PostTypeConverter.java b/src/main/java/gaji/service/domain/post/converter/PostTypeConverter.java index 581d6bac..27b75508 100644 --- a/src/main/java/gaji/service/domain/post/converter/PostTypeConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/PostTypeConverter.java @@ -10,7 +10,6 @@ public class PostTypeConverter implements Converter { @Override public PostTypeEnum convert(String param) { - if (!StringUtils.hasText(param)) throw new RestApiException(CommunityPostErrorStatus._INVALID_POST_TYPE); return PostTypeEnum.from(param); } } diff --git a/src/main/java/gaji/service/domain/post/converter/SortTypeConverter.java b/src/main/java/gaji/service/domain/post/converter/SortTypeConverter.java index ea813732..b8b2388f 100644 --- a/src/main/java/gaji/service/domain/post/converter/SortTypeConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/SortTypeConverter.java @@ -10,7 +10,6 @@ public class SortTypeConverter implements Converter { @Override public SortType convert(String param) { - if (!StringUtils.hasText(param)) throw new RestApiException(GlobalErrorStatus._SORT_TYPE_NOT_VALID); return SortType.from(param); } } From 88b078ecc34823e9b47f0b9e5367c7b2ef0eeb81 Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 14:47:48 +0900 Subject: [PATCH 06/44] =?UTF-8?q?:hammer:=20[#97]=20fix:=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=EA=B0=80=20=EC=95=84=EB=8B=8C=20=EB=8B=A8?= =?UTF-8?q?=EC=9D=BC=20=EA=B0=92=EC=9D=84=20=EA=B0=80=EC=A0=B8=EC=98=A4?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/repository/SelectCategoryQueryDslRepository.java | 2 +- .../repository/SelectCategoryQueryDslRepositoryImpl.java | 5 +++-- .../gaji/service/domain/common/service/CategoryService.java | 2 +- .../service/domain/common/service/CategoryServiceImpl.java | 4 ++-- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepository.java b/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepository.java index 17acdab6..64f40d59 100644 --- a/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepository.java +++ b/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepository.java @@ -7,6 +7,6 @@ import java.util.List; public interface SelectCategoryQueryDslRepository { - List findAllFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType); + SelectCategory findOneFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType); List findEntityIdListByCategoryAndPostType(Category category, PostTypeEnum postType); } diff --git a/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java b/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java index 40a502f2..b9c6a88b 100644 --- a/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java @@ -20,7 +20,7 @@ public class SelectCategoryQueryDslRepositoryImpl implements SelectCategoryQuery private final JPAQueryFactory jpaQueryFactory; @Override - public List findAllFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType) { + public SelectCategory findOneFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType) { return jpaQueryFactory .selectFrom(selectCategory) .join(selectCategory.category, category1) @@ -30,7 +30,8 @@ public List findAllFetchJoinWithCategoryByEntityIdAndPostType(Lo selectCategory.type.eq(postType) ) .orderBy(selectCategory.id.asc()) - .fetch(); + .fetchOne() + ; } @Override diff --git a/src/main/java/gaji/service/domain/common/service/CategoryService.java b/src/main/java/gaji/service/domain/common/service/CategoryService.java index c3b23be7..243b7157 100644 --- a/src/main/java/gaji/service/domain/common/service/CategoryService.java +++ b/src/main/java/gaji/service/domain/common/service/CategoryService.java @@ -16,7 +16,7 @@ public interface CategoryService { List findEntityIdListByCategoryIdAndPostType(Long categoryId, PostTypeEnum postType); boolean existsByCategory(CategoryEnum category); boolean existsByCategoryId(Long categoryId); - List findAllFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType); + SelectCategory findOneFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType); List findAllCategory(); void saveAllSelectCategory(List selectCategoryList); diff --git a/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java b/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java index d0a3a561..0c3ae998 100644 --- a/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java +++ b/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java @@ -61,8 +61,8 @@ public boolean existsByCategoryId(Long categoryId) { } @Override - public List findAllFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType) { - return selectCategoryRepository.findAllFetchJoinWithCategoryByEntityIdAndPostType(entityId, postType); + public SelectCategory findOneFetchJoinWithCategoryByEntityIdAndPostType(Long entityId, PostTypeEnum postType) { + return selectCategoryRepository.findOneFetchJoinWithCategoryByEntityIdAndPostType(entityId, postType); } @Override From 1ac2d866a8bf51dc2a0fc7215d628445eb0a18ab Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 14:51:02 +0900 Subject: [PATCH 07/44] =?UTF-8?q?=E2=9C=A8=20[#97]=20feature:=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20=EB=AF=B8=EB=A6=AC=EB=B3=B4=EA=B8=B0=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20API=EC=97=90=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CommunityPostQueryDslRepository.java | 3 ++- .../CommunityPostQueryDslRepositoryImpl.java | 21 ++++++++++++++----- .../service/CommunityPostQueryService.java | 4 ++-- .../CommunityPostQueryServiceImpl.java | 11 ++++------ .../CommunityPostRestController.java | 14 +++++-------- 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepository.java b/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepository.java index b074160f..6eb994cc 100644 --- a/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepository.java +++ b/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepository.java @@ -13,7 +13,8 @@ public interface CommunityPostQueryDslRepository { - Slice findAllFetchJoinWithUser(Integer lastPopularityScore, + Slice findAllFetchJoinWithUser(String keyword, + Integer lastPopularityScore, Long lastPostId, Integer lastLikeCnt, Integer lastHit, diff --git a/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java b/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java index 36deb533..914e8c0b 100644 --- a/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java @@ -3,6 +3,8 @@ import com.querydsl.core.Tuple; import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.EnumPath; +import com.querydsl.core.types.dsl.NumberPath; import com.querydsl.jpa.impl.JPAQueryFactory; import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.enums.PostStatusEnum; @@ -19,6 +21,7 @@ import java.time.LocalDateTime; import java.util.List; +import static gaji.service.domain.common.entity.QSelectHashtag.selectHashtag; import static gaji.service.domain.post.entity.QCommnuityPost.commnuityPost; import static gaji.service.domain.user.entity.QUser.user; @@ -30,7 +33,8 @@ public class CommunityPostQueryDslRepositoryImpl implements CommunityPostQueryDs private final CategoryService categoryService; @Override - public Slice findAllFetchJoinWithUser(Integer lastPopularityScore, + public Slice findAllFetchJoinWithUser(String keyword, + Integer lastPopularityScore, Long lastPostId, Integer lastLikeCnt, Integer lastHit, @@ -44,6 +48,8 @@ public Slice findAllFetchJoinWithUser(Integer lastPopularityScore List postList = jpaQueryFactory. selectFrom(commnuityPost) .leftJoin(commnuityPost.user, user) +// .join(selectHashtag) // TODO: 연관관계가 맺어져 있지 않아도 조인 가능, 추후 리팩토링 고려 +// .on(joinSelectHashtag(commnuityPost.id, commnuityPost.type)) .fetchJoin() .where( ltPopularityScore(lastPopularityScore), @@ -52,7 +58,8 @@ public Slice findAllFetchJoinWithUser(Integer lastPopularityScore ltHit(lastHit), postTypeEq(postType), postStatusEq(postStatus), - postIdIn(entityIdList) + postIdIn(entityIdList), + searchByKeyword(keyword) ) .orderBy(orderBySortType(sortType)) .limit(pageable.getPageSize() + 1) @@ -120,9 +127,13 @@ private BooleanExpression ltHit(Integer lastHit) { return (lastHit != null) ? commnuityPost.hit.lt(lastHit) : null; } - private BooleanExpression searchKeyword(String keyword) { - return (keyword != null) ? commnuityPost.title.containsIgnoreCase(keyword) - : null; + private BooleanExpression searchByKeyword(String keyword) { + return (keyword != null) ? commnuityPost.title.containsIgnoreCase(keyword).or(commnuityPost.body.containsIgnoreCase(keyword)) : null; + } + + private BooleanExpression joinSelectHashtag(NumberPath entityId, EnumPath postType) { + return selectHashtag.entityId.eq(entityId) + .and(selectHashtag.type.eq(postType)); } private Slice checkLastPage(Pageable pageable, List postList) { diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java index c8c90a99..cbb22b2b 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java @@ -10,7 +10,8 @@ public interface CommunityPostQueryService { CommnuityPost findPostByPostId(Long postId); - Slice getPostList(Integer lastPopularityScore, + Slice getPostList(String keyword, + Integer lastPopularityScore, Long lastPostId, Integer lastLikeCnt, Integer lastHit, @@ -20,7 +21,6 @@ Slice getPostList(Integer lastPopularityScore, PostStatusEnum filter, int page, int size); - Slice searchPostList(); CommnuityPost getPostDetail(Long postId); boolean isPostWriter(Long userId, CommnuityPost post); void validPostWriter(Long userId, CommnuityPost post); diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java index dfd0d5b5..123233b5 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java @@ -24,7 +24,8 @@ public class CommunityPostQueryServiceImpl implements CommunityPostQueryService private final CommunityPostBookmarkRepository postBookmarkRepository; @Override - public Slice getPostList(Integer lastPopularityScore, + public Slice getPostList(String keyword, + Integer lastPopularityScore, Long lastPostId, Integer lastLikeCnt, Integer lastHit, @@ -35,7 +36,8 @@ public Slice getPostList(Integer lastPopularityScore, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); - return communityPostJpaRepository.findAllFetchJoinWithUser(lastPopularityScore, + return communityPostJpaRepository.findAllFetchJoinWithUser(keyword, + lastPopularityScore, lastPostId, lastLikeCnt, lastHit, @@ -46,11 +48,6 @@ public Slice getPostList(Integer lastPopularityScore, pageRequest); } - @Override - public Slice searchPostList() { - return null; - } - @Override public CommnuityPost getPostDetail(Long postId) { CommnuityPost findPost = communityPostJpaRepository.findByIdFetchJoinWithUser(postId); diff --git a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java index 2c69b6dc..bece46de 100644 --- a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java +++ b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java @@ -73,18 +73,19 @@ public BaseResponse getPostDetail(@Min(v } @GetMapping("/preivew") - @Operation(summary = "커뮤니티 게시글 미리보기 목록 조회 API", description = "아직은 무한스크롤로 구현되어있지 않고, 모든 목록을 조회합니다.") + @Operation(summary = "커뮤니티 게시글 미리보기 목록 조회 API", description = "hot 게시글, 커뮤니티 게시글 미리보기 목록, 검색 API에 모두 사용 가능합니다.") @Parameters({ @Parameter(name = "lastPopularityScore", description = "마지막으로 조회한 게시글의 인기 점수"), @Parameter(name = "lastPostId", description = "마지막으로 조회한 게시글의 id"), @Parameter(name = "lastLikeCnt", description = "마지막으로 조회한 게시글의 좋아요 수"), @Parameter(name = "lastHit", description = "마지막으로 조회한 게시글의 조회수"), @Parameter(name = "postType", description = "게시글의 유형(블로그, 프로젝트, 질문)"), - @Parameter(name = "categoryId", description = "카테고리(DEVELOP, AI, HW, ... 정책 공통 사항 참조)의 id"), + @Parameter(name = "categoryId", description = "카테고리의 id( /api/categories API로 조회해서 확인하시면 됩니다 )"), @Parameter(name = "sortType", description = "정렬 유형(hot, recent, like, hit)"), @Parameter(name = "filter", description = "게시글의 상태(모집중, 모집완료, 미완료질문, 해결완료)"), }) - public BaseResponse getPostPreivewList(@Min(value = 0, message = "lastPopularityScore는 0 이상 이어야 합니다.") @RequestParam(required = false) Integer lastPopularityScore, + public BaseResponse getPostPreivewList(@RequestParam(required = false) String keyword, + @Min(value = 0, message = "lastPopularityScore는 0 이상 이어야 합니다.") @RequestParam(required = false) Integer lastPopularityScore, @Min(value = 1, message = "lastPostId는 1 이상 이어야 합니다.") @RequestParam(required = false) Long lastPostId, @Min(value = 0, message = "lastLikeCnt는 0 이상 이어야 합니다.") @RequestParam(required = false) Integer lastLikeCnt, @Min(value = 0, message = "lastHit은 0 이상 이어야 합니다.") @RequestParam(required = false) Integer lastHit, @@ -95,15 +96,10 @@ public BaseResponse getPostPreivewL @Min(value = 0, message = "page는 0 이상 이어야 합니다.") @RequestParam(defaultValue = "0") int page, @Min(value = 1, message = "size는 1 이상 이어야 합니다.") @RequestParam(defaultValue = "10") int size) { - Slice postSlice = communityPostQueryService.getPostList(lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, categoryId, sortType, filter, page, size); + Slice postSlice = communityPostQueryService.getPostList(keyword, lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, categoryId, sortType, filter, page, size); return BaseResponse.onSuccess(communityPostConverter.toPostPreviewListDTO(postSlice.getContent(), postSlice.hasNext())); } - @GetMapping("/search") - public BaseResponse searchCommunityPostList() { - return null; - } - @PostMapping("/{postId}/comments") @Operation(summary = "커뮤니티 게시글 댓글 작성 API", description = "커뮤니티의 게시글에 댓글을 작성하는 API입니다. 대댓글을 작성하는 거라면 Long 타입의 parentCommentId를 query parameter로 보내주시면 됩니다!") @Parameters({ From b7b1cae142445bfeddb19fbdb2f2d004095caf5b Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 16:17:04 +0900 Subject: [PATCH 08/44] =?UTF-8?q?=E2=9C=A8=20[#97]=20feature:=20=EA=B2=8C?= =?UTF-8?q?=EC=8B=9C=EA=B8=80=20=EC=83=81=EC=84=B8=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=9D=91=EB=8B=B5=20=EA=B0=92=EC=97=90=20category=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20=EB=B0=8F=20NPE=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/converter/CommunityPostConverter.java | 17 +++++++++++++++-- .../post/web/dto/CommunityPostResponseDTO.java | 2 +- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index 0a2282d5..8cb222d9 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -1,9 +1,13 @@ package gaji.service.domain.post.converter; import gaji.service.domain.common.converter.HashtagConverter; +import gaji.service.domain.common.entity.Category; +import gaji.service.domain.common.entity.SelectCategory; import gaji.service.domain.common.entity.SelectHashtag; +import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.common.service.HashtagService; import gaji.service.domain.common.web.dto.HashtagResponseDTO; +import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostStatusEnum; import gaji.service.domain.enums.PostTypeEnum; import gaji.service.domain.post.entity.CommnuityPost; @@ -22,12 +26,14 @@ import java.time.LocalDate; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @RequiredArgsConstructor @Component public class CommunityPostConverter { private final HashtagService hashtagService; + private final CategoryService categoryService; private final CommunityPostBookMarkService postBookMarkService; private final CommunityPostLikesService postLikesService; private final CommunityPostQueryService communityPostQueryService; @@ -114,7 +120,7 @@ public CommunityPostResponseDTO.PostPreviewDTO toPostPreviewDTO(CommnuityPost po } public CommunityPostResponseDTO.PostPreviewListDTO toPostPreviewListDTO(List postList, boolean hasNext) { - CommunityPostConverter postConverter = new CommunityPostConverter(hashtagService, postBookMarkService, postLikesService, communityPostQueryService); + CommunityPostConverter postConverter = new CommunityPostConverter(hashtagService, categoryService, postBookMarkService, postLikesService, communityPostQueryService); List postPreviewDTOList = postList.stream() .map(postConverter::toPostPreviewDTO) .collect(Collectors.toList()); @@ -128,12 +134,19 @@ public CommunityPostResponseDTO.PostPreviewListDTO toPostPreviewListDTO(List selectHashtagList = hashtagService.findAllFetchJoinWithHashtagByEntityIdAndPostType(post.getId(), post.getType()); List hashtagNameAndIdDTOList = HashtagConverter.toHashtagNameAndIdDTOList(selectHashtagList); + + // ofNullable 메서드로 NPE 방지 + CategoryEnum category = Optional.ofNullable(categoryService.findOneFetchJoinWithCategoryByEntityIdAndPostType(post.getId(), post.getType())) + .map(SelectCategory::getCategory) + .map(Category::getCategory) + .orElse(null); + boolean isBookmarked = (userId == null) ? false : postBookMarkService.existsByUserAndPost(userId, post); boolean isLiked = (userId == null) ? false : postLikesService.existsByUserAndPost(userId, post); boolean isWriter = (userId == null) ? false : communityPostQueryService.isPostWriter(userId, post); return CommunityPostResponseDTO.PostDetailDTO.builder() -// .category() + .category(category) .userId(post.getUser().getId()) .type(post.getType()) .createdAt(DateConverter.convertWriteTimeFormat(LocalDate.from(post.getCreatedAt()), "")) diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java index 3a1ee788..a92b694b 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java @@ -70,7 +70,7 @@ public static class PostPreviewListDTO { @NoArgsConstructor @AllArgsConstructor public static class PostDetailDTO { -// private CategoryEnum category; + private CategoryEnum category; private Long userId; private PostTypeEnum type; private String createdAt; From 9d627e89568a3c770d44cc85ab52066371d55d8a Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 16:18:08 +0900 Subject: [PATCH 09/44] =?UTF-8?q?:hammer:=20[#97]=20fix:=20=EB=8B=A8?= =?UTF-8?q?=EC=9D=BC=20=EA=B0=92=EC=9D=84=20=EB=B0=98=ED=99=98=ED=95=98?= =?UTF-8?q?=EB=AF=80=EB=A1=9C=20orderBy=20=EA=B5=AC=EB=AC=B8=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/repository/SelectCategoryQueryDslRepositoryImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java b/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java index b9c6a88b..96e7128e 100644 --- a/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/common/repository/SelectCategoryQueryDslRepositoryImpl.java @@ -29,7 +29,6 @@ public SelectCategory findOneFetchJoinWithCategoryByEntityIdAndPostType(Long ent selectCategory.entityId.eq(entityId), selectCategory.type.eq(postType) ) - .orderBy(selectCategory.id.asc()) .fetchOne() ; } From 3208688e2d794aa9feeb06757aec9c2f849568d4 Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 16:26:24 +0900 Subject: [PATCH 10/44] =?UTF-8?q?:hammer:=20[#97]=20fix:=20=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20enum=20value=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/gaji/service/domain/enums/CategoryEnum.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gaji/service/domain/enums/CategoryEnum.java b/src/main/java/gaji/service/domain/enums/CategoryEnum.java index 8ba1882a..7b9f5269 100644 --- a/src/main/java/gaji/service/domain/enums/CategoryEnum.java +++ b/src/main/java/gaji/service/domain/enums/CategoryEnum.java @@ -14,10 +14,10 @@ public enum CategoryEnum { AI("인공지능"), HW("하드웨어"), SECURITY("보안"), - NETWORK("클라우드 네트워크"), + NETWORK("네트워크-클라우드"), LANGUAGE("어학"), DESIGN("디자인"), - BUSINESS("비즈니스"), + BUSINESS("비즈니스(pm)"), BOOK("독서 모임"); @JsonValue From e84042903b2c3b051f98f8f9d45c79c69d0e047a Mon Sep 17 00:00:00 2001 From: mmingoo Date: Mon, 19 Aug 2024 17:19:34 +0900 Subject: [PATCH 11/44] =?UTF-8?q?=E2=9C=A8=20=20=EC=9C=A0=EC=A0=80?= =?UTF-8?q?=EC=97=90=EA=B2=8C=20=EA=B3=BC=EC=A0=9C=EB=A5=BC=20=ED=95=A0?= =?UTF-8?q?=EB=8B=B9=ED=95=A8=EA=B3=BC=20=EB=8F=99=EC=8B=9C=EC=97=90=20?= =?UTF-8?q?=EC=A3=BC=EC=B0=A8=EB=B3=84=20=EC=A7=84=ED=96=89=EC=9C=A8=200?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=84=A4=EC=A0=95=ED=95=98=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/entity/NoticeConfirmation.java | 2 - .../room/service/RoomCommandService.java | 6 ++- .../room/service/RoomCommandServiceImpl.java | 38 ++++++++++++++++--- .../web/controller/RoomMainController.java | 8 +++- .../web/controller/RoomNoticeController.java | 2 - .../domain/room/web/dto/RoomRequestDto.java | 10 ++--- .../studyMate/entity/WeeklyUserProgress.java | 19 +++++++++- .../repository/StudyMateRepository.java | 1 - 8 files changed, 63 insertions(+), 23 deletions(-) diff --git a/src/main/java/gaji/service/domain/room/entity/NoticeConfirmation.java b/src/main/java/gaji/service/domain/room/entity/NoticeConfirmation.java index 1199218f..fd04f49e 100644 --- a/src/main/java/gaji/service/domain/room/entity/NoticeConfirmation.java +++ b/src/main/java/gaji/service/domain/room/entity/NoticeConfirmation.java @@ -5,8 +5,6 @@ import jakarta.persistence.*; import lombok.*; -import java.time.LocalDateTime; - @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) diff --git a/src/main/java/gaji/service/domain/room/service/RoomCommandService.java b/src/main/java/gaji/service/domain/room/service/RoomCommandService.java index 985eff35..3e892594 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandService.java @@ -12,9 +12,11 @@ public interface RoomCommandService { @Transactional - Assignment createAssignment(Long roomId, Long userId, RoomRequestDto.AssignmentDto requestDto); - void createUserAssignmentsForStudyMembers(Assignment assignment); + + //과제생성1 + Assignment createAssignment(Long roomId, Long userId, Integer weeks, RoomRequestDto.AssignmentDto requestDto); + @Transactional RoomNotice createNotice(Long roomId, Long userId, RoomRequestDto.RoomNoticeDto requestDto); diff --git a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java index c60eb5a2..225c84b5 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java @@ -9,7 +9,6 @@ import gaji.service.domain.room.repository.*; import gaji.service.domain.room.web.dto.RoomRequestDto; import gaji.service.domain.room.web.dto.RoomResponseDto; -import gaji.service.domain.studyMate.code.StudyMateErrorStatus; import gaji.service.domain.studyMate.entity.Assignment; import gaji.service.domain.studyMate.entity.StudyMate; import gaji.service.domain.studyMate.entity.UserAssignment; @@ -47,14 +46,14 @@ public class RoomCommandServiceImpl implements RoomCommandService { //과제생성1 @Override - public Assignment createAssignment(Long roomId, Long userId, RoomRequestDto.AssignmentDto requestDto){ + public Assignment createAssignment(Long roomId, Long userId, Integer weeks, RoomRequestDto.AssignmentDto requestDto){ // // 현재 로그인한 사용자의 정보를 가져옵니다. 추후 주석 해제 // String username = SecurityContextHolder.getContext().getAuthentication().getName(); // User currentUser = userRepository.findByUsername(username) // .orElseThrow(() -> new RestApiException(PostErrorStatus._USER_NOT_FOUND)); - RoomEvent roomEvent = roomQueryService.findRoomEventByRoomIdAndWeeks(roomId, requestDto.getWeeks()); + RoomEvent roomEvent = roomQueryService.findRoomEventByRoomIdAndWeeks(roomId, weeks); // List을 단일 String으로 변환 String bodyContent = String.join(", ", requestDto.getBodyList()); @@ -68,6 +67,8 @@ public Assignment createAssignment(Long roomId, Long userId, RoomRequestDto.Assi Assignment savedAssignment = assignmentRepository.save(assignment); createUserAssignmentsForStudyMembers(savedAssignment); + updateWeeklyUserProgressForNewAssignment(savedAssignment); + return savedAssignment; } @@ -89,15 +90,27 @@ public RoomNotice createNotice(Long roomId, Long userId, RoomRequestDto.RoomNoti // 과제 생성할 때 user에게 할당해주는 메서드 @Override public void createUserAssignmentsForStudyMembers(Assignment assignment) { - List studyMates = studyMateRepository.findByRoom(assignment.getRoomEvent().getRoom()); + RoomEvent roomEvent = assignment.getRoomEvent(); + for (StudyMate studyMate : studyMates) { + User user = studyMate.getUser(); + + // UserAssignment 생성 UserAssignment userAssignment = UserAssignment.builder() - .user(studyMate.getUser()) + .user(user) .assignment(assignment) .isComplete(false) .build(); userAssignmentRepository.save(userAssignment); + + // WeeklyUserProgress 생성 또는 업데이트 + WeeklyUserProgress progress = weeklyUserProgressRepository + .findByRoomEventAndUser(roomEvent, user) + .orElseGet(() -> WeeklyUserProgress.createInitialProgress(user, roomEvent, 0)); + + progress.updateProgress(progress.getCompletedAssignments()); + weeklyUserProgressRepository.save(progress); } } @@ -133,7 +146,7 @@ public RoomEvent setStudyPeriod(Long roomId, Integer weeks, Long userId, RoomReq public RoomEvent setStudyDescription(Long roomId, Integer weeks, Long userId, RoomRequestDto.StudyDescriptionDto requestDto) { User user = userQueryService.findUserById(userId); Room room = roomQueryService.findRoomById(roomId); - StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(roomId, user.getId()); + StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(),roomId); if (!studyMate.getRole().equals(Role.READER)) { @@ -254,5 +267,18 @@ public WeeklyUserProgress calculateAndSaveProgress(RoomEvent roomEvent, User use return weeklyUserProgressRepository.save(progress); } + private void updateWeeklyUserProgressForNewAssignment(Assignment assignment) { + RoomEvent roomEvent = assignment.getRoomEvent(); + List studyMates = studyMateRepository.findByRoom(roomEvent.getRoom()); + + for (StudyMate studyMate : studyMates) { + User user = studyMate.getUser(); + WeeklyUserProgress progress = weeklyUserProgressRepository + .findByRoomEventAndUser(roomEvent, user) + .orElseGet(() -> WeeklyUserProgress.createInitialProgress(user, roomEvent, 0)); + progress.updateProgress(progress.getCompletedAssignments()); + weeklyUserProgressRepository.save(progress); + } + } } diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java index 5d5fac97..39b37a07 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java @@ -26,15 +26,16 @@ public class RoomMainController { private final RoomQueryService roomQueryService; private final TokenProviderService tokenProviderService; - @PostMapping("/assignments/{roomId}/{userId}") + @PostMapping("/assignments/{roomId}/{weeks}") @Operation(summary = "스터디룸 과제 등록 API",description = "스터디룸의 과제를 등록하는 API입니다. room의 id가 존재하는지, 스터디에 참혀하고 있는 user인지 검증합니다.") public BaseResponse AssignmentController( @RequestBody @Valid RoomRequestDto.AssignmentDto requestDto, @PathVariable Long roomId, + @PathVariable Integer weeks, @RequestHeader("Authorization") String authorizationHeader){ Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); - Assignment assignment = roomCommandService.createAssignment(roomId, userId, requestDto); + Assignment assignment = roomCommandService.createAssignment(roomId, userId, weeks, requestDto); RoomResponseDto.AssignmentResponseDto responseDto = RoomResponseDto.AssignmentResponseDto.of(assignment.getId()); return BaseResponse.onSuccess(responseDto); } @@ -60,7 +61,10 @@ public BaseResponse setStudyDescription( @PathVariable Long roomId, @RequestHeader("Authorization") String authorizationHeader, @RequestBody @Valid RoomRequestDto.StudyDescriptionDto requestDto) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + System.out.println(roomId); + System.out.println("회원id: " + userId); RoomEvent event = roomCommandService.setStudyDescription(roomId, weeks, userId, requestDto); RoomResponseDto.EventResponseDto responseDto = RoomResponseDto.EventResponseDto.of(event.getId()); diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java index 73fc0d37..7ce4ee57 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java @@ -1,9 +1,7 @@ package gaji.service.domain.room.web.controller; import gaji.service.domain.room.converter.RoomConverter; -import gaji.service.domain.room.entity.QNoticeConfirmation; import gaji.service.domain.room.entity.RoomNotice; -import gaji.service.domain.room.repository.NoticeConfirmationRepository; import gaji.service.domain.room.service.RoomCommandService; import gaji.service.domain.room.service.RoomQueryService; import gaji.service.domain.room.web.dto.RoomRequestDto; diff --git a/src/main/java/gaji/service/domain/room/web/dto/RoomRequestDto.java b/src/main/java/gaji/service/domain/room/web/dto/RoomRequestDto.java index 4ec62cc5..6d21143b 100644 --- a/src/main/java/gaji/service/domain/room/web/dto/RoomRequestDto.java +++ b/src/main/java/gaji/service/domain/room/web/dto/RoomRequestDto.java @@ -2,7 +2,10 @@ import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.*; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -21,11 +24,6 @@ public class RoomRequestDto { @Builder public static class AssignmentDto { - @Schema(description = "주차") - @NotNull(message = "주차를 입력해주세요.") - @Min(value = 1, message = "유효하지 않은 형식의 주차입니다.") - private Integer weeks; - @Schema(description = "과제 입력") @NotEmpty(message = "1개 이상의 과제를 입력해주세요.") private List bodyList = new ArrayList<>(); diff --git a/src/main/java/gaji/service/domain/studyMate/entity/WeeklyUserProgress.java b/src/main/java/gaji/service/domain/studyMate/entity/WeeklyUserProgress.java index 2ebe8c36..1c1fa88c 100644 --- a/src/main/java/gaji/service/domain/studyMate/entity/WeeklyUserProgress.java +++ b/src/main/java/gaji/service/domain/studyMate/entity/WeeklyUserProgress.java @@ -25,12 +25,27 @@ public class WeeklyUserProgress { private Double progressPercentage; - // 총 과제 수 private Integer totalAssignments; - // 완료한 과제 수 private Integer completedAssignments; + public static WeeklyUserProgress createInitialProgress(User user, RoomEvent roomEvent, int totalAssignments) { + return WeeklyUserProgress.builder() + .user(user) + .roomEvent(roomEvent) + .progressPercentage(0.0) + .totalAssignments(totalAssignments) + .completedAssignments(0) + .build(); + } + + public void updateProgress(int completedAssignments) { + this.completedAssignments = completedAssignments; + this.progressPercentage = totalAssignments > 0 + ? ((double) completedAssignments / totalAssignments) * 100 + : 0.0; + } + public static WeeklyUserProgress createEmpty() { return new WeeklyUserProgress(); } diff --git a/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java b/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java index 0a20449d..b515a490 100644 --- a/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java +++ b/src/main/java/gaji/service/domain/studyMate/repository/StudyMateRepository.java @@ -5,7 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; -import javax.swing.text.html.Option; import java.util.List; import java.util.Optional; From d8fe38c9109a0da91139444d78d09c66c26a35b8 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Mon, 19 Aug 2024 20:06:57 +0900 Subject: [PATCH 12/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20assignment=20?= =?UTF-8?q?=EB=A5=BC=20List=EB=A1=9C=20=EB=B0=9B=EC=95=84=EC=98=A4?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit List 형식으로 과제를 받아온 다음에 각각의 과제를 유저들에게 할당 --- .../domain/room/code/RoomErrorStatus.java | 4 +- .../room/service/RoomCommandService.java | 4 +- .../room/service/RoomCommandServiceImpl.java | 117 ++++++++++-------- .../web/controller/RoomMainController.java | 28 ++--- .../domain/room/web/dto/RoomResponseDto.java | 47 ++++--- 5 files changed, 106 insertions(+), 94 deletions(-) diff --git a/src/main/java/gaji/service/domain/room/code/RoomErrorStatus.java b/src/main/java/gaji/service/domain/room/code/RoomErrorStatus.java index 512654e2..7bd7f044 100644 --- a/src/main/java/gaji/service/domain/room/code/RoomErrorStatus.java +++ b/src/main/java/gaji/service/domain/room/code/RoomErrorStatus.java @@ -27,7 +27,9 @@ public enum RoomErrorStatus implements BaseErrorCodeInterface { _NOTICE_NOT_FOUND(HttpStatus.BAD_REQUEST, "ROOM_4007"," 공지사항울 찾을 수 없습니다."), - _ASSIGNMENT_NOT_FOUND(HttpStatus.BAD_REQUEST, "ASSIGNMENT_4001"," 공지사항울 찾을 수 없습니다."); + _ASSIGNMENT_NOT_FOUND(HttpStatus.BAD_REQUEST, "ASSIGNMENT_4001"," 공지사항울 찾을 수 없습니다."), + _INTERNAL_SERVER_ERROR(HttpStatus.BAD_REQUEST, "SERVER_4001"," 에러"); + diff --git a/src/main/java/gaji/service/domain/room/service/RoomCommandService.java b/src/main/java/gaji/service/domain/room/service/RoomCommandService.java index 3e892594..ad4cd706 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandService.java @@ -10,12 +10,14 @@ import gaji.service.domain.user.entity.User; import jakarta.transaction.Transactional; +import java.util.List; + public interface RoomCommandService { @Transactional void createUserAssignmentsForStudyMembers(Assignment assignment); //과제생성1 - Assignment createAssignment(Long roomId, Long userId, Integer weeks, RoomRequestDto.AssignmentDto requestDto); + List createAssignment(Long roomId, Long userId, Integer weeks, RoomRequestDto.AssignmentDto requestDto); @Transactional RoomNotice createNotice(Long roomId, Long userId, RoomRequestDto.RoomNoticeDto requestDto); diff --git a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java index 225c84b5..98b287c6 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java @@ -20,14 +20,17 @@ import gaji.service.global.exception.RestApiException; import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; @Service @RequiredArgsConstructor @Transactional +@Slf4j public class RoomCommandServiceImpl implements RoomCommandService { private final AssignmentRepository assignmentRepository; @@ -46,30 +49,25 @@ public class RoomCommandServiceImpl implements RoomCommandService { //과제생성1 @Override - public Assignment createAssignment(Long roomId, Long userId, Integer weeks, RoomRequestDto.AssignmentDto requestDto){ -// // 현재 로그인한 사용자의 정보를 가져옵니다. 추후 주석 해제 -// String username = SecurityContextHolder.getContext().getAuthentication().getName(); -// User currentUser = userRepository.findByUsername(username) -// .orElseThrow(() -> new RestApiException(PostErrorStatus._USER_NOT_FOUND)); - - + public List createAssignment(Long roomId, Long userId, Integer weeks, RoomRequestDto.AssignmentDto requestDto) { RoomEvent roomEvent = roomQueryService.findRoomEventByRoomIdAndWeeks(roomId, weeks); + List savedAssignments = new ArrayList<>(); - // List을 단일 String으로 변환 - String bodyContent = String.join(", ", requestDto.getBodyList()); - + for (String body : requestDto.getBodyList()) { + Assignment assignment = Assignment.builder() + .roomEvent(roomEvent) + .body(body) + .build(); - Assignment assignment = Assignment.builder() - .roomEvent(roomEvent) - .body(bodyContent) - .build(); + Assignment savedAssignment = assignmentRepository.save(assignment); + savedAssignments.add(savedAssignment); - Assignment savedAssignment = assignmentRepository.save(assignment); + createUserAssignmentsForStudyMembers(savedAssignment); + } - createUserAssignmentsForStudyMembers(savedAssignment); - updateWeeklyUserProgressForNewAssignment(savedAssignment); + updateWeeklyUserProgressForNewAssignments(savedAssignments); - return savedAssignment; + return savedAssignments; } @Override @@ -91,26 +89,16 @@ public RoomNotice createNotice(Long roomId, Long userId, RoomRequestDto.RoomNoti @Override public void createUserAssignmentsForStudyMembers(Assignment assignment) { List studyMates = studyMateRepository.findByRoom(assignment.getRoomEvent().getRoom()); - RoomEvent roomEvent = assignment.getRoomEvent(); for (StudyMate studyMate : studyMates) { User user = studyMate.getUser(); - // UserAssignment 생성 UserAssignment userAssignment = UserAssignment.builder() .user(user) .assignment(assignment) .isComplete(false) .build(); userAssignmentRepository.save(userAssignment); - - // WeeklyUserProgress 생성 또는 업데이트 - WeeklyUserProgress progress = weeklyUserProgressRepository - .findByRoomEventAndUser(roomEvent, user) - .orElseGet(() -> WeeklyUserProgress.createInitialProgress(user, roomEvent, 0)); - - progress.updateProgress(progress.getCompletedAssignments()); - weeklyUserProgressRepository.save(progress); } } @@ -118,7 +106,7 @@ public void createUserAssignmentsForStudyMembers(Assignment assignment) { public RoomEvent setStudyPeriod(Long roomId, Integer weeks, Long userId, RoomRequestDto.StudyPeriodDto requestDto) { User user = userQueryService.findUserById(userId); Room room = roomQueryService.findRoomById(roomId); - StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(roomId, user.getId()); + StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(),roomId); if (!studyMate.getRole().equals(Role.READER)) { throw new RestApiException(RoomErrorStatus._USER_NOT_READER_IN_ROOM); @@ -206,37 +194,37 @@ public void saveRoom(Room room) { - @Transactional @Override public RoomResponseDto.AssignmentProgressResponse toggleAssignmentCompletion(Long userId, Long userAssignmentId) { - UserAssignment userAssignment = userAssignmentRepository.findById(userAssignmentId) - .orElseThrow(() -> new RestApiException(RoomErrorStatus._ASSIGNMENT_NOT_FOUND)); + try { + UserAssignment userAssignment = userAssignmentRepository.findById(userAssignmentId) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._ASSIGNMENT_NOT_FOUND)); - User user = userQueryService.findUserById(userId); - RoomEvent roomEvent = userAssignment.getAssignment().getRoomEvent(); + User user = userQueryService.findUserById(userId); + RoomEvent roomEvent = userAssignment.getAssignment().getRoomEvent(); - // Toggle completion status - if(!userAssignment.isComplete()) { - userAssignment.setComplete(true); - userAssignmentRepository.save(userAssignment); - }else{ - userAssignment.setComplete(false); + // Toggle completion status + userAssignment.setComplete(!userAssignment.isComplete()); userAssignmentRepository.save(userAssignment); + + // Calculate and save progress + WeeklyUserProgress progress = calculateAndSaveProgress(roomEvent, user); + + // Prepare response + boolean isCompleted = progress.getProgressPercentage() >= 100.0; + LocalDate deadline = roomEvent.getEndTime(); + + return RoomResponseDto.AssignmentProgressResponse.builder() + .progressPercentage(progress.getProgressPercentage()) + .completedAssignments(progress.getCompletedAssignments()) + .totalAssignments(progress.getTotalAssignments()) + .isCompleted(isCompleted) + .deadline(deadline) + .build(); + } catch (Exception e) { + log.error("Error in toggleAssignmentCompletion", e); + throw new RestApiException(RoomErrorStatus._INTERNAL_SERVER_ERROR); } - // Calculate and save progress - WeeklyUserProgress progress = calculateAndSaveProgress(roomEvent, user); - - // Prepare response - boolean isCompleted = progress.getProgressPercentage() >= 100.0; - LocalDate deadline = roomEvent.getEndTime(); - - return RoomResponseDto.AssignmentProgressResponse.builder() - .progressPercentage(progress.getProgressPercentage()) - .completedAssignments(progress.getCompletedAssignments()) - .totalAssignments(progress.getTotalAssignments()) - .isCompleted(isCompleted) - .deadline(deadline) - .build(); } @Override @@ -281,4 +269,25 @@ private void updateWeeklyUserProgressForNewAssignment(Assignment assignment) { weeklyUserProgressRepository.save(progress); } } + + private void updateWeeklyUserProgressForNewAssignments(List assignments) { + if (assignments.isEmpty()) { + return; + } + + RoomEvent roomEvent = assignments.get(0).getRoomEvent(); + List studyMates = studyMateRepository.findByRoom(roomEvent.getRoom()); + + for (StudyMate studyMate : studyMates) { + User user = studyMate.getUser(); + WeeklyUserProgress progress = weeklyUserProgressRepository + .findByRoomEventAndUser(roomEvent, user) + .orElseGet(() -> WeeklyUserProgress.createInitialProgress(user, roomEvent, 0)); + + int totalAssignments = progress.getTotalAssignments() + assignments.size(); + progress.setTotalAssignments(totalAssignments); + progress.updateProgress(progress.getCompletedAssignments()); + weeklyUserProgressRepository.save(progress); + } + } } diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java index 39b37a07..77c1e1c1 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java @@ -27,17 +27,18 @@ public class RoomMainController { private final TokenProviderService tokenProviderService; @PostMapping("/assignments/{roomId}/{weeks}") - @Operation(summary = "스터디룸 과제 등록 API",description = "스터디룸의 과제를 등록하는 API입니다. room의 id가 존재하는지, 스터디에 참혀하고 있는 user인지 검증합니다.") - public BaseResponse AssignmentController( + @Operation(summary = "스터디룸 과제 등록 API", description = "스터디룸의 과제를 등록하는 API입니다. room의 id가 존재하는지, 스터디에 참여하고 있는 user인지 검증합니다.") + public BaseResponse createAssignments( @RequestBody @Valid RoomRequestDto.AssignmentDto requestDto, @PathVariable Long roomId, @PathVariable Integer weeks, - @RequestHeader("Authorization") String authorizationHeader){ + @RequestHeader("Authorization") String authorizationHeader) { + + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + List assignments = roomCommandService.createAssignment(roomId, userId, weeks, requestDto); + RoomResponseDto.AssignmentResponseDto responseDto = RoomResponseDto.AssignmentResponseDto.of(assignments); + return BaseResponse.onSuccess(responseDto); - Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); - Assignment assignment = roomCommandService.createAssignment(roomId, userId, weeks, requestDto); - RoomResponseDto.AssignmentResponseDto responseDto = RoomResponseDto.AssignmentResponseDto.of(assignment.getId()); - return BaseResponse.onSuccess(responseDto); } @PostMapping("/event/{roomId}/{weeks}/period") @@ -70,18 +71,17 @@ public BaseResponse setStudyDescription( return BaseResponse.onSuccess(responseDto); } - @PostMapping("/main/assignment/{userAssignmentId}") - @Operation(summary = "주차별 과제 체크 박스 체크", description = "과제 체크 박스를 클릭하면 과제 완료 .") - public ResponseEntity toggleAssignmentCompletion( + @Operation(summary = "주차별 과제 체크 박스 체크", description = "과제 체크 박스를 클릭하면 과제 완료 상태를 토글합니다.") + public ResponseEntity toggleAssignmentCompletion( @RequestHeader("Authorization") String authorizationHeader, @PathVariable Long userAssignmentId) { - - Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); - RoomResponseDto.AssignmentProgressResponse response = roomCommandService.toggleAssignmentCompletion(userId, userAssignmentId); - return ResponseEntity.ok(response); + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + RoomResponseDto.AssignmentProgressResponse response = roomCommandService.toggleAssignmentCompletion(userId, userAssignmentId); + return ResponseEntity.ok(response); } + // 수정 필요 //특정 스터디룸의 모든 사용자의 진행 상황을 조회합니다 @GetMapping("/{roomEventId}/progress") diff --git a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java index d5802ef3..9c3baf68 100644 --- a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java +++ b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java @@ -1,24 +1,29 @@ package gaji.service.domain.room.web.dto; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; +import gaji.service.domain.studyMate.entity.Assignment; +import lombok.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.stream.Collectors; public class RoomResponseDto { @Getter + @Setter @Builder public static class AssignmentResponseDto { - private Long assignmentId; + private List assignmentIds; - public static AssignmentResponseDto of(Long assignmentId) { + public static AssignmentResponseDto of(List assignments) { + List ids = assignments.stream() + .map(Assignment::getId) + .collect(Collectors.toList()); return AssignmentResponseDto.builder() - .assignmentId(assignmentId) + .assignmentIds(ids) .build(); } } @@ -146,30 +151,24 @@ public void setViewCount(Integer viewCount) { } @Getter + @Setter @Builder - @NoArgsConstructor - @AllArgsConstructor public static class AssignmentProgressResponse { + @JsonProperty("progressPercentage") private Double progressPercentage; + + @JsonProperty("completedAssignments") private Integer completedAssignments; - private Integer totalAssignments; - private Boolean isCompleted; - private LocalDate deadline; - // Custom method to check if the deadline has passed - public boolean isDeadlinePassed() { - return LocalDate.now().isAfter(deadline); - } + @JsonProperty("totalAssignments") + private Integer totalAssignments; - // Custom method to get remaining days until deadline - public long getRemainingDays() { - return LocalDate.now().until(deadline).getDays(); - } + @JsonProperty("isCompleted") + private Boolean isCompleted; - // Custom method to get a formatted string of progress - public String getFormattedProgress() { - return String.format("%.1f%%", progressPercentage); - } + @JsonProperty("deadline") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private LocalDate deadline; } @Getter From a9c568dae71e679abbe78a69330124f425642aa8 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Mon, 19 Aug 2024 20:53:46 +0900 Subject: [PATCH 13/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=EC=A3=BC=EC=B0=A8?= =?UTF-8?q?=EB=B3=84=20=EC=A7=84=ED=96=89=EC=9C=A8=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존엔 과제 완료를 체크하지 않은 회원의 경우 주차별 진행율 조회했을 때 조회가 되지 않았음 --- .../room/service/RoomCommandService.java | 1 + .../room/service/RoomCommandServiceImpl.java | 55 +++++------ .../web/controller/RoomMainController.java | 7 +- .../domain/room/web/dto/RoomResponseDto.java | 99 +++++++++++-------- 4 files changed, 89 insertions(+), 73 deletions(-) diff --git a/src/main/java/gaji/service/domain/room/service/RoomCommandService.java b/src/main/java/gaji/service/domain/room/service/RoomCommandService.java index ad4cd706..c519b54a 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandService.java @@ -30,6 +30,7 @@ public interface RoomCommandService { void saveRoom(Room room); + RoomResponseDto.AssignmentProgressResponse toggleAssignmentCompletion(Long userId, Long userAssignmentId); WeeklyUserProgress calculateAndSaveProgress(RoomEvent roomEvent, User user); diff --git a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java index 98b287c6..f4fc561c 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java @@ -24,6 +24,7 @@ import org.springframework.stereotype.Service; import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; @@ -196,37 +197,35 @@ public void saveRoom(Room room) { @Override public RoomResponseDto.AssignmentProgressResponse toggleAssignmentCompletion(Long userId, Long userAssignmentId) { - try { - UserAssignment userAssignment = userAssignmentRepository.findById(userAssignmentId) - .orElseThrow(() -> new RestApiException(RoomErrorStatus._ASSIGNMENT_NOT_FOUND)); + UserAssignment userAssignment = userAssignmentRepository.findById(userAssignmentId) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._ASSIGNMENT_NOT_FOUND)); - User user = userQueryService.findUserById(userId); - RoomEvent roomEvent = userAssignment.getAssignment().getRoomEvent(); - - // Toggle completion status - userAssignment.setComplete(!userAssignment.isComplete()); - userAssignmentRepository.save(userAssignment); - - // Calculate and save progress - WeeklyUserProgress progress = calculateAndSaveProgress(roomEvent, user); - - // Prepare response - boolean isCompleted = progress.getProgressPercentage() >= 100.0; - LocalDate deadline = roomEvent.getEndTime(); - - return RoomResponseDto.AssignmentProgressResponse.builder() - .progressPercentage(progress.getProgressPercentage()) - .completedAssignments(progress.getCompletedAssignments()) - .totalAssignments(progress.getTotalAssignments()) - .isCompleted(isCompleted) - .deadline(deadline) - .build(); - } catch (Exception e) { - log.error("Error in toggleAssignmentCompletion", e); - throw new RestApiException(RoomErrorStatus._INTERNAL_SERVER_ERROR); - } + User user = userQueryService.findUserById(userId); + RoomEvent roomEvent = userAssignment.getAssignment().getRoomEvent(); + + // Toggle completion status + userAssignment.setComplete(!userAssignment.isComplete()); + userAssignmentRepository.save(userAssignment); + + // Calculate and save progress + WeeklyUserProgress progress = calculateAndSaveProgress(roomEvent, user); + + // Prepare response + boolean isCompleted = progress.getProgressPercentage() >= 100.0; + LocalDate deadline = roomEvent.getEndTime(); + long daysLeft = ChronoUnit.DAYS.between(LocalDate.now(), deadline); + + return RoomResponseDto.AssignmentProgressResponse.builder() + .progressPercentage(progress.getProgressPercentage()) + .completedAssignments(progress.getCompletedAssignments()) + .totalAssignments(progress.getTotalAssignments()) + .isCompleted(isCompleted) + .deadline(deadline) + .daysLeft(daysLeft) + .build(); } + @Override public WeeklyUserProgress calculateAndSaveProgress(RoomEvent roomEvent, User user) { int totalAssignments = roomEvent.getAssignmentList().size(); diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java index 77c1e1c1..3b377ddf 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java @@ -36,9 +36,12 @@ public BaseResponse createAssignments( Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); List assignments = roomCommandService.createAssignment(roomId, userId, weeks, requestDto); - RoomResponseDto.AssignmentResponseDto responseDto = RoomResponseDto.AssignmentResponseDto.of(assignments); - return BaseResponse.onSuccess(responseDto); + // RoomEvent 가져오기 + RoomEvent roomEvent = roomQueryService.findRoomEventByRoomIdAndWeeks(roomId, weeks); + + RoomResponseDto.AssignmentResponseDto responseDto = RoomResponseDto.AssignmentResponseDto.of(assignments, roomEvent); + return BaseResponse.onSuccess(responseDto); } @PostMapping("/event/{roomId}/{weeks}/period") diff --git a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java index 9c3baf68..225993af 100644 --- a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java +++ b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java @@ -2,11 +2,14 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; +import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.studyMate.entity.Assignment; +import gaji.service.domain.studyMate.entity.WeeklyUserProgress; import lombok.*; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; import java.util.List; import java.util.stream.Collectors; @@ -17,17 +20,63 @@ public class RoomResponseDto { @Builder public static class AssignmentResponseDto { private List assignmentIds; + private LocalDate deadline; + private Long daysLeft; - public static AssignmentResponseDto of(List assignments) { + public static AssignmentResponseDto of(List assignments, RoomEvent roomEvent) { List ids = assignments.stream() .map(Assignment::getId) .collect(Collectors.toList()); + return AssignmentResponseDto.builder() .assignmentIds(ids) + .deadline(roomEvent.getEndTime()) + .daysLeft(calculateDaysLeft(roomEvent.getEndTime())) .build(); } } + @Getter + @Setter + @Builder + public static class AssignmentProgressResponse { + @JsonProperty("progressPercentage") + private Double progressPercentage; + + @JsonProperty("completedAssignments") + private Integer completedAssignments; + + @JsonProperty("totalAssignments") + private Integer totalAssignments; + + @JsonProperty("isCompleted") + private Boolean isCompleted; + + @JsonProperty("deadline") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") + private LocalDate deadline; + + + @JsonProperty("daysLeft") + private Long daysLeft; + + public static AssignmentProgressResponse of(WeeklyUserProgress progress, RoomEvent roomEvent) { + return AssignmentProgressResponse.builder() + .progressPercentage(progress.getProgressPercentage()) + .completedAssignments(progress.getCompletedAssignments()) + .totalAssignments(progress.getTotalAssignments()) + .isCompleted(progress.getProgressPercentage() >= 100.0) + .deadline(roomEvent.getEndTime()) + .daysLeft(calculateDaysLeft(roomEvent.getEndTime())) + .build(); + } + } + + public static long calculateDaysLeft(LocalDate deadline) { + return ChronoUnit.DAYS.between(LocalDate.now(), deadline); + } + + @Getter @Builder public static class EventResponseDto { @@ -44,7 +93,7 @@ public static EventResponseDto of(Long eventId) { @Getter @NoArgsConstructor @AllArgsConstructor - public static class AssignmentDto{ + public static class AssignmentDto { Long id; Integer weeks; String body; @@ -54,7 +103,7 @@ public static class AssignmentDto{ @Getter @NoArgsConstructor @AllArgsConstructor - public static class RoomNoticeDto{ + public static class RoomNoticeDto { Long noticeId; } @@ -70,7 +119,6 @@ public static class RoomMainDto { private Long daysLeftForRecruit; private Long applicantCount; - // 수정된 생성자 public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, LocalDate recruitStartDay, LocalDate recruitEndDay, Long daysLeftForRecruit, Long applicantCount) { @@ -80,17 +128,10 @@ public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, this.recruitStartDay = recruitStartDay; this.recruitEndDay = recruitEndDay; this.applicantCount = applicantCount; - - if(daysLeftForRecruit < 0 ){ - this.daysLeftForRecruit = 0L; - }else{ - this.daysLeftForRecruit = daysLeftForRecruit; - } - + this.daysLeftForRecruit = Math.max(daysLeftForRecruit, 0L); } } - @Builder @Getter @NoArgsConstructor @@ -112,7 +153,7 @@ public static class NoticePreview { @Getter @AllArgsConstructor - public static class NoticeDtoList{ + public static class NoticeDtoList { private List noticeDtoList; } @@ -130,7 +171,6 @@ public static class NoticeDto { private Integer viewCount; private String timeSincePosted; - // 이 생성자를 추가합니다 public NoticeDto(Long id, String authorName, String title, String body, Long confirmCount, LocalDateTime createdAt, Integer viewCount) { this.id = id; this.authorName = authorName; @@ -150,27 +190,6 @@ public void setViewCount(Integer viewCount) { } } - @Getter - @Setter - @Builder - public static class AssignmentProgressResponse { - @JsonProperty("progressPercentage") - private Double progressPercentage; - - @JsonProperty("completedAssignments") - private Integer completedAssignments; - - @JsonProperty("totalAssignments") - private Integer totalAssignments; - - @JsonProperty("isCompleted") - private Boolean isCompleted; - - @JsonProperty("deadline") - @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd") - private LocalDate deadline; - } - @Getter @Builder public static class UserProgressDTO { @@ -194,8 +213,6 @@ public static class StudyPeriodDTO { private LocalDate endDate; } - - // 스터디룸 메인 게시판 글 불러오기 @Builder @Getter @NoArgsConstructor @@ -210,7 +227,6 @@ public static class RoomMainNoticeDto { private Integer viewCount; private String timeSincePosted; - // 이 생성자를 추가합니다 public RoomMainNoticeDto(Long id, String authorName, String title, String body, Long confirmCount, LocalDateTime createdAt, Integer viewCount) { this.id = id; this.authorName = authorName; @@ -224,10 +240,7 @@ public RoomMainNoticeDto(Long id, String authorName, String title, String body, @Getter @AllArgsConstructor - public static class IsConfirmedResponse{ + public static class IsConfirmedResponse { private Boolean isConfirmed; } - - - -} +} \ No newline at end of file From 03b3b6c6f03476ca46f754e3a188007e7bea5096 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Mon, 19 Aug 2024 21:00:07 +0900 Subject: [PATCH 14/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=EC=A3=BC=EC=B0=A8?= =?UTF-8?q?=EB=B3=84=20=EC=A7=84=ED=96=89=EC=9C=A8=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 회원의 이름으로 조회가돼서 닉네임으로 조회되게끔 수정 --- .../domain/room/repository/WeeklyUserProgressRepository.java | 4 ++-- .../service/domain/room/service/RoomQueryServiceImpl.java | 2 +- .../gaji/service/domain/room/web/dto/RoomResponseDto.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gaji/service/domain/room/repository/WeeklyUserProgressRepository.java b/src/main/java/gaji/service/domain/room/repository/WeeklyUserProgressRepository.java index 31d7cbf6..6376ba9d 100644 --- a/src/main/java/gaji/service/domain/room/repository/WeeklyUserProgressRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/WeeklyUserProgressRepository.java @@ -15,12 +15,12 @@ public interface WeeklyUserProgressRepository extends JpaRepository { Optional findByRoomEventAndUser(RoomEvent roomEvent, User user); - @Query("SELECT w.user.name as name, w.progressPercentage as progressPercentage " + + @Query("SELECT w.user.nickname as nickname, w.progressPercentage as progressPercentage " + "FROM WeeklyUserProgress w WHERE w.roomEvent.id = :roomEventId") List findProgressByRoomEventId(@Param("roomEventId") Long roomEventId); interface UserProgressProjection { - String getName(); + String getNickname(); Double getProgressPercentage(); } } diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java index a5b83520..4a9c2d11 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java @@ -89,7 +89,7 @@ public List getUserProgressByRoomEventId(Long r return projections.stream() .map(projection -> RoomResponseDto.UserProgressDTO.builder() - .name(projection.getName()) + .nickname(projection.getNickname()) .progressPercentage(projection.getProgressPercentage()) .build()) .collect(Collectors.toList()); diff --git a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java index 225993af..77b6c177 100644 --- a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java +++ b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java @@ -193,7 +193,7 @@ public void setViewCount(Integer viewCount) { @Getter @Builder public static class UserProgressDTO { - private String name; + private String nickname; private Double progressPercentage; } From a2dec2f6cbba5e579d54a79d194836edce9e88ab Mon Sep 17 00:00:00 2001 From: mmingoo Date: Mon, 19 Aug 2024 21:07:15 +0900 Subject: [PATCH 15/44] =?UTF-8?q?=F0=9F=94=A7=20=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=EC=9D=98=20=EC=9A=94=EA=B5=AC=EB=A1=9C=20access=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=EC=9D=84=20=ED=97=A4=EB=8D=94=EC=97=90=20?= =?UTF-8?q?=EB=8B=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwt/service/CustomSuccessHandler.java | 25 +++++++------------ 1 file changed, 9 insertions(+), 16 deletions(-) diff --git a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java index 7772d92f..5ac27465 100644 --- a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java +++ b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java @@ -60,8 +60,6 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo addRefreshEntity(usernameId, refreshToken, 86400000000L); } - - // Refresh 토큰을 HttpOnly 쿠키로 설정 Cookie refreshTokenCookie = new Cookie("refresh_token", refreshToken); refreshTokenCookie.setHttpOnly(true); @@ -72,31 +70,26 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 1. 헤더로 보낼 경우 -// response.setHeader("Authorization", "Bearer " + accessToken); + response.setHeader("Authorization", "Bearer " + accessToken); // 2. body에 담아서 보낼 경우 Access 토큰을 JSON 응답으로 전송 - Map tokenResponse = new HashMap<>(); - tokenResponse.put("access_token", accessToken); - - response.setContentType(MediaType.APPLICATION_JSON_VALUE); - response.setCharacterEncoding("UTF-8"); - response.getWriter().write(objectMapper.writeValueAsString(tokenResponse)); - response.setStatus(HttpStatus.OK.value()); +// Map tokenResponse = new HashMap<>(); +// tokenResponse.put("access_token", accessToken); +// +// response.setContentType(MediaType.APPLICATION_JSON_VALUE); +// response.setCharacterEncoding("UTF-8"); +// response.getWriter().write(objectMapper.writeValueAsString(tokenResponse)); +// response.setStatus(HttpStatus.OK.value()); // 토큰 로그로 남기기 log.info("accessToken = {}", accessToken); log.info("refreshToken = {}", refreshToken); - String finalRedirectionUrl; - if (customUserDetails.isNewUser()) { - finalRedirectionUrl = this.nicknameRedirectionUrl; + String finalRedirectionUrl = customUserDetails.isNewUser() ? this.nicknameRedirectionUrl : this.redirectionUrl; - } else { - finalRedirectionUrl = this.redirectionUrl; - } // 리다이렉션 URL 생성 From 8f67640a9a0eaba7551a3474180789d7a5b3b659 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Mon, 19 Aug 2024 21:33:12 +0900 Subject: [PATCH 16/44] =?UTF-8?q?=F0=9F=94=A7=20=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=EC=9D=98=20=EC=9A=94=EA=B5=AC=EB=A1=9C=20access=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=20url=EC=97=90=EC=84=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gaji/service/jwt/service/CustomSuccessHandler.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java index 5ac27465..c4c58cb4 100644 --- a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java +++ b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java @@ -92,13 +92,13 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo - // 리다이렉션 URL 생성 - String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) - .queryParam("access_token", accessToken) - .build().toUriString(); +// // 리다이렉션 URL 생성 +// String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) +// .queryParam("access_token", accessToken) +// .build().toUriString(); // 리다이렉션 수행 - getRedirectStrategy().sendRedirect(request, response, targetUrl); + getRedirectStrategy().sendRedirect(request, response, finalRedirectionUrl); } private void addRefreshEntity(String username, String refresh, Long expiredMs) { From d08c6441f9233f339a50d20bab434289d0a9840c Mon Sep 17 00:00:00 2001 From: strongmhk Date: Mon, 19 Aug 2024 22:31:03 +0900 Subject: [PATCH 17/44] =?UTF-8?q?:truck:=20[#97]=20rename:=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD,=20=EC=9D=91=EB=8B=B5=20DTO=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=A4=91=EB=B3=B5=EB=90=98=EC=A7=80=20=EC=95=8A=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../converter/CommunityCommentConverter.java | 5 ++--- .../post/converter/CommunityPostConverter.java | 10 +++++----- .../post/service/CommunityCommentService.java | 4 ++-- .../service/CommunityCommentServiceImpl.java | 4 ++-- .../service/CommunityPostCommandService.java | 6 +++--- .../CommunityPostCommandServiceImpl.java | 6 +++--- .../CommunityPostRestController.java | 18 +++++++++--------- .../dto/CommunityPostCommentResponseDTO.java | 2 +- ...stDTO.java => CommunityPostRequestDTO.java} | 6 +++--- .../post/web/dto/CommunityPostResponseDTO.java | 2 +- .../jwt/service/CustomSuccessHandler.java | 4 ++-- src/main/resources/application-dev.yml | 2 +- 12 files changed, 34 insertions(+), 35 deletions(-) rename src/main/java/gaji/service/domain/post/web/dto/{PostRequestDTO.java => CommunityPostRequestDTO.java} (93%) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java index 9e3ebc75..615ed1d6 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityCommentConverter.java @@ -10,15 +10,14 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; @RequiredArgsConstructor @Component public class CommunityCommentConverter { private final CommunityCommentService communityCommentService; - public static CommunityPostCommentResponseDTO.WriteCommentDTO toWriteCommentDTO(CommunityComment comment) { - return CommunityPostCommentResponseDTO.WriteCommentDTO.builder() + public static CommunityPostCommentResponseDTO.WriteCommentResponseDTO toWriteCommentResponseDTO(CommunityComment comment) { + return CommunityPostCommentResponseDTO.WriteCommentResponseDTO.builder() .commentId(comment.getId()) .build(); } diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index 8cb222d9..baa9bc00 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -18,7 +18,7 @@ import gaji.service.domain.post.service.CommunityPostLikesService; import gaji.service.domain.post.service.CommunityPostQueryService; import gaji.service.domain.post.web.dto.CommunityPostResponseDTO; -import gaji.service.domain.post.web.dto.PostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostRequestDTO; import gaji.service.domain.user.entity.User; import gaji.service.global.converter.DateConverter; import lombok.RequiredArgsConstructor; @@ -44,8 +44,8 @@ public static PostStatusEnum getInitialPostStatus(PostTypeEnum type) { (type == PostTypeEnum.PROJECT) ? PostStatusEnum.RECRUITING : PostStatusEnum.BLOGING; } - public static CommunityPostResponseDTO.UploadPostDTO toUploadPostDTO(CommnuityPost post) { - return CommunityPostResponseDTO.UploadPostDTO + public static CommunityPostResponseDTO.UploadPostResponseDTO toUploadPostResponseDTO(CommnuityPost post) { + return CommunityPostResponseDTO.UploadPostResponseDTO .builder() .postId(post.getId()) .build(); @@ -65,7 +65,7 @@ public static CommunityPostResponseDTO.PostLikesIdDTO toPostLikesIdDTO(PostLikes .build(); } - public static CommnuityPost toPost(PostRequestDTO.UploadPostDTO request, User user) { + public static CommnuityPost toPost(CommunityPostRequestDTO.UploadPostRequestDTO request, User user) { return CommnuityPost.builder() .user(user) .title(request.getTitle()) @@ -77,7 +77,7 @@ public static CommnuityPost toPost(PostRequestDTO.UploadPostDTO request, User us .build(); } - public static CommunityComment toComment(PostRequestDTO.WriteCommentDTO request, User user, CommnuityPost post, CommunityComment parentComment) { + public static CommunityComment toComment(CommunityPostRequestDTO.WriteCommentRequestDTO request, User user, CommnuityPost post, CommunityComment parentComment) { return CommunityComment.builder() .user(user) .post(post) diff --git a/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java b/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java index f2984df7..3f357c77 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityCommentService.java @@ -2,7 +2,7 @@ import gaji.service.domain.post.entity.CommnuityPost; import gaji.service.domain.post.entity.CommunityComment; -import gaji.service.domain.post.web.dto.PostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostRequestDTO; import gaji.service.domain.user.entity.User; import org.springframework.data.domain.Slice; @@ -10,7 +10,7 @@ public interface CommunityCommentService { CommunityComment saveNewComment(CommunityComment comment); - CommunityComment createCommentByCheckParentCommentIdIsNull(Long parentCommentId, PostRequestDTO.WriteCommentDTO request, User findUser, CommnuityPost findPost); + CommunityComment createCommentByCheckParentCommentIdIsNull(Long parentCommentId, CommunityPostRequestDTO.WriteCommentRequestDTO request, User findUser, CommnuityPost findPost); void hardDeleteComment(CommunityComment comment); CommunityComment findByCommentId(Long commentId); Slice getCommentListByPost(Long postId, Integer lastGroupNum, int page, int size); diff --git a/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java index f3341733..9fe9c7c1 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityCommentServiceImpl.java @@ -5,7 +5,7 @@ import gaji.service.domain.post.entity.CommnuityPost; import gaji.service.domain.post.entity.CommunityComment; import gaji.service.domain.post.repository.CommunityCommentJpaRepository; -import gaji.service.domain.post.web.dto.PostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostRequestDTO; import gaji.service.domain.user.entity.User; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; @@ -29,7 +29,7 @@ public CommunityComment saveNewComment(CommunityComment newComment) { @Override @Transactional - public CommunityComment createCommentByCheckParentCommentIdIsNull(Long parentCommentId, PostRequestDTO.WriteCommentDTO request, User findUser, CommnuityPost findPost) { + public CommunityComment createCommentByCheckParentCommentIdIsNull(Long parentCommentId, CommunityPostRequestDTO.WriteCommentRequestDTO request, User findUser, CommnuityPost findPost) { if (parentCommentId != null) { CommunityComment parentComment = findByCommentId(parentCommentId); return CommunityPostConverter.toComment(request, findUser, findPost, parentComment); diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandService.java b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandService.java index 5f653338..ea7ca245 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandService.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandService.java @@ -4,12 +4,12 @@ import gaji.service.domain.post.entity.CommunityComment; import gaji.service.domain.post.entity.PostBookmark; import gaji.service.domain.post.entity.PostLikes; -import gaji.service.domain.post.web.dto.PostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostRequestDTO; public interface CommunityPostCommandService { - CommnuityPost uploadPost(Long userId, PostRequestDTO.UploadPostDTO request); - CommunityComment writeCommentOnCommunityPost(Long userId, Long postId, Long parentCommentId, PostRequestDTO.WriteCommentDTO request); + CommnuityPost uploadPost(Long userId, CommunityPostRequestDTO.UploadPostRequestDTO request); + CommunityComment writeCommentOnCommunityPost(Long userId, Long postId, Long parentCommentId, CommunityPostRequestDTO.WriteCommentRequestDTO request); void hardDeleteComment(Long userId, Long commentId); void hardDeleteCommunityPost(Long userId, Long postId); PostBookmark bookmarkCommunityPost(Long userId, Long postId); diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java index bd37a703..da811376 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java @@ -16,7 +16,7 @@ import gaji.service.domain.post.repository.CommunityPostBookmarkRepository; import gaji.service.domain.post.repository.CommunityPostJpaRepository; import gaji.service.domain.post.repository.CommunityPostLikesRepository; -import gaji.service.domain.post.web.dto.PostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostRequestDTO; import gaji.service.domain.user.entity.User; import gaji.service.domain.user.service.UserQueryService; import lombok.RequiredArgsConstructor; @@ -41,7 +41,7 @@ public class CommunityPostCommandServiceImpl implements CommunityPostCommandServ @Override - public CommnuityPost uploadPost(Long userId, PostRequestDTO.UploadPostDTO request) { + public CommnuityPost uploadPost(Long userId, CommunityPostRequestDTO.UploadPostRequestDTO request) { User findUser = userQueryService.findUserById(userId); CommnuityPost post = CommunityPostConverter.toPost(request, findUser); CommnuityPost newPost = communityPostJpaRepository.save(post); @@ -69,7 +69,7 @@ public CommnuityPost uploadPost(Long userId, PostRequestDTO.UploadPostDTO reques } @Override - public CommunityComment writeCommentOnCommunityPost(Long userId, Long postId, Long parentCommentId, PostRequestDTO.WriteCommentDTO request) { + public CommunityComment writeCommentOnCommunityPost(Long userId, Long postId, Long parentCommentId, CommunityPostRequestDTO.WriteCommentRequestDTO request) { User findUser = userQueryService.findUserById(userId); CommnuityPost findPost = communityPostQueryService.findPostByPostId(postId); diff --git a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java index bece46de..c84b9225 100644 --- a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java +++ b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java @@ -14,7 +14,7 @@ import gaji.service.domain.post.service.CommunityPostQueryService; import gaji.service.domain.post.web.dto.CommunityPostCommentResponseDTO; import gaji.service.domain.post.web.dto.CommunityPostResponseDTO; -import gaji.service.domain.post.web.dto.PostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostRequestDTO; import gaji.service.global.base.BaseResponse; import gaji.service.jwt.service.TokenProviderService; import io.swagger.v3.oas.annotations.Operation; @@ -41,11 +41,11 @@ public class CommunityPostRestController { @PostMapping @Operation(summary = "커뮤니티 게시글 업로드 API", description = "커뮤니티의 게시글을 업로드하는 API입니다. 게시글 유형과 제목, 본문 내용을 검증합니다.") - public BaseResponse uploadPost(@RequestHeader("Authorization") String authorizationHeader, - @RequestBody @Valid PostRequestDTO.UploadPostDTO request) { + public BaseResponse uploadPost(@RequestHeader("Authorization") String authorizationHeader, + @RequestBody @Valid CommunityPostRequestDTO.UploadPostRequestDTO request) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); CommnuityPost newPost = communityPostCommandService.uploadPost(userId, request); - return BaseResponse.onSuccess(CommunityPostConverter.toUploadPostDTO(newPost)); + return BaseResponse.onSuccess(CommunityPostConverter.toUploadPostResponseDTO(newPost)); } @DeleteMapping("/{postId}") @@ -106,13 +106,13 @@ public BaseResponse getPostPreivewL @Parameter(name = "postId", description = "게시글 id"), @Parameter(name = "parentCommentId", description = "부모 댓글의 id, 대댓글 작성할 때 필요한 부모 댓글의 id입니다."), }) - public BaseResponse writeCommentOnCommunityPost(@RequestHeader("Authorization") String authorizationHeader, - @Min(value = 1, message = "postId는 1 이상 이어야 합니다.") @PathVariable Long postId, - @Min(value = 1, message = "parentCommentId는 1 이상 이어야 합니다.") @RequestParam(required = false) Long parentCommentId, - @RequestBody @Valid PostRequestDTO.WriteCommentDTO request) { + public BaseResponse writeCommentOnCommunityPost(@RequestHeader("Authorization") String authorizationHeader, + @Min(value = 1, message = "postId는 1 이상 이어야 합니다.") @PathVariable Long postId, + @Min(value = 1, message = "parentCommentId는 1 이상 이어야 합니다.") @RequestParam(required = false) Long parentCommentId, + @RequestBody @Valid CommunityPostRequestDTO.WriteCommentRequestDTO request) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); CommunityComment newComment = communityPostCommandService.writeCommentOnCommunityPost(userId, postId, parentCommentId, request); - return BaseResponse.onSuccess(CommunityCommentConverter.toWriteCommentDTO(newComment)); + return BaseResponse.onSuccess(CommunityCommentConverter.toWriteCommentResponseDTO(newComment)); } @DeleteMapping("/comments/{commentId}") diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java index 98b2c520..890026f3 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostCommentResponseDTO.java @@ -14,7 +14,7 @@ public class CommunityPostCommentResponseDTO { @Getter @NoArgsConstructor @AllArgsConstructor - public static class WriteCommentDTO { + public static class WriteCommentResponseDTO { private Long commentId; } diff --git a/src/main/java/gaji/service/domain/post/web/dto/PostRequestDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostRequestDTO.java similarity index 93% rename from src/main/java/gaji/service/domain/post/web/dto/PostRequestDTO.java rename to src/main/java/gaji/service/domain/post/web/dto/CommunityPostRequestDTO.java index ef938b35..ecfe060c 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/PostRequestDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostRequestDTO.java @@ -12,12 +12,12 @@ import java.util.ArrayList; import java.util.List; -public class PostRequestDTO { +public class CommunityPostRequestDTO { @Schema(description = "커뮤니티 게시글 저장 DTO") @Getter @RequiredArgsConstructor - public static class UploadPostDTO { + public static class UploadPostRequestDTO { @Schema(description = "게시글 제목") @NotBlank(message = "게시글 제목을 입력해주세요.") private final String title; @@ -46,7 +46,7 @@ public static class UploadPostDTO { @Schema(description = "커뮤니티 게시글 댓글 작성 DTO") @Getter @RequiredArgsConstructor - public static class WriteCommentDTO { + public static class WriteCommentRequestDTO { @Schema(description = "댓글 본문") @NotBlank(message = "댓글 본문을 입력해주세요.") private String body; diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java index a92b694b..3abc433b 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java @@ -18,7 +18,7 @@ public class CommunityPostResponseDTO { @Getter @NoArgsConstructor @AllArgsConstructor - public static class UploadPostDTO { + public static class UploadPostResponseDTO { Long postId; } diff --git a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java index c10a3266..0d57ca0b 100644 --- a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java +++ b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java @@ -86,13 +86,13 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo log.info("accessToken = {}", accessToken); log.info("refreshToken = {}", refreshToken); - // 리다이렉션 URL 생성 + /*// 리다이렉션 URL 생성 String targetUrl = UriComponentsBuilder.fromUriString(redirectionUrl) .queryParam("access_token", accessToken) .build().toUriString(); // 리다이렉션 수행 - getRedirectStrategy().sendRedirect(request, response, targetUrl); + getRedirectStrategy().sendRedirect(request, response, targetUrl);*/ } private void addRefreshEntity(String username, String refresh, Long expiredMs) { diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index d131c545..0f4bfc41 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 8000 + port: 8080 spring: application: From e10ff32a580705730dad9734fdc11568bc60c2a8 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Tue, 20 Aug 2024 13:38:32 +0900 Subject: [PATCH 18/44] =?UTF-8?q?=F0=9F=94=A7=20=20=ED=94=84=EB=A1=A0?= =?UTF-8?q?=ED=8A=B8=EC=9D=98=20=EC=9A=94=EA=B5=AC=EB=A1=9C=20access=20?= =?UTF-8?q?=ED=86=A0=ED=81=B0=EC=9D=84=20=EC=BF=BC=EB=A6=AC=EC=97=90=20?= =?UTF-8?q?=EB=8B=B4=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jwt/service/CustomSuccessHandler.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java index c4c58cb4..b7721643 100644 --- a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java +++ b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java @@ -75,13 +75,13 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 2. body에 담아서 보낼 경우 Access 토큰을 JSON 응답으로 전송 -// Map tokenResponse = new HashMap<>(); -// tokenResponse.put("access_token", accessToken); -// -// response.setContentType(MediaType.APPLICATION_JSON_VALUE); -// response.setCharacterEncoding("UTF-8"); -// response.getWriter().write(objectMapper.writeValueAsString(tokenResponse)); -// response.setStatus(HttpStatus.OK.value()); + Map tokenResponse = new HashMap<>(); + tokenResponse.put("access_token", accessToken); + + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(objectMapper.writeValueAsString(tokenResponse)); + response.setStatus(HttpStatus.OK.value()); // 토큰 로그로 남기기 log.info("accessToken = {}", accessToken); @@ -93,12 +93,12 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // // 리다이렉션 URL 생성 -// String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) -// .queryParam("access_token", accessToken) -// .build().toUriString(); + String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) + .queryParam("access_token", accessToken) + .build().toUriString(); // 리다이렉션 수행 - getRedirectStrategy().sendRedirect(request, response, finalRedirectionUrl); + getRedirectStrategy().sendRedirect(request, response, targetUrl); } private void addRefreshEntity(String username, String refresh, Long expiredMs) { From 09ce0af9329f2a49359da59d8ca562bb1955a222 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Tue, 20 Aug 2024 15:22:57 +0900 Subject: [PATCH 19/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=EC=A3=BC=EC=B0=A8?= =?UTF-8?q?=EB=B3=84=20=EC=A7=84=ED=96=89=EC=9C=A8=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 조회는 roomEventId로 쿼리하는 것이었음. roomId, eventId로 roomEventId를 조회해서 해당 기능이 작동하게끔 수정 --- .../domain/room/service/RoomQueryService.java | 3 +-- .../domain/room/service/RoomQueryServiceImpl.java | 12 ++++++++---- .../room/web/controller/RoomMainController.java | 8 +++++--- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java index 2e26d487..5f86cdf2 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java @@ -20,8 +20,7 @@ public interface RoomQueryService { @Transactional(readOnly = true) RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomEventId); - @Transactional(readOnly = true) - List getUserProgressByRoomEventId(Long roomEventId); + List getUserProgressByRoomEventId(Long roomId, Integer weeks); RoomResponseDto.RoomMainDto getMainStudyRoom(Long roomId); diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java index 4a9c2d11..0a5ef939 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java @@ -8,6 +8,7 @@ import gaji.service.domain.room.web.dto.RoomResponseDto; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; +import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.webjars.NotFoundException; @@ -26,8 +27,9 @@ public class RoomQueryServiceImpl implements RoomQueryService { private final RoomQueryRepository roomQueryRepository; private final WeeklyUserProgressRepository weeklyUserProgressRepository; private final NoticeConfirmationRepository noticeConfirmationRepository; + private final WebInvocationPrivilegeEvaluator privilegeEvaluator; -// @Override + // @Override // public RoomEvent findRoomEventById(Long roomId){ // return roomEventRepository.findRoomEventById(roomId) // .orElseThrow(() -> new RestApiException(RoomErrorStatus._ROOM_EVENT_NOT_FOUND)); @@ -83,9 +85,11 @@ public RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomEventId) { } @Override - public List getUserProgressByRoomEventId(Long roomEventId) { - List projections = - weeklyUserProgressRepository.findProgressByRoomEventId(roomEventId); + public List getUserProgressByRoomEventId(Long roomId, Integer weeks) { + RoomEvent roomEvent = roomEventRepository.findRoomEventByRoomIdAndWeeks(roomId, weeks) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._ROOM_EVENT_NOT_FOUND)); + List projections = + weeklyUserProgressRepository.findProgressByRoomEventId(roomEvent.getId()); return projections.stream() .map(projection -> RoomResponseDto.UserProgressDTO.builder() diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java index 3b377ddf..360243d3 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java @@ -87,10 +87,12 @@ public ResponseEntity toggleAssignmentCompletion( // 수정 필요 //특정 스터디룸의 모든 사용자의 진행 상황을 조회합니다 - @GetMapping("/{roomEventId}/progress") + @GetMapping("/{roomId}/{weeks}/progress") @Operation(summary = "주차별 과제 진행율", description = "특정 스터디룸의 모든 사용자의 진행 상황을 조회합니다.") - public ResponseEntity> getStudyMateProgress(@PathVariable Long roomEventId) { - List progressList = roomQueryService.getUserProgressByRoomEventId(roomEventId); + public ResponseEntity> getStudyMateProgress( + @PathVariable Long roomId, + @PathVariable Integer weeks) { + List progressList = roomQueryService.getUserProgressByRoomEventId(roomId, weeks); return ResponseEntity.ok(progressList); } From 7ebbcde92c398fbe79143c25bc22d85d095547d3 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Tue, 20 Aug 2024 15:25:48 +0900 Subject: [PATCH 20/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=EC=A3=BC=EC=B0=A8?= =?UTF-8?q?=EB=B3=84=20=EC=8A=A4=ED=84=B0=EB=94=94=20=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 조회는 roomEventId로 쿼리하는 것이었음. roomId, eventId로 roomEventId를 조회해서 해당 기능이 작동하게끔 수정 --- .../service/domain/room/service/RoomQueryService.java | 2 +- .../service/domain/room/service/RoomQueryServiceImpl.java | 5 +++-- .../domain/room/web/controller/RoomMainController.java | 8 +++++--- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java index 5f86cdf2..bd629151 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java @@ -18,7 +18,7 @@ public interface RoomQueryService { RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId); @Transactional(readOnly = true) - RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomEventId); + RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomId, Integer weeks); List getUserProgressByRoomEventId(Long roomId, Integer weeks); diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java index 0a5ef939..eccf4293 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java @@ -72,8 +72,8 @@ public RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId) { @Override @Transactional(readOnly = true) - public RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomEventId) { - RoomEvent roomEvent = roomEventRepository.findById(roomEventId) + public RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomId, Integer weeks) { + RoomEvent roomEvent = roomEventRepository.findRoomEventByRoomIdAndWeeks(roomId, weeks) .orElseThrow(() -> new RestApiException(RoomErrorStatus._ROOM_EVENT_NOT_FOUND)); return RoomResponseDto.WeeklyStudyInfoDTO.builder() @@ -88,6 +88,7 @@ public RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomEventId) { public List getUserProgressByRoomEventId(Long roomId, Integer weeks) { RoomEvent roomEvent = roomEventRepository.findRoomEventByRoomIdAndWeeks(roomId, weeks) .orElseThrow(() -> new RestApiException(RoomErrorStatus._ROOM_EVENT_NOT_FOUND)); + List projections = weeklyUserProgressRepository.findProgressByRoomEventId(roomEvent.getId()); diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java index 360243d3..54dcab95 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomMainController.java @@ -96,10 +96,12 @@ public ResponseEntity> getStudyMateProgres return ResponseEntity.ok(progressList); } - @GetMapping("/events/{roomEventId}/weekly-info") + @GetMapping("/events/{roomId}/{weeks}/weekly-info") @Operation(summary = "주차별 스터디 정보", description = "특정 주차의 스터디 정보를 조회합니다.") - public ResponseEntity getWeeklyStudyInfo(@PathVariable Long roomEventId) { - RoomResponseDto.WeeklyStudyInfoDTO weeklyInfo = roomQueryService.getWeeklyStudyInfo(roomEventId); + public ResponseEntity getWeeklyStudyInfo( + @PathVariable Long roomId, + @PathVariable Integer weeks) { + RoomResponseDto.WeeklyStudyInfoDTO weeklyInfo = roomQueryService.getWeeklyStudyInfo(roomId, weeks); return ResponseEntity.ok(weeklyInfo); } From 4822e121402bea7fd4f33fb9985c0a07fcdff05a Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 15:30:33 +0900 Subject: [PATCH 21/44] =?UTF-8?q?:sparkles:=20Feat:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20Enum=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/gaji/service/global/enums/Category.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/main/java/gaji/service/global/enums/Category.java diff --git a/src/main/java/gaji/service/global/enums/Category.java b/src/main/java/gaji/service/global/enums/Category.java new file mode 100644 index 00000000..bc4cd85c --- /dev/null +++ b/src/main/java/gaji/service/global/enums/Category.java @@ -0,0 +1,13 @@ +package gaji.service.global.enums; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +public enum Category { + DEVELOPMENT("개발"), AI("인공지능"), HARDWORE("하드웨어"), SECURITY("보안") + , NETWORK_CLOUD("네트워크-클라우드"), LANGUAGE("어학"), DESIGN("디자인") + , PM("비즈니스-PM"), BOOK("독서"), ETC("기타"); + private final String category; +} From a4a4b00cb43ca64dc547eebd4c6319a33a5f6052 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 15:57:26 +0900 Subject: [PATCH 22/44] =?UTF-8?q?:sparkles:=20Feat:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20Enum=20value=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gaji/service/domain/enums/CategoryEnum.java | 5 +++-- .../java/gaji/service/global/enums/Category.java | 13 ------------- 2 files changed, 3 insertions(+), 15 deletions(-) delete mode 100644 src/main/java/gaji/service/global/enums/Category.java diff --git a/src/main/java/gaji/service/domain/enums/CategoryEnum.java b/src/main/java/gaji/service/domain/enums/CategoryEnum.java index 8ba1882a..ac638bca 100644 --- a/src/main/java/gaji/service/domain/enums/CategoryEnum.java +++ b/src/main/java/gaji/service/domain/enums/CategoryEnum.java @@ -14,11 +14,12 @@ public enum CategoryEnum { AI("인공지능"), HW("하드웨어"), SECURITY("보안"), - NETWORK("클라우드 네트워크"), + NETWORK("클라우드-네트워크"), LANGUAGE("어학"), DESIGN("디자인"), BUSINESS("비즈니스"), - BOOK("독서 모임"); + BOOK("독서"), + ETC("기타"); @JsonValue private final String value; diff --git a/src/main/java/gaji/service/global/enums/Category.java b/src/main/java/gaji/service/global/enums/Category.java deleted file mode 100644 index bc4cd85c..00000000 --- a/src/main/java/gaji/service/global/enums/Category.java +++ /dev/null @@ -1,13 +0,0 @@ -package gaji.service.global.enums; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@Getter -@RequiredArgsConstructor -public enum Category { - DEVELOPMENT("개발"), AI("인공지능"), HARDWORE("하드웨어"), SECURITY("보안") - , NETWORK_CLOUD("네트워크-클라우드"), LANGUAGE("어학"), DESIGN("디자인") - , PM("비즈니스-PM"), BOOK("독서"), ETC("기타"); - private final String category; -} From faf52b27e86eea0c5a24d425d82fc0fc6f50fb65 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 16:00:11 +0900 Subject: [PATCH 23/44] =?UTF-8?q?:recycle:=20Refactor:=20post=20=EB=B6=80?= =?UTF-8?q?=EB=B6=84=20=EC=B9=B4=ED=85=8C=EA=B3=A0=EB=A6=AC=20string?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=A3=BC=EA=B3=A0=20=EB=B0=9B=EA=B8=B0=20?= =?UTF-8?q?=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/domain/common/service/CategoryService.java | 1 + .../domain/post/converter/CommunityPostConverter.java | 4 +++- .../post/service/CommunityPostCommandServiceImpl.java | 8 +++++--- .../post/web/controller/CommunityPostRestController.java | 7 ++++++- .../domain/post/web/dto/CommunityPostResponseDTO.java | 1 + .../gaji/service/domain/post/web/dto/PostRequestDTO.java | 2 +- 6 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/gaji/service/domain/common/service/CategoryService.java b/src/main/java/gaji/service/domain/common/service/CategoryService.java index c3b23be7..a7952c01 100644 --- a/src/main/java/gaji/service/domain/common/service/CategoryService.java +++ b/src/main/java/gaji/service/domain/common/service/CategoryService.java @@ -21,5 +21,6 @@ public interface CategoryService { void saveAllSelectCategory(List selectCategoryList); SelectCategory findByEntityIdAndType(Long entityId, PostTypeEnum type); + } diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index 7c35cc03..25d65f75 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -1,6 +1,7 @@ package gaji.service.domain.post.converter; import gaji.service.domain.common.converter.HashtagConverter; +import gaji.service.domain.common.entity.SelectCategory; import gaji.service.domain.common.entity.SelectHashtag; import gaji.service.domain.common.service.HashtagService; import gaji.service.domain.common.web.dto.HashtagResponseDTO; @@ -123,7 +124,7 @@ public CommunityPostResponseDTO.PostPreviewListDTO toPostPreviewListDTO(List selectHashtagList = hashtagService.findAllFetchJoinWithHashtagByEntityIdAndPostType(post.getId(), post.getType()); List hashtagNameAndIdDTOList = HashtagConverter.toHashtagNameAndIdDTOList(selectHashtagList); boolean isBookmarked = (userId == null) ? false : postBookMarkService.existsByUserAndPost(userId, post); @@ -141,6 +142,7 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post .isBookMarked(isBookmarked) .isLiked(isLiked) .body(post.getBody()) + .category(selectCategory.getCategory().getCategory().getValue()) .build(); } } diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java index 1a1deb98..eed1ff6d 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java @@ -8,6 +8,7 @@ import gaji.service.domain.common.entity.SelectHashtag; import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.common.service.HashtagService; +import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.post.converter.CommunityPostConverter; import gaji.service.domain.post.entity.CommnuityPost; import gaji.service.domain.post.entity.CommunityComment; @@ -57,9 +58,10 @@ public CommnuityPost uploadPost(Long userId, PostRequestDTO.UploadPostDTO reques } // SelectCategory 저장 - if (request.getCategoryId() != null) { - Long categoryId = request.getCategoryId(); - Category findCateogry = categoryService.findByCategoryId(categoryId); + if (request.getCategory() != null) { + String categoryValue = request.getCategory(); + //Category findCateogry = categoryService.findByCategoryId(categoryId); + Category findCateogry = categoryService.findByCategory(CategoryEnum.valueOf(categoryValue)); SelectCategory selectCategory = CategoryConverter.toSelectCategory(findCateogry, newPost.getId(), newPost.getType()); categoryService.saveSelectCategory(selectCategory); diff --git a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java index 42fb4b60..005c2b40 100644 --- a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java +++ b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java @@ -1,5 +1,7 @@ package gaji.service.domain.post.web.controller; +import gaji.service.domain.common.entity.SelectCategory; +import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.enums.PostStatusEnum; import gaji.service.domain.enums.PostTypeEnum; import gaji.service.domain.enums.SortType; @@ -38,6 +40,8 @@ public class CommunityPostRestController { private final TokenProviderService tokenProviderService; private final CommunityPostConverter communityPostConverter; + private final CategoryService categoryService; + @PostMapping @Operation(summary = "커뮤니티 게시글 업로드 API", description = "커뮤니티의 게시글을 업로드하는 API입니다. 게시글 유형과 제목, 본문 내용을 검증합니다.") public BaseResponse uploadPost(@RequestHeader("Authorization") String authorizationHeader, @@ -68,7 +72,8 @@ public BaseResponse getPostDetail(@Min(v @RequestHeader(value = "Authorization", required = false) String authorizationHeader) { Long userId = (authorizationHeader == null) ? null : tokenProviderService.getUserIdFromToken(authorizationHeader); CommnuityPost post = communityPostQueryService.getPostDetail(postId); - return BaseResponse.onSuccess(communityPostConverter.toPostDetailDTO(post, userId)); + SelectCategory category = categoryService.findByEntityIdAndType(post.getId(), post.getType()); + return BaseResponse.onSuccess(communityPostConverter.toPostDetailDTO(post, userId, category)); } @GetMapping("/preivew") diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java index 11db2441..63fd7f4f 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java @@ -79,6 +79,7 @@ public static class PostDetailDTO { private boolean isBookMarked; private boolean isLiked; private String body; + private String category; private List hashtagList = new ArrayList<>(); } diff --git a/src/main/java/gaji/service/domain/post/web/dto/PostRequestDTO.java b/src/main/java/gaji/service/domain/post/web/dto/PostRequestDTO.java index ef938b35..76774691 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/PostRequestDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/PostRequestDTO.java @@ -40,7 +40,7 @@ public static class UploadPostDTO { @Schema(description = "카테고리의 id") // TODO: 카테고리 존재 여부 검증 애노테이션 적용 - private final Long categoryId; + private final String category; } @Schema(description = "커뮤니티 게시글 댓글 작성 DTO") From 514a67f15f8ec1c0accc26030c7ed89c1f119df5 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 16:25:26 +0900 Subject: [PATCH 24/44] =?UTF-8?q?:recycle:=20Refactor:=20post=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=88=98,=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=88=98=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 --- .../service/domain/post/converter/CommunityPostConverter.java | 2 ++ .../service/domain/post/web/dto/CommunityPostResponseDTO.java | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index 25d65f75..d3653220 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -135,6 +135,8 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post .type(post.getType()) .createdAt(DateConverter.convertWriteTimeFormat(LocalDate.from(post.getCreatedAt()), "")) .hit(post.getHit()) + .likeCnt(post.getLikeCnt()) + .bookmarkCnt(post.getBookmarkCnt()) .commentCnt(post.getCommentCnt()) .userNickname(post.getUser().getNickname()) .title(post.getTitle()) diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java index 63fd7f4f..fb5c5cbe 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java @@ -73,6 +73,8 @@ public static class PostDetailDTO { private PostTypeEnum type; private String createdAt; private int hit; + private int likeCnt; + private int bookmarkCnt; private int commentCnt; private String userNickname; private String title; From 88846f935daf94d934c483aee7dd018ad0ae5c5b Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 16:32:51 +0900 Subject: [PATCH 25/44] =?UTF-8?q?:recycle:=20Refactor:=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=EC=9D=98=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=A2=8B?= =?UTF-8?q?=EC=95=84=EC=9A=94=20=EC=83=81=ED=83=9C=20isLiked=20->=20likeSt?= =?UTF-8?q?atus=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/domain/post/converter/CommunityPostConverter.java | 4 ++-- .../service/domain/post/web/dto/CommunityPostResponseDTO.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index d3653220..e5ca687a 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -141,8 +141,8 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post .userNickname(post.getUser().getNickname()) .title(post.getTitle()) .hashtagList(hashtagNameAndIdDTOList) - .isBookMarked(isBookmarked) - .isLiked(isLiked) + .bookMarkStatus(isBookmarked) + .likedStatus(isLiked) .body(post.getBody()) .category(selectCategory.getCategory().getCategory().getValue()) .build(); diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java index fb5c5cbe..4b46df73 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java @@ -78,8 +78,8 @@ public static class PostDetailDTO { private int commentCnt; private String userNickname; private String title; - private boolean isBookMarked; - private boolean isLiked; + private boolean bookMarkStatus; + private boolean likeStatus; private String body; private String category; private List hashtagList = new ArrayList<>(); From 1a82a343d8c11f2a8d4b0c32ddfed53eda14e933 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 17:03:54 +0900 Subject: [PATCH 26/44] =?UTF-8?q?:recycle:=20Refactor:=20likedStatus->like?= =?UTF-8?q?Status=EB=A1=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/domain/post/converter/CommunityPostConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index e5ca687a..e18ecc84 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -142,7 +142,7 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post .title(post.getTitle()) .hashtagList(hashtagNameAndIdDTOList) .bookMarkStatus(isBookmarked) - .likedStatus(isLiked) + .likeStatus(isLiked) .body(post.getBody()) .category(selectCategory.getCategory().getCategory().getValue()) .build(); From 626326ec8d88b7c4d63b83c9a9b5c5174371f610 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 17:04:41 +0900 Subject: [PATCH 27/44] =?UTF-8?q?:sparkles:=20Feat:=20api=20=EC=9D=91?= =?UTF-8?q?=EB=8B=B5=EC=97=90=20=EC=9C=A0=EC=A0=80=EC=9D=98=20=EC=A2=8B?= =?UTF-8?q?=EC=95=84=EC=9A=94,=20=EB=B6=81=EB=A7=88=ED=81=AC=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=EB=B0=98=ED=99=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/recruit/converter/RecruitConverter.java | 8 +++++--- .../domain/recruit/service/RecruitCommandService.java | 5 +++++ .../recruit/service/RecruitCommandServiceImpl.java | 10 ++++++++++ .../recruit/service/RecruitQueryServiceImpl.java | 5 ++++- .../domain/recruit/web/dto/RecruitResponseDTO.java | 6 ++++-- .../service/domain/room/service/RoomQueryService.java | 1 + .../domain/room/service/RoomQueryServiceImpl.java | 1 + 7 files changed, 30 insertions(+), 6 deletions(-) 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 98effcf4..9ef5031a 100644 --- a/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java +++ b/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java @@ -67,7 +67,7 @@ public static StudyMate toStudyMate(User user, Room room, Role role) { .build(); } - public static RecruitResponseDTO.studyDetailResponseDTO toStudyDetailDTO(User user, Room room, CategoryEnum category) { + public static RecruitResponseDTO.studyDetailResponseDTO toStudyDetailDTO(User user, Room room, CategoryEnum category, boolean likeStatus, boolean bookmarkStatus) { return RecruitResponseDTO.studyDetailResponseDTO.builder() .userNickName(user.getNickname()) .userActive(user.getStatus()) @@ -79,8 +79,10 @@ public static RecruitResponseDTO.studyDetailResponseDTO toStudyDetailDTO(User us .recruitPostTypeEnum(room.getRecruitPostTypeEnum()) .studyCategory(category) .views(room.getViews()) - .likes(room.getLikes()) - .bookmarks(room.getBookmarks()) + .likeCnt(room.getLikes()) + .bookmarkCnt(room.getBookmarks()) + .likeStatus(likeStatus) + .bookmarkStatus(bookmarkStatus) .recruitStartTime(room.getRecruitStartDay()) .recruitEndTime(room.getRecruitEndDay()) 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 5767705f..241b50bf 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java @@ -2,6 +2,8 @@ import gaji.service.domain.recruit.web.dto.RecruitRequestDTO; import gaji.service.domain.recruit.web.dto.RecruitResponseDTO; +import gaji.service.domain.room.entity.Room; +import gaji.service.domain.user.entity.User; public interface RecruitCommandService { @@ -20,4 +22,7 @@ public interface RecruitCommandService { void leaveStudy(Long userId, Long roomId); void kickStudy(Long userId, Long roomId, Long targetId); + + boolean userLikeStatus(Room room, User user); + boolean userBookmarkStatus(Room room, User user); } 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 11f92080..0634a976 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -220,4 +220,14 @@ public void kickStudy(Long userId, Long roomId, Long targetId) { studyMateCommandService.deleteByUserAndRoom(target, room); } } + + @Override + public boolean userLikeStatus(Room room, User user) { + return recruitPostLikesRepository.existsByUserAndRoom(user, room); + } + + @Override + public boolean userBookmarkStatus(Room room, User user){ + return recruitPostBookmarkRepository.existsByUserAndRoom(user, room); + } } diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java index f11edcb6..3188d8da 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java @@ -35,6 +35,7 @@ public class RecruitQueryServiceImpl implements RecruitQueryService { private final RoomCommandService roomCommandService; private final CategoryService categoryService; private final RecruitRepository recruitRepository; + private final RecruitCommandService recruitCommandService; @Override @Transactional @@ -42,6 +43,8 @@ public RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId) { Room room = roomQueryService.findRoomById(roomId); User user = userQueryService.findUserById(room.getUser().getId()); + boolean likeStatus = recruitCommandService.userLikeStatus(room, user); + boolean bookmarkStatus = recruitCommandService.userBookmarkStatus(room, user); room.addView(); roomCommandService.saveRoom(room); @@ -51,7 +54,7 @@ public RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId) { CategoryEnum category = RecruitConverter.toCategory(selectCategory); - return RecruitConverter.toStudyDetailDTO(user, room, category); + return RecruitConverter.toStudyDetailDTO(user, room, category, likeStatus, bookmarkStatus); } @Override 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 01701b3d..7b988d3e 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 @@ -38,8 +38,10 @@ public static class studyDetailResponseDTO { RecruitPostTypeEnum recruitPostTypeEnum; CategoryEnum studyCategory; int views; - int likes; - int bookmarks; + int likeCnt; + int bookmarkCnt; + Boolean likeStatus; + Boolean bookmarkStatus; LocalDate recruitStartTime; LocalDate recruitEndTime; diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java index bd629151..9c4cc63c 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java @@ -3,6 +3,7 @@ import gaji.service.domain.room.entity.Room; import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.web.dto.RoomResponseDto; +import gaji.service.domain.user.entity.User; import org.springframework.transaction.annotation.Transactional; import java.util.List; diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java index eccf4293..492f2a3a 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java @@ -6,6 +6,7 @@ import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.repository.*; import gaji.service.domain.room.web.dto.RoomResponseDto; +import gaji.service.domain.user.entity.User; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator; From a9780c6c341631c2649372532933390719e56c3a Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 17:16:11 +0900 Subject: [PATCH 28/44] =?UTF-8?q?:sparkles:=20Feat:=20value=EB=A1=9C=20Cat?= =?UTF-8?q?egoryEnum=20=EB=B3=80=ED=99=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/gaji/service/domain/enums/CategoryEnum.java | 11 ++++++++++- .../post/service/CommunityPostCommandServiceImpl.java | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/gaji/service/domain/enums/CategoryEnum.java b/src/main/java/gaji/service/domain/enums/CategoryEnum.java index ac638bca..114efe0d 100644 --- a/src/main/java/gaji/service/domain/enums/CategoryEnum.java +++ b/src/main/java/gaji/service/domain/enums/CategoryEnum.java @@ -14,7 +14,7 @@ public enum CategoryEnum { AI("인공지능"), HW("하드웨어"), SECURITY("보안"), - NETWORK("클라우드-네트워크"), + NETWORK("네트워크-클라우드"), LANGUAGE("어학"), DESIGN("디자인"), BUSINESS("비즈니스"), @@ -38,4 +38,13 @@ public static CategoryEnum from(String param) { log.error("CategoryEnum.from() exception occur param: {}", param); throw new RestApiException(GlobalErrorStatus._INVALID_CATEGORY); } + + public static CategoryEnum fromValue(String value) { + for (CategoryEnum category : CategoryEnum.values()) { + if (category.value.equals(value)) { + return category; + } + } + throw new IllegalArgumentException("Unknown category: " + value); + } } \ No newline at end of file diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java index eed1ff6d..d3bc34ce 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java @@ -61,7 +61,7 @@ public CommnuityPost uploadPost(Long userId, PostRequestDTO.UploadPostDTO reques if (request.getCategory() != null) { String categoryValue = request.getCategory(); //Category findCateogry = categoryService.findByCategoryId(categoryId); - Category findCateogry = categoryService.findByCategory(CategoryEnum.valueOf(categoryValue)); + Category findCateogry = categoryService.findByCategory(CategoryEnum.fromValue(categoryValue)); SelectCategory selectCategory = CategoryConverter.toSelectCategory(findCateogry, newPost.getId(), newPost.getType()); categoryService.saveSelectCategory(selectCategory); From 7d61aaa82ba3f8ac99958117187741ea3edb6ca8 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 17:29:40 +0900 Subject: [PATCH 29/44] =?UTF-8?q?:sparkles:=20Feat:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20=ED=95=98=EB=82=98=20=EA=B0=80=EC=A0=B8?= =?UTF-8?q?=EC=98=A4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/common/repository/CategoryRepository.java | 3 +++ .../gaji/service/domain/common/service/CategoryService.java | 2 ++ .../service/domain/common/service/CategoryServiceImpl.java | 6 ++++++ .../post/service/CommunityPostCommandServiceImpl.java | 6 +++--- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/gaji/service/domain/common/repository/CategoryRepository.java b/src/main/java/gaji/service/domain/common/repository/CategoryRepository.java index b78207cb..640af22f 100644 --- a/src/main/java/gaji/service/domain/common/repository/CategoryRepository.java +++ b/src/main/java/gaji/service/domain/common/repository/CategoryRepository.java @@ -4,8 +4,11 @@ import gaji.service.domain.enums.CategoryEnum; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface CategoryRepository extends JpaRepository { Category findByCategory(CategoryEnum category); boolean existsByCategory(CategoryEnum category); boolean existsById(Long id); + List findAllByCategory(CategoryEnum category); } diff --git a/src/main/java/gaji/service/domain/common/service/CategoryService.java b/src/main/java/gaji/service/domain/common/service/CategoryService.java index a7952c01..e5b6e304 100644 --- a/src/main/java/gaji/service/domain/common/service/CategoryService.java +++ b/src/main/java/gaji/service/domain/common/service/CategoryService.java @@ -22,5 +22,7 @@ public interface CategoryService { SelectCategory findByEntityIdAndType(Long entityId, PostTypeEnum type); + List findAllByCategory(CategoryEnum category); + } diff --git a/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java b/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java index d0a3a561..639789ac 100644 --- a/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java +++ b/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java @@ -39,6 +39,12 @@ public Category findByCategory(CategoryEnum category) { return categoryRepository.findByCategory(category); } + //todo: 나중에 카테고리 DB에 통일 하면 지워야함 + @Override + public List findAllByCategory(CategoryEnum category) { + return categoryRepository.findAllByCategory(category); + } + @Override public Category findByCategoryId(Long categoryId) { return categoryRepository.findById(categoryId) diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java index d3bc34ce..4ac99b6c 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostCommandServiceImpl.java @@ -60,10 +60,10 @@ public CommnuityPost uploadPost(Long userId, PostRequestDTO.UploadPostDTO reques // SelectCategory 저장 if (request.getCategory() != null) { String categoryValue = request.getCategory(); - //Category findCateogry = categoryService.findByCategoryId(categoryId); - Category findCateogry = categoryService.findByCategory(CategoryEnum.fromValue(categoryValue)); + //Category findCategry = categoryService.findByCategoryId(categoryId); + Category findCategory = categoryService.findAllByCategory(CategoryEnum.fromValue(categoryValue)).get(0); - SelectCategory selectCategory = CategoryConverter.toSelectCategory(findCateogry, newPost.getId(), newPost.getType()); + SelectCategory selectCategory = CategoryConverter.toSelectCategory(findCategory, newPost.getId(), newPost.getType()); categoryService.saveSelectCategory(selectCategory); } From 266605afd8ad656dc6eb36fe21aad7fd91e70e90 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 17:50:10 +0900 Subject: [PATCH 30/44] =?UTF-8?q?:sparkles:=20Feat:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20String=EB=A1=9C=20=EB=B0=9B=EA=B8=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=9E=84=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/service/CommunityPostQueryService.java | 2 +- .../post/service/CommunityPostQueryServiceImpl.java | 9 +++++++-- .../web/controller/CommunityPostRestController.java | 4 ++-- .../domain/recruit/service/RecruitQueryService.java | 2 +- .../recruit/service/RecruitQueryServiceImpl.java | 12 ++++++------ .../recruit/web/controller/RecruitController.java | 4 ++-- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java index fb000603..4237f162 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryService.java @@ -15,7 +15,7 @@ Slice getPostList(Integer lastPopularityScore, Integer lastLikeCnt, Integer lastHit, PostTypeEnum postType, - Long categoryId, + String category, SortType sortType, PostStatusEnum filter, int page, diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java index 275b48dd..cd197626 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java @@ -1,5 +1,7 @@ package gaji.service.domain.post.service; +import gaji.service.domain.common.service.CategoryService; +import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostStatusEnum; import gaji.service.domain.enums.PostTypeEnum; import gaji.service.domain.enums.SortType; @@ -23,25 +25,28 @@ public class CommunityPostQueryServiceImpl implements CommunityPostQueryService private final CommunityPostLikesRepository postLikesRepository; private final CommunityPostBookmarkRepository postBookmarkRepository; + private final CategoryService categoryService; + @Override public Slice getPostList(Integer lastPopularityScore, Long lastPostId, Integer lastLikeCnt, Integer lastHit, PostTypeEnum postType, - Long categoryId, + String category, SortType sortType, PostStatusEnum postStatus, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); + return communityPostJpaRepository.findAllFetchJoinWithUser(lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, postStatus, - categoryId, + categoryService.findAllByCategory(CategoryEnum.fromValue(category)).get(0).getId(), sortType, pageRequest); } diff --git a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java index 005c2b40..847e1eaa 100644 --- a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java +++ b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java @@ -93,13 +93,13 @@ public BaseResponse getPostPreivewL @Min(value = 0, message = "lastLikeCnt는 0 이상 이어야 합니다.") @RequestParam(required = false) Integer lastLikeCnt, @Min(value = 0, message = "lastHit은 0 이상 이어야 합니다.") @RequestParam(required = false) Integer lastHit, @RequestParam(required = false) PostTypeEnum postType, - @RequestParam(required = false) Long categoryId, + @RequestParam(required = false) String category, @RequestParam(required = false, defaultValue = "recent") SortType sortType, @RequestParam(required = false) PostStatusEnum filter, @Min(value = 0, message = "page는 0 이상 이어야 합니다.") @RequestParam(defaultValue = "0") int page, @Min(value = 1, message = "size는 1 이상 이어야 합니다.") @RequestParam(defaultValue = "10") int size) { - Slice postSlice = communityPostQueryService.getPostList(lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, categoryId, sortType, filter, page, size); + Slice postSlice = communityPostQueryService.getPostList(lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, category, sortType, filter, page, size); return BaseResponse.onSuccess(communityPostConverter.toPostPreviewListDTO(postSlice.getContent(), postSlice.hasNext())); } diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java index 8492cc5a..22fa6923 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java @@ -9,7 +9,7 @@ public interface RecruitQueryService { RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId); RecruitResponseDTO.PreviewListResponseDTO getPreviewList( - Long categoryId, PreviewFilter filter, SortType sort, String query, Long value, int pageSize); + String category, PreviewFilter filter, SortType sort, String query, Long value, int pageSize); RecruitResponseDTO.DefaultPreviewListResponseDTO getDefaultPreview(boolean isFirst, int nextCategoryId, int pageSize); } diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java index 3188d8da..21fd4e06 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java @@ -60,18 +60,18 @@ public RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId) { @Override @Transactional(readOnly = true) public RecruitResponseDTO.PreviewListResponseDTO getPreviewList( - Long categoryId, PreviewFilter filter, SortType sort, String query, Long value, int pageSize) { + String category, PreviewFilter filter, SortType sort, String query, Long value, int pageSize) { - CategoryEnum category = null; - if (categoryId != null) { - category = categoryService.findByCategoryId(categoryId).getCategory(); - } + //CategoryEnum category = null; + //if (categoryid != null) { + // category = categoryService.findByCategoryId(categoryId).getCategory(); + //} validateQuery(query); Pageable pageable = PageRequest.of(0, pageSize); - return recruitRepository.findByCategoryOrderBySortType(category, filter, sort, query, value, pageable); + return recruitRepository.findByCategoryOrderBySortType(CategoryEnum.fromValue(category), filter, sort, query, value, pageable); } @Override 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 3afb6204..a94bb889 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 @@ -125,14 +125,14 @@ public BaseResponse unBookmarkStudy( @GetMapping("/preview") @Operation(summary = "스터디 모집 게시글 미리보기 목록 조회 API", description = "모집 게시글 목록을 조회하는 API 입니다.") public BaseResponse getPreviewList( - @RequestParam(required = false) Long categoryId, + @RequestParam(required = false) String category, @RequestParam(required = false) PreviewFilter filter, @RequestParam(defaultValue = "recent") SortType sort, @RequestParam(required = false) String query, @RequestParam(required = false) @Min(value = 0, message = "lastValue는 0 이상 입니다.") Long lastValue, @RequestParam(value = "page", defaultValue = "20") @Min(value = 1, message = "pageSize는 0보다 커야 합니다.") int pageSize) { - RecruitResponseDTO.PreviewListResponseDTO responseDTO = recruitQueryService.getPreviewList(categoryId, filter, sort, query, lastValue, pageSize); + RecruitResponseDTO.PreviewListResponseDTO responseDTO = recruitQueryService.getPreviewList(category, filter, sort, query, lastValue, pageSize); return BaseResponse.onSuccess(responseDTO); } From 145b5ca0bec194c8ad3f6c81f221e07e9bd803a0 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 17:58:44 +0900 Subject: [PATCH 31/44] =?UTF-8?q?:sparkles:=20Feat:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20String=EB=A1=9C=20=EB=B0=9B=EA=B8=B0?= =?UTF-8?q?=EB=A1=9C=20=EC=9E=84=EC=8B=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../recruit/service/RecruitCommandServiceImpl.java | 14 ++++++++------ .../domain/recruit/web/dto/RecruitRequestDTO.java | 6 +++--- 2 files changed, 11 insertions(+), 9 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 0634a976..c23da98e 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -4,6 +4,7 @@ import gaji.service.domain.common.entity.Category; import gaji.service.domain.common.entity.SelectCategory; import gaji.service.domain.common.service.CategoryService; +import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostTypeEnum; import gaji.service.domain.enums.Role; import gaji.service.domain.recruit.code.RecruitErrorStatus; @@ -82,14 +83,15 @@ public RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.Cre roomCommandService.saveRoom(room); - if (request.getCategoryId() == null) { - throw new RestApiException(GlobalErrorStatus._INVALID_CATEGORY); - } + // if (request.getCategoryId() == null) { + // throw new RestApiException(GlobalErrorStatus._INVALID_CATEGORY); + // } - Long categoryId = request.getCategoryId(); - Category category = categoryService.findByCategoryId(categoryId); + //Long categoryId = request.getCategoryId(); + //Category category = categoryService.findByCategoryId(categoryId); + Category category = categoryService.findAllByCategory(CategoryEnum.fromValue(request.getCategory())).get(0); - SelectCategory selectCategory = CategoryConverter.toSelectCategory(category, room.getId(), PostTypeEnum.ROOM); + SelectCategory selectCategory = CategoryConverter.toSelectCategory(category, room.getId(), PostTypeEnum.ROOM); categoryService.saveSelectCategory(selectCategory); return RecruitConverter.toResponseDTO(room); diff --git a/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java b/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java index e6e6cb38..65d2a915 100644 --- a/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java +++ b/src/main/java/gaji/service/domain/recruit/web/dto/RecruitRequestDTO.java @@ -72,9 +72,9 @@ public static class CreateRoomDTO { @Min(value = 1, message = "최대 인원은 1이상 이어야 합니다.") private int peopleMaximum; - @Schema(description = "카테고리의 id") - @Min(value = 1, message = "id는 1이상 이어야 합니다.") - private Long categoryId; + //@Schema(description = "카테고리의 id") + //@Min(value = 1, message = "id는 1이상 이어야 합니다.") + private String category; } @Schema(description = "스터디 댓글 작성 DTO") From 7bf58321499c94db9fbc5e5da789e03457a6cded Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 18:10:05 +0900 Subject: [PATCH 32/44] =?UTF-8?q?:sparkles:=20Feat:=20=EC=B9=B4=ED=85=8C?= =?UTF-8?q?=EA=B3=A0=EB=A6=AC=20null=EB=8F=84=20=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EA=B0=80=EB=8A=A5=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/service/CommunityPostQueryServiceImpl.java | 10 +++++++++- .../recruit/service/RecruitQueryServiceImpl.java | 9 +++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java index cd197626..5af5e663 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java @@ -1,5 +1,6 @@ package gaji.service.domain.post.service; +import gaji.service.domain.common.entity.Category; import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostStatusEnum; @@ -40,13 +41,20 @@ public Slice getPostList(Integer lastPopularityScore, int size) { PageRequest pageRequest = PageRequest.of(page, size); + + Long categoryId=null; + if(category!=null) + { + categoryId=categoryService.findAllByCategory(CategoryEnum.fromValue(category)).get(0).getId(); + } + return communityPostJpaRepository.findAllFetchJoinWithUser(lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, postStatus, - categoryService.findAllByCategory(CategoryEnum.fromValue(category)).get(0).getId(), + categoryId, sortType, pageRequest); } diff --git a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java index 21fd4e06..140539db 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java @@ -60,18 +60,23 @@ public RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId) { @Override @Transactional(readOnly = true) public RecruitResponseDTO.PreviewListResponseDTO getPreviewList( - String category, PreviewFilter filter, SortType sort, String query, Long value, int pageSize) { + String categoryValue, PreviewFilter filter, SortType sort, String query, Long value, int pageSize) { //CategoryEnum category = null; //if (categoryid != null) { // category = categoryService.findByCategoryId(categoryId).getCategory(); //} + CategoryEnum category = null; + if (categoryValue != null) { + category = CategoryEnum.fromValue(categoryValue); + } + validateQuery(query); Pageable pageable = PageRequest.of(0, pageSize); - return recruitRepository.findByCategoryOrderBySortType(CategoryEnum.fromValue(category), filter, sort, query, value, pageable); + return recruitRepository.findByCategoryOrderBySortType(category, filter, sort, query, value, pageable); } @Override From 2d52d912d7f519dd329233c7ad5fd87685809002 Mon Sep 17 00:00:00 2001 From: shimfff Date: Tue, 20 Aug 2024 18:31:55 +0900 Subject: [PATCH 33/44] =?UTF-8?q?:sparkles:=20Feat:=20=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=EB=94=94=EB=A3=B8=20=EB=A9=94=EC=9D=B8=20=EC=A1=B0=ED=9A=8C,?= =?UTF-8?q?=20=EC=A3=BC=EC=B0=A8=20=EC=88=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/room/repository/RoomEventRepository.java | 2 ++ .../service/domain/room/service/RoomQueryServiceImpl.java | 2 +- .../gaji/service/domain/room/web/dto/RoomResponseDto.java | 8 ++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java b/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java index eb340b53..3334482f 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java @@ -15,4 +15,6 @@ public interface RoomEventRepository extends JpaRepository { Optional findRoomEventById(Long roomId); List findByRoom(Room room); + + int countByRoomId(Long roomId); } diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java index 492f2a3a..8b1a66a9 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java @@ -105,7 +105,7 @@ public List getUserProgressByRoomEventId(Long r public RoomResponseDto.RoomMainDto getMainStudyRoom(Long roomId) { RoomResponseDto.RoomMainDto mainStudyRoom = roomQueryRepository.getMainStudyRoom(roomId); - return mainStudyRoom; + return mainStudyRoom.setWeekCount(roomEventRepository.countByRoomId(roomId)); } @Override diff --git a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java index 77b6c177..f09967ec 100644 --- a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java +++ b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java @@ -110,6 +110,7 @@ public static class RoomNoticeDto { @Builder @Getter @NoArgsConstructor + @AllArgsConstructor public static class RoomMainDto { private String name; private LocalDate startDay; @@ -118,6 +119,7 @@ public static class RoomMainDto { private LocalDate recruitEndDay; private Long daysLeftForRecruit; private Long applicantCount; + private int weekCount; public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, LocalDate recruitStartDay, LocalDate recruitEndDay, @@ -130,6 +132,12 @@ public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, this.applicantCount = applicantCount; this.daysLeftForRecruit = Math.max(daysLeftForRecruit, 0L); } + + public RoomMainDto setWeekCount(int weekCount){ + this.weekCount=weekCount; + return this; + } + } @Builder From 1e656f3ba82a50eb6107dc89e494cf979720fd79 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Wed, 21 Aug 2024 00:14:10 +0900 Subject: [PATCH 34/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20roomId=EB=A1=9C=20pa?= =?UTF-8?q?thVariable=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 조회는 postId로 조회하는 구조였음. 그러나 게시글의 첫번째 글이 1이 아닌 경우 조회를 할 수 없게 됨. 이러한 버그를 해결함 --- .../repository/RoomBoardRepository.java | 2 ++ .../RoomPost/RoomPostRepository.java | 15 +++++++++--- .../RoomPost/RoomPostCommandServiceImpl.java | 2 +- .../RoomPost/RoomPostQueryService.java | 3 ++- .../RoomPost/RoomPostQueryServiceImpl.java | 23 +++++++++++++++---- .../RoomTroublePostQueryServiceImpl.java | 12 ++++++++-- .../web/controller/RoomPostController.java | 23 ++++++++++++++----- .../controller/RoomTroublePostController.java | 8 +++---- 8 files changed, 67 insertions(+), 21 deletions(-) diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java index f88e4b48..7ad757d6 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomBoardRepository.java @@ -1,5 +1,6 @@ package gaji.service.domain.roomBoard.repository; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.entity.RoomBoard; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,5 +9,6 @@ @Repository public interface RoomBoardRepository extends JpaRepository { + Optional findRoomBoardByRoomIdAndRoomPostType(Long roomId, RoomPostType roomPostType); Optional findByRoomId(Long roomId); } diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java index b7167798..859f767d 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java @@ -8,17 +8,26 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface RoomPostRepository extends JpaRepository { @Query("SELECT new gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto$PostSummaryDto(" + "r.id, r.title, r.studyMate.user.nickname, r.createdAt, r.viewCount, SIZE(r.postCommentList)) " + "FROM RoomPost r " + - "WHERE r.roomBoard.id = :boardId AND r.id < :lastPostId " + - "ORDER BY r.createdAt DESC") + "WHERE r.roomBoard.id = :boardId AND r.createdAt <= :lastCreatedAt " + + "ORDER BY r.createdAt DESC, r.id DESC") List findPostSummariesForInfiniteScroll( @Param("boardId") Long boardId, - @Param("lastPostId") Long lastPostId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, Pageable pageable); + + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "THEN (SELECT r.createdAt FROM RoomPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "ELSE (SELECT MAX(r.createdAt) FROM RoomPost r WHERE r.roomBoard.id = :boardId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId); } diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java index 3be8b1c0..111e23fe 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostCommandServiceImpl.java @@ -51,7 +51,7 @@ public RoomPostResponseDto.toCreateRoomPostIdDTO createRoomPost(Long roomId, Lon StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(), roomId); // 스터디룸 게시판 확인 또는 생성 - RoomBoard roomBoard = roomBoardRepository.findByRoomId(roomId) + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId,RoomPostType.ROOM_POST) .orElseGet(() -> { RoomBoard newRoomBoard = RoomBoard.builder() .room(room) diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java index 44757a3f..1432b643 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryService.java @@ -13,7 +13,8 @@ public interface RoomPostQueryService { // List getPaginatedTroublePosts(Long boardId, int page, int size); - List getNextPosts(Long boardId, Long lastPostId, int size); + + List getNextPosts(Long roomId, Long lastPostId, int size); RoomPost findPostById(Long PostId); diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java index d79669cf..8c901dfe 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomPost/RoomPostQueryServiceImpl.java @@ -1,8 +1,11 @@ package gaji.service.domain.roomBoard.service.RoomPost; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.code.RoomPostErrorStatus; +import gaji.service.domain.roomBoard.entity.RoomBoard; import gaji.service.domain.roomBoard.entity.RoomPost.PostComment; import gaji.service.domain.roomBoard.entity.RoomPost.RoomPost; +import gaji.service.domain.roomBoard.repository.RoomBoardRepository; import gaji.service.domain.roomBoard.repository.RoomPost.PostCommentRepository; import gaji.service.domain.roomBoard.repository.RoomPost.RoomPostQueryRepository; import gaji.service.domain.roomBoard.repository.RoomPost.RoomPostRepository; @@ -14,6 +17,7 @@ import org.springframework.data.domain.*; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -26,6 +30,7 @@ public class RoomPostQueryServiceImpl implements RoomPostQueryService { private final RoomPostRepository roomPostRepository; private final PostCommentRepository postCommentRepository; private final StudyMateQueryService studyMateQueryService; + private final RoomBoardRepository roomBoardRepository; @Override public List getTop3RecentPosts(Long roomId) { @@ -33,11 +38,21 @@ public List getTop3RecentPosts(Long roomId) { } @Override - public List getNextPosts(Long boardId, Long lastPostId, int size) { - Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt")); - return roomPostRepository.findPostSummariesForInfiniteScroll(boardId, lastPostId,pageable); + public List getNextPosts(Long roomId, Long lastPostId, int size) { + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_POST) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); + + LocalDateTime lastCreatedAt; + if (lastPostId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomPostRepository.findCreatedAtByIdOrEarliest(roomBoard.getId(), lastPostId) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._POST_NOT_FOUND)); + } + + Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt", "id")); + return roomPostRepository.findPostSummariesForInfiniteScroll(roomBoard.getId(), lastCreatedAt, pageable); } - @Override public RoomPost findPostById(Long PostId){ return roomPostRepository.findById(PostId) diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java index 148c93a3..c5d32c18 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java @@ -1,8 +1,11 @@ package gaji.service.domain.roomBoard.service.RoomTrouble; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.code.RoomPostErrorStatus; +import gaji.service.domain.roomBoard.entity.RoomBoard; import gaji.service.domain.roomBoard.entity.RoomTrouble.RoomTroublePost; import gaji.service.domain.roomBoard.entity.RoomTrouble.TroublePostComment; +import gaji.service.domain.roomBoard.repository.RoomBoardRepository; import gaji.service.domain.roomBoard.repository.RoomTrouble.RoomTroublePostRepository; import gaji.service.domain.roomBoard.repository.RoomTrouble.TroublePostCommentRepository; import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto; @@ -24,6 +27,7 @@ public class RoomTroublePostQueryServiceImpl implements RoomTroublePostQueryServ private final TroublePostCommentRepository troublePostCommentRepository; private final RoomTroublePostRepository roomTroublePostRepository; private final StudyMateQueryService studyMateQueryService; + private final RoomBoardRepository roomBoardRepository; @Override public TroublePostComment findCommentByCommentId(Long commentId){ @@ -38,9 +42,13 @@ public TroublePostComment findTroublePostCommentById(Long troublePostId) { } @Override - public List getNextTroublePosts(Long boardId, Long lastPostId, int size) { + public List getNextTroublePosts(Long roomId, Long lastPostId, int size) { Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt")); - return roomTroublePostRepository.findTroublePostSummariesForInfiniteScroll(boardId, lastPostId,pageable); + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_TROUBLE_POST) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); + System.out.println("스터디룸 id: " + roomId); + System.out.println("스터디 boardId : " + roomBoard.getId()); + return roomTroublePostRepository.findTroublePostSummariesForInfiniteScroll(roomBoard.getId(), lastPostId,pageable); } diff --git a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java index dc43b7a1..94da029f 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomPostController.java @@ -147,20 +147,31 @@ public BaseResponse removeBookmark( return BaseResponse.onSuccess( "북마크가 성공적으로 삭제되었습니다."); } - @GetMapping("/{boardId}/post") +// @GetMapping("/{roomId}/post/list") +// @Operation(summary = "게시글 무한 스크롤 조회", description = "게시글을 무한 스크롤 방식으로 조회합니다.") +// @ApiResponse(responseCode = "200", description = "조회 성공") +// public BaseResponse> getNextPosts( +// @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, +// @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, +// @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { +// +// List posts = +// roomPostQueryService.getNextPosts(roomId, lastPostId, size); +// +// return BaseResponse.onSuccess(posts); +// } + + @GetMapping("/{roomId}/post/list") @Operation(summary = "게시글 무한 스크롤 조회", description = "게시글을 무한 스크롤 방식으로 조회합니다.") @ApiResponse(responseCode = "200", description = "조회 성공") public BaseResponse> getNextPosts( - @PathVariable @Parameter(description = "게시판 ID") Long boardId, + @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { - List posts = - roomPostQueryService.getNextPosts(boardId, lastPostId, size); - + roomPostQueryService.getNextPosts(roomId, lastPostId, size); return BaseResponse.onSuccess(posts); } - @PostMapping("/post/comments/{commentId}/replies") @Operation(summary = "게시글 댓글의 답글 작성 API") public BaseResponse addReply( diff --git a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java index d1f68787..03e6957d 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java @@ -159,16 +159,16 @@ public BaseResponse addReply( return BaseResponse.onSuccess(RoomPostConverter.toWriteCommentDto(replyComment)); } - @GetMapping("/{boardId}/trouble") + @GetMapping("/{roomId}/trouble/list") @Operation(summary = "트러블 슈팅 게시글 무한 스크롤 조회", description = "트러블 슈팅 게시글을 무한 스크롤 방식으로 조회합니다.") @ApiResponse(responseCode = "200", description = "조회 성공") public BaseResponse> getNextTroublePosts( - @PathVariable @Parameter(description = "게시판 ID") Long boardId, + @PathVariable @Parameter(description = "게시판 ID") Long roomId, @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { - List posts = - roomTroublePostQueryService.getNextTroublePosts(boardId, lastPostId, size); + List posts; + posts = roomTroublePostQueryService.getNextTroublePosts(roomId, lastPostId, size); return BaseResponse.onSuccess(posts); } From 74166e50e8cec75f61844a9fd44431de8ec8e2b1 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Wed, 21 Aug 2024 00:32:30 +0900 Subject: [PATCH 35/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20roomId=EB=A1=9C=20pa?= =?UTF-8?q?thVariable=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 조회는 postId로 조회하는 구조였음. 그러나 게시글의 첫번째 글이 1이 아닌 경우 조회를 할 수 없게 됨. 이러한 버그를 해결함 --- .../repository/RoomPost/RoomPostRepository.java | 1 + .../RoomTrouble/RoomTroublePostRepository.java | 16 ++++++++++++---- .../TroublePostCommentRepository.java | 1 + .../RoomTroublePostQueryServiceImpl.java | 16 ++++++++++++---- .../controller/RoomTroublePostController.java | 2 -- 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java index 859f767d..1cfcc61b 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomPost/RoomPostRepository.java @@ -30,4 +30,5 @@ List findPostSummariesForInfiniteScroll( "ELSE (SELECT MAX(r.createdAt) FROM RoomPost r WHERE r.roomBoard.id = :boardId) " + "END") Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId); + } diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java index 5b5dbdb5..a6ac8b0f 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/RoomTroublePostRepository.java @@ -8,17 +8,25 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface RoomTroublePostRepository extends JpaRepository { @Query("SELECT new gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto$TroublePostSummaryDto(" + "r.id, r.title, r.studyMate.user.nickname, r.createdAt, r.viewCount, SIZE(r.troublePostCommentList)) " + "FROM RoomTroublePost r " + - "WHERE r.roomBoard.id = :boardId AND r.id < :lastPostId " + - "ORDER BY r.createdAt DESC") + "WHERE r.roomBoard.id = :boardId AND r.createdAt <= :lastCreatedAt " + + "ORDER BY r.createdAt DESC, r.id DESC") List findTroublePostSummariesForInfiniteScroll( @Param("boardId") Long boardId, - @Param("lastPostId") Long lastPostId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, Pageable pageable); -} + + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomTroublePost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "THEN (SELECT r.createdAt FROM RoomTroublePost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "ELSE (SELECT MAX(r.createdAt) FROM RoomTroublePost r WHERE r.roomBoard.id = :boardId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId);} diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java index e50e40b4..29a34816 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomTrouble/TroublePostCommentRepository.java @@ -27,4 +27,5 @@ List findCommentsWithReplies(@Param("postId") Long postId, "AND c.isReply = false " + "ORDER BY c.createdAt ASC, c.id ASC") Page findOldestComments(@Param("postId") Long postId, Pageable pageable); + } diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java index c5d32c18..66b0ffc6 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostQueryServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.data.domain.*; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -43,12 +44,19 @@ public TroublePostComment findTroublePostCommentById(Long troublePostId) { @Override public List getNextTroublePosts(Long roomId, Long lastPostId, int size) { - Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt")); RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_TROUBLE_POST) .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); - System.out.println("스터디룸 id: " + roomId); - System.out.println("스터디 boardId : " + roomBoard.getId()); - return roomTroublePostRepository.findTroublePostSummariesForInfiniteScroll(roomBoard.getId(), lastPostId,pageable); + + LocalDateTime lastCreatedAt; + if (lastPostId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomTroublePostRepository.findCreatedAtByIdOrEarliest(roomBoard.getId(), lastPostId) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._POST_NOT_FOUND)); + } + + Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt", "id")); + return roomTroublePostRepository.findTroublePostSummariesForInfiniteScroll(roomBoard.getId(), lastCreatedAt, pageable); } diff --git a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java index 03e6957d..4d565907 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomTroublePostController.java @@ -166,10 +166,8 @@ public BaseResponse> getNextTrou @PathVariable @Parameter(description = "게시판 ID") Long roomId, @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { - List posts; posts = roomTroublePostQueryService.getNextTroublePosts(roomId, lastPostId, size); - return BaseResponse.onSuccess(posts); } From 880e7ae8dfcbf61051aca9bc39b0809b02c270c1 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Wed, 21 Aug 2024 00:53:57 +0900 Subject: [PATCH 36/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=EC=A0=95=EB=B3=B4?= =?UTF-8?q?=EB=82=98=EB=88=94=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20api=20roomId?= =?UTF-8?q?=EB=A1=9C=20pathVariable=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 기존 조회는 postId로 조회하는 구조였음. 그러나 게시글의 첫번째 글이 1이 아닌 경우 조회를 할 수 없게 됨. 이러한 버그를 해결함 --- .../RoomInfo/RoomInfoPostRepository.java | 14 +++++++++--- .../RoomInfoPostCommandServiceImpl.java | 4 ++-- .../RoomInfoPostQueryServiceImpl.java | 22 ++++++++++++++++--- .../RoomTroublePostCommandServiceImpl.java | 2 +- .../controller/RoomInfoPostController.java | 10 ++++----- 5 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java b/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java index debb6537..a565eec2 100644 --- a/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java +++ b/src/main/java/gaji/service/domain/roomBoard/repository/RoomInfo/RoomInfoPostRepository.java @@ -8,18 +8,26 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; @Repository public interface RoomInfoPostRepository extends JpaRepository { @Query("SELECT new gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto$InfoPostSummaryDto(" + "r.id, r.title, r.studyMate.user.nickname, r.createdAt, r.viewCount, SIZE(r.infoPostCommentList)) " + "FROM RoomInfoPost r " + - "WHERE r.roomBoard.id = :boardId AND r.id < :lastPostId " + - "ORDER BY r.createdAt DESC") + "WHERE r.roomBoard.id = :boardId AND r.createdAt <= :lastCreatedAt " + + "ORDER BY r.createdAt DESC, r.id DESC") List findInfoPostSummariesForInfiniteScroll( @Param("boardId") Long boardId, - @Param("lastPostId") Long lastPostId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, Pageable pageable); + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomInfoPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "THEN (SELECT r.createdAt FROM RoomInfoPost r WHERE r.roomBoard.id = :boardId AND r.id = :postId) " + + "ELSE (SELECT MAX(r.createdAt) FROM RoomInfoPost r WHERE r.roomBoard.id = :boardId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId); } diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java index 93e984ff..b0f5d1cd 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostCommandServiceImpl.java @@ -51,11 +51,11 @@ public RoomPostResponseDto.toCreateRoomInfoPostIdDTO createRoomInfoPostIdDTO(Lon StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(), roomId); // 스터디룸 게시판 확인 또는 생성 - RoomBoard roomBoard = roomBoardRepository.findByRoomId(roomId) + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_INFORMATION_POST) .orElseGet(() -> { RoomBoard newRoomBoard = RoomBoard.builder() .room(room) - .roomPostType(RoomPostType.ROOM_TROUBLE_POST) + .roomPostType(RoomPostType.ROOM_INFORMATION_POST) .name(room.getName()) .build(); return roomBoardRepository.save(newRoomBoard); diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java index eb06edce..317bc428 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomInfo/RoomInfoPostQueryServiceImpl.java @@ -1,8 +1,11 @@ package gaji.service.domain.roomBoard.service.RoomInfo; +import gaji.service.domain.enums.RoomPostType; import gaji.service.domain.roomBoard.code.RoomPostErrorStatus; +import gaji.service.domain.roomBoard.entity.RoomBoard; import gaji.service.domain.roomBoard.entity.RoomInfo.InfoPostComment; import gaji.service.domain.roomBoard.entity.RoomInfo.RoomInfoPost; +import gaji.service.domain.roomBoard.repository.RoomBoardRepository; import gaji.service.domain.roomBoard.repository.RoomInfo.InfoPostCommentRepository; import gaji.service.domain.roomBoard.repository.RoomInfo.RoomInfoPostRepository; import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto; @@ -13,6 +16,7 @@ import org.springframework.data.domain.*; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @@ -24,6 +28,7 @@ public class RoomInfoPostQueryServiceImpl implements RoomInfoPostQueryService{ private final RoomInfoPostRepository roomInfoPostRepository; private final InfoPostCommentRepository infoPostCommentRepository; private final StudyMateQueryService studyMateQueryService; + private final RoomBoardRepository roomBoardRepository; @Override public RoomInfoPost findInfoPostById(Long PostId){ return roomInfoPostRepository.findById(PostId) @@ -44,9 +49,20 @@ public InfoPostComment findPostCommentById(Long troublePostId) { } @Override - public List getNextPosts(Long boardId, Long lastPostId, int size) { - Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt")); - return roomInfoPostRepository.findInfoPostSummariesForInfiniteScroll(boardId, lastPostId,pageable); + public List getNextPosts(Long roomId, Long lastPostId, int size) { + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_INFORMATION_POST) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); + + LocalDateTime lastCreatedAt; + if (lastPostId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomInfoPostRepository.findCreatedAtByIdOrEarliest(roomBoard.getId(), lastPostId) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._POST_NOT_FOUND)); + } + + Pageable pageable = PageRequest.of(0, size, Sort.by(Sort.Direction.DESC, "createdAt", "id")); + return roomInfoPostRepository.findInfoPostSummariesForInfiniteScroll(roomBoard.getId(), lastCreatedAt, pageable); } diff --git a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java index 5b3f74e1..44dbaace 100644 --- a/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/roomBoard/service/RoomTrouble/RoomTroublePostCommandServiceImpl.java @@ -68,7 +68,7 @@ public RoomPostResponseDto.toCreateRoomTroublePostIdDTO createRoomTroublePost(Lo StudyMate studyMate = studyMateQueryService.findByUserIdAndRoomId(user.getId(), roomId); // 스터디룸 게시판 확인 또는 생성 - RoomBoard roomBoard = roomBoardRepository.findByRoomId(roomId) + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId , RoomPostType.ROOM_TROUBLE_POST) .orElseGet(() -> { RoomBoard newRoomBoard = RoomBoard.builder() .room(room) diff --git a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java index ad78f9b1..eeaac3be 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/controller/RoomInfoPostController.java @@ -146,17 +146,15 @@ public BaseResponse removeBookmark( return BaseResponse.onSuccess( "북마크가 성공적으로 삭제되었습니다."); } - @GetMapping("/{boardId}/info") + @GetMapping("/{roomId}/info/list") @Operation(summary = "게시글 무한 스크롤 조회", description = "게시글을 무한 스크롤 방식으로 조회합니다.") @ApiResponse(responseCode = "200", description = "조회 성공") - public BaseResponse> getNextTroublePosts( - @PathVariable @Parameter(description = "게시판 ID") Long boardId, + public BaseResponse> getNextInfoPosts( + @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, @RequestParam @Parameter(description = "마지막으로 로드된 게시글 ID") Long lastPostId, @RequestParam(defaultValue = "10") @Parameter(description = "조회할 게시글 수") int size) { - List posts = - roomInfoPostQueryService.getNextPosts(boardId, lastPostId, size); - + roomInfoPostQueryService.getNextPosts(roomId, lastPostId, size); return BaseResponse.onSuccess(posts); } From c0ff182ec1348fdda68164ddea153276520f3410 Mon Sep 17 00:00:00 2001 From: mmingoo Date: Wed, 21 Aug 2024 01:19:04 +0900 Subject: [PATCH 37/44] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=EA=B3=B5=EC=A7=80?= =?UTF-8?q?=EC=82=AC=ED=95=AD=20=EC=8A=A4=ED=81=AC=EB=A1=A4=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 무한 스크롤 방식으로 변경 --- .../room/repository/RoomEventRepository.java | 2 - .../room/repository/RoomNoticeRepository.java | 32 +++++++++--- .../domain/room/service/RoomQueryService.java | 9 ++-- .../room/service/RoomQueryServiceImpl.java | 52 +++++++++++-------- .../web/controller/RoomNoticeController.java | 20 +++---- .../domain/room/web/dto/RoomResponseDto.java | 8 --- 6 files changed, 72 insertions(+), 51 deletions(-) diff --git a/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java b/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java index 3334482f..eb340b53 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomEventRepository.java @@ -15,6 +15,4 @@ public interface RoomEventRepository extends JpaRepository { Optional findRoomEventById(Long roomId); List findByRoom(Room room); - - int countByRoomId(Long roomId); } diff --git a/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java b/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java index 341773c4..502aa90a 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomNoticeRepository.java @@ -1,18 +1,36 @@ package gaji.service.domain.room.repository; import gaji.service.domain.room.entity.RoomNotice; +import gaji.service.domain.room.web.dto.RoomResponseDto; +import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + @Repository public interface RoomNoticeRepository extends JpaRepository { - @Modifying - @Query("UPDATE RoomNotice rn SET rn.confirmCount = rn.confirmCount + 1 WHERE rn.id = :noticeId") - void incrementConfirmCount(Long noticeId); + @Query("SELECT NEW gaji.service.domain.room.web.dto.RoomResponseDto$NoticeDto(" + + "rn.id, sm.user.name, rn.title, rn.body, CAST(COUNT(nc) AS Long), rn.createdAt, rn.viewCount) " + + "FROM RoomNotice rn " + + "JOIN rn.studyMate sm " + + "LEFT JOIN NoticeConfirmation nc ON nc.roomNotice.id = rn.id " + + "WHERE sm.room.id = :roomId AND rn.createdAt <= :lastCreatedAt " + + "GROUP BY rn.id, sm.user.name, rn.title, rn.body, rn.createdAt, rn.viewCount " + + "ORDER BY rn.createdAt DESC, rn.id DESC") + List findNoticeSummariesForInfiniteScroll( + @Param("roomId") Long roomId, + @Param("lastCreatedAt") LocalDateTime lastCreatedAt, + Pageable pageable); - @Modifying - @Query("UPDATE RoomNotice rn SET rn.confirmCount = rn.confirmCount - 1 WHERE rn.id = :noticeId AND rn.confirmCount > 0") - void decrementConfirmCount(Long noticeId); + @Query("SELECT CASE " + + "WHEN EXISTS (SELECT 1 FROM RoomNotice rn WHERE rn.studyMate.room.id = :roomId AND rn.id = :noticeId) " + + "THEN (SELECT rn.createdAt FROM RoomNotice rn WHERE rn.studyMate.room.id = :roomId AND rn.id = :noticeId) " + + "ELSE (SELECT MAX(rn.createdAt) FROM RoomNotice rn WHERE rn.studyMate.room.id = :roomId) " + + "END") + Optional findCreatedAtByIdOrEarliest(@Param("roomId") Long roomId, @Param("noticeId") Long noticeId); } diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java index 9c4cc63c..c9a259ec 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryService.java @@ -3,7 +3,6 @@ import gaji.service.domain.room.entity.Room; import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.web.dto.RoomResponseDto; -import gaji.service.domain.user.entity.User; import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -14,9 +13,13 @@ public interface RoomQueryService { RoomEvent findRoomEventByRoomIdAndWeeks(Long roomId, Integer weeks); - List getNotices(Long roomId, int page, int size); +// List getNotices(Long roomId, int page, int size); +// +// RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId); +// +// List getNextNotices(Long roomId, Long lastNoticeId, int size); - RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId); + List getNextNotices(Long roomId, Long lastNoticeId, int size); @Transactional(readOnly = true) RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomId, Integer weeks); diff --git a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java index 8b1a66a9..d9b33bc1 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomQueryServiceImpl.java @@ -6,14 +6,17 @@ import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.repository.*; import gaji.service.domain.room.web.dto.RoomResponseDto; -import gaji.service.domain.user.entity.User; +import gaji.service.global.converter.DateConverter; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.webjars.NotFoundException; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; @@ -29,6 +32,7 @@ public class RoomQueryServiceImpl implements RoomQueryService { private final WeeklyUserProgressRepository weeklyUserProgressRepository; private final NoticeConfirmationRepository noticeConfirmationRepository; private final WebInvocationPrivilegeEvaluator privilegeEvaluator; + private final RoomNoticeRepository roomNoticeRepository; // @Override // public RoomEvent findRoomEventById(Long roomId){ @@ -49,28 +53,32 @@ public RoomEvent findRoomEventByRoomIdAndWeeks(Long roomId, Integer weeks) { .orElseThrow(() -> new RestApiException(RoomErrorStatus._ROOM_EVENT_NOT_FOUND)); } - @Override - public List getNotices(Long roomId, int page, int size) { - return roomQueryRepository.getNotices(roomId, page, size); - } +// @Override +// public List getNotices(Long roomId, int page, int size) { +// return roomQueryRepository.getNotices(roomId, page, size); +// } @Override - @Transactional(readOnly = false) // readOnly = false로 설정 - public RoomResponseDto.NoticeDto getNoticeDetail(Long roomId, Long noticeId) { - RoomResponseDto.NoticeDto notice = roomQueryRepository.getNotices(roomId, 1, Integer.MAX_VALUE).stream() - .filter(n -> n.getId().equals(noticeId)) - .findFirst() - .orElseThrow(() -> new NotFoundException("Notice not found")); - - // viewCount 증가 - roomQueryRepository.incrementViewCount (noticeId); - - // 증가된 viewCount를 반영하기 위해 notice 객체 업데이트 - notice.setViewCount(notice.getViewCount() + 1); - - return notice; + public List getNextNotices(Long roomId, Long lastNoticeId, int size) { + LocalDateTime lastCreatedAt; + if (lastNoticeId == 0) { + lastCreatedAt = LocalDateTime.now(); + } else { + lastCreatedAt = roomNoticeRepository.findCreatedAtByIdOrEarliest(roomId, lastNoticeId) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._NOTICE_NOT_FOUND)); + } + + Sort sort = Sort.by(Sort.Direction.DESC, "createdAt", "id"); + Pageable pageable = PageRequest.of(0, size, sort); + + List notices = roomNoticeRepository.findNoticeSummariesForInfiniteScroll(roomId, lastCreatedAt, pageable); + + LocalDateTime now = LocalDateTime.now(); + for (RoomResponseDto.NoticeDto notice : notices) { + notice.setTimeSincePosted(DateConverter.convertToRelativeTimeFormat(notice.getCreatedAt())); + } + return notices; } - @Override @Transactional(readOnly = true) public RoomResponseDto.WeeklyStudyInfoDTO getWeeklyStudyInfo(Long roomId, Integer weeks) { @@ -105,7 +113,7 @@ public List getUserProgressByRoomEventId(Long r public RoomResponseDto.RoomMainDto getMainStudyRoom(Long roomId) { RoomResponseDto.RoomMainDto mainStudyRoom = roomQueryRepository.getMainStudyRoom(roomId); - return mainStudyRoom.setWeekCount(roomEventRepository.countByRoomId(roomId)); + return mainStudyRoom; } @Override diff --git a/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java b/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java index 7ce4ee57..6b921e00 100644 --- a/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java +++ b/src/main/java/gaji/service/domain/room/web/controller/RoomNoticeController.java @@ -9,6 +9,8 @@ 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.responses.ApiResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -40,17 +42,17 @@ public BaseResponse NoticeController( } @GetMapping("/{roomId}/notices") - @Operation(summary = "스터디룸 공지 목록 조회 API") - public BaseResponse getNotices( - @PathVariable Long roomId, - @RequestParam(defaultValue = "1") int page, - @RequestParam(defaultValue = "5") int size) { - List notices = roomQueryService.getNotices(roomId, page, size); - return BaseResponse.onSuccess( - new RoomResponseDto.NoticeDtoList(notices) - ); + @Operation(summary = "스터디룸 공지 무한 스크롤 조회", description = "공지를 무한 스크롤 방식으로 조회합니다.") + @ApiResponse(responseCode = "200", description = "조회 성공") + public BaseResponse> getNextNotices( + @PathVariable @Parameter(description = "스터디룸 ID") Long roomId, + @RequestParam @Parameter(description = "마지막으로 로드된 공지 ID") Long lastNoticeId, + @RequestParam(defaultValue = "5") @Parameter(description = "조회할 공지 수") int size) { + List notices = roomQueryService.getNextNotices(roomId, lastNoticeId, size); + return BaseResponse.onSuccess(notices); } + // @GetMapping("/notice/{noticeId}") // @Operation(summary = "특정 공지사항을 조회하는 API") // public ResponseEntity getNoticeDetail( diff --git a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java index f09967ec..77b6c177 100644 --- a/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java +++ b/src/main/java/gaji/service/domain/room/web/dto/RoomResponseDto.java @@ -110,7 +110,6 @@ public static class RoomNoticeDto { @Builder @Getter @NoArgsConstructor - @AllArgsConstructor public static class RoomMainDto { private String name; private LocalDate startDay; @@ -119,7 +118,6 @@ public static class RoomMainDto { private LocalDate recruitEndDay; private Long daysLeftForRecruit; private Long applicantCount; - private int weekCount; public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, LocalDate recruitStartDay, LocalDate recruitEndDay, @@ -132,12 +130,6 @@ public RoomMainDto(String name, LocalDate startDay, LocalDate endDay, this.applicantCount = applicantCount; this.daysLeftForRecruit = Math.max(daysLeftForRecruit, 0L); } - - public RoomMainDto setWeekCount(int weekCount){ - this.weekCount=weekCount; - return this; - } - } @Builder From 7adccd72c503c7057c6edfa0f4691793256ec249 Mon Sep 17 00:00:00 2001 From: strongmhk Date: Wed, 21 Aug 2024 11:38:37 +0900 Subject: [PATCH 38/44] =?UTF-8?q?=E2=9C=A8=20[#97]=20feature:=20=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20=EC=A1=B4=EC=9E=AC=20=EC=97=AC?= =?UTF-8?q?=EB=B6=80=20=EA=B2=80=EC=A6=9D=20=EC=95=A0=EB=85=B8=ED=85=8C?= =?UTF-8?q?=EC=9D=B4=EC=85=98=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/validation/CategoryExistsValidator.java | 10 +++++----- .../java/gaji/service/domain/enums/CategoryEnum.java | 2 +- .../domain/post/web/dto/CommunityPostRequestDTO.java | 7 ++++--- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java b/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java index 545b8f4f..26d4635c 100644 --- a/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java +++ b/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java @@ -2,17 +2,17 @@ import gaji.service.domain.common.annotation.ExistsCategory; import gaji.service.domain.common.service.CategoryService; +import gaji.service.domain.enums.CategoryEnum; import gaji.service.global.exception.code.status.GlobalErrorStatus; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; -import java.util.List; @Component @RequiredArgsConstructor -public class CategoryExistsValidator implements ConstraintValidator> { +public class CategoryExistsValidator implements ConstraintValidator { private final CategoryService categoryService; @Override @@ -21,9 +21,9 @@ public void initialize(ExistsCategory constraintAnnotation) { } @Override - public boolean isValid(List values, ConstraintValidatorContext context) { - boolean isValid = values.stream() - .allMatch(value -> categoryService.existsByCategoryId(value)); + public boolean isValid(String value, ConstraintValidatorContext context) { + // TODO: 유효하지 않은 카테고리값 들어왔을 때 + boolean isValid = categoryService.existsByCategory(CategoryEnum.from(value)); if (!isValid) { context.disableDefaultConstraintViolation(); diff --git a/src/main/java/gaji/service/domain/enums/CategoryEnum.java b/src/main/java/gaji/service/domain/enums/CategoryEnum.java index 114efe0d..4fbd43b8 100644 --- a/src/main/java/gaji/service/domain/enums/CategoryEnum.java +++ b/src/main/java/gaji/service/domain/enums/CategoryEnum.java @@ -36,7 +36,7 @@ public static CategoryEnum from(String param) { } } log.error("CategoryEnum.from() exception occur param: {}", param); - throw new RestApiException(GlobalErrorStatus._INVALID_CATEGORY); + return null; } public static CategoryEnum fromValue(String value) { diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostRequestDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostRequestDTO.java index ac60bc6d..7322498c 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostRequestDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostRequestDTO.java @@ -2,6 +2,7 @@ import gaji.service.domain.common.annotation.CheckHashtagBlank; import gaji.service.domain.common.annotation.CheckHashtagLength; +import gaji.service.domain.common.annotation.ExistsCategory; import gaji.service.domain.enums.PostTypeEnum; import gaji.service.domain.post.annotation.ExistPostType; import io.swagger.v3.oas.annotations.media.Schema; @@ -26,7 +27,7 @@ public static class UploadPostRequestDTO { @NotBlank(message = "게시글 본문을 입력해주세요.") private final String body; - @Schema(description = "게시글 썸네일 Url(없으면 첫번째 사진으로 설정)") + @Schema(description = "게시글 썸네일 Url") private final String thumbnailUrl; @Schema(description = "게시글 유형(프로젝트 모집, 질문, 블로그)") @@ -38,8 +39,8 @@ public static class UploadPostRequestDTO { @CheckHashtagLength private final List hashtagList = new ArrayList<>(); - @Schema(description = "카테고리의 id") - // TODO: 카테고리 존재 여부 검증 애노테이션 적용 + @Schema(description = "카테고리") + @ExistsCategory private final String category; } From c7b686d888a9e3bf695ab368372ef9556dfb378e Mon Sep 17 00:00:00 2001 From: strongmhk Date: Wed, 21 Aug 2024 11:40:14 +0900 Subject: [PATCH 39/44] =?UTF-8?q?:hammer:=20[#97]=20fix:=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/post/converter/CommunityPostConverter.java | 8 +++++--- .../repository/CommunityPostQueryDslRepositoryImpl.java | 8 ++++++++ .../post/service/CommunityPostQueryServiceImpl.java | 4 ++-- .../post/web/controller/CommunityPostRestController.java | 4 ++-- .../domain/post/web/dto/CommunityPostResponseDTO.java | 4 +++- .../gaji/service/jwt/service/CustomSuccessHandler.java | 4 ++-- 6 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java index 1d0e7441..ed0bd72e 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -115,6 +115,7 @@ public CommunityPostResponseDTO.PostPreviewDTO toPostPreviewDTO(CommnuityPost po .uploadTime(DateConverter.convertToRelativeTimeFormat(post.getCreatedAt())) .hit(post.getHit()) .popularityScore(post.getPopularityScore()) + .status(post.getStatus()) .hashtagList(hashtagList) .build(); } @@ -136,17 +137,16 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post List hashtagNameAndIdDTOList = HashtagConverter.toHashtagNameAndIdDTOList(selectHashtagList); // ofNullable 메서드로 NPE 방지 - CategoryEnum category = Optional.ofNullable(categoryService.findOneFetchJoinWithCategoryByEntityIdAndPostType(post.getId(), post.getType())) + /*CategoryEnum category = Optional.ofNullable(categoryService.findOneFetchJoinWithCategoryByEntityIdAndPostType(post.getId(), post.getType())) .map(SelectCategory::getCategory) .map(Category::getCategory) - .orElse(null); + .orElse(null);*/ boolean isBookmarked = (userId == null) ? false : postBookMarkService.existsByUserAndPost(userId, post); boolean isLiked = (userId == null) ? false : postLikesService.existsByUserAndPost(userId, post); boolean isWriter = (userId == null) ? false : communityPostQueryService.isPostWriter(userId, post); return CommunityPostResponseDTO.PostDetailDTO.builder() - .category(category) .userId(post.getUser().getId()) .type(post.getType()) .createdAt(DateConverter.convertWriteTimeFormat(LocalDate.from(post.getCreatedAt()), "")) @@ -157,9 +157,11 @@ public CommunityPostResponseDTO.PostDetailDTO toPostDetailDTO(CommnuityPost post .userNickname(post.getUser().getNickname()) .title(post.getTitle()) .hashtagList(hashtagNameAndIdDTOList) + .isWriter(isWriter) .bookMarkStatus(isBookmarked) .likeStatus(isLiked) .body(post.getBody()) + .status(post.getStatus()) .category(selectCategory.getCategory().getCategory().getValue()) .build(); } diff --git a/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java b/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java index 914e8c0b..19658c31 100644 --- a/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java @@ -21,6 +21,7 @@ import java.time.LocalDateTime; import java.util.List; +import static gaji.service.domain.common.entity.QSelectCategory.selectCategory; import static gaji.service.domain.common.entity.QSelectHashtag.selectHashtag; import static gaji.service.domain.post.entity.QCommnuityPost.commnuityPost; import static gaji.service.domain.user.entity.QUser.user; @@ -48,6 +49,8 @@ public Slice findAllFetchJoinWithUser(String keyword, List postList = jpaQueryFactory. selectFrom(commnuityPost) .leftJoin(commnuityPost.user, user) + .join(selectCategory) + .on(joinSelectCategory(commnuityPost.id, commnuityPost.type)) // .join(selectHashtag) // TODO: 연관관계가 맺어져 있지 않아도 조인 가능, 추후 리팩토링 고려 // .on(joinSelectHashtag(commnuityPost.id, commnuityPost.type)) .fetchJoin() @@ -136,6 +139,11 @@ private BooleanExpression joinSelectHashtag(NumberPath entityId, EnumPath< .and(selectHashtag.type.eq(postType)); } + private BooleanExpression joinSelectCategory(NumberPath entityId, EnumPath postType) { + return selectCategory.entityId.eq(entityId) + .and(selectCategory.type.eq(postType)); + } + private Slice checkLastPage(Pageable pageable, List postList) { boolean hasNext = false; diff --git a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java index 9bbdd5d0..149c5a39 100644 --- a/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/post/service/CommunityPostQueryServiceImpl.java @@ -1,6 +1,5 @@ package gaji.service.domain.post.service; -import gaji.service.domain.common.entity.Category; import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostStatusEnum; @@ -49,7 +48,8 @@ public Slice getPostList(String keyword, categoryId=categoryService.findAllByCategory(CategoryEnum.fromValue(category)).get(0).getId(); } - return communityPostJpaRepository.findAllFetchJoinWithUser(lastPopularityScore, + return communityPostJpaRepository.findAllFetchJoinWithUser(keyword, + lastPopularityScore, lastPostId, lastLikeCnt, lastHit, diff --git a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java index 2627b96c..0d95980d 100644 --- a/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java +++ b/src/main/java/gaji/service/domain/post/web/controller/CommunityPostRestController.java @@ -85,7 +85,7 @@ public BaseResponse getPostDetail(@Min(v @Parameter(name = "lastLikeCnt", description = "마지막으로 조회한 게시글의 좋아요 수"), @Parameter(name = "lastHit", description = "마지막으로 조회한 게시글의 조회수"), @Parameter(name = "postType", description = "게시글의 유형(블로그, 프로젝트, 질문)"), - @Parameter(name = "categoryId", description = "카테고리의 id( /api/categories API로 조회해서 확인하시면 됩니다 )"), + @Parameter(name = "category", description = "카테고리"), @Parameter(name = "sortType", description = "정렬 유형(hot, recent, like, hit)"), @Parameter(name = "filter", description = "게시글의 상태(모집중, 모집완료, 미완료질문, 해결완료)"), }) @@ -101,7 +101,7 @@ public BaseResponse getPostPreivewL @Min(value = 0, message = "page는 0 이상 이어야 합니다.") @RequestParam(defaultValue = "0") int page, @Min(value = 1, message = "size는 1 이상 이어야 합니다.") @RequestParam(defaultValue = "10") int size) { - Slice postSlice = communityPostQueryService.getPostList(lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, category, sortType, filter, page, size); + Slice postSlice = communityPostQueryService.getPostList(keyword, lastPopularityScore, lastPostId, lastLikeCnt, lastHit, postType, category, sortType, filter, page, size); return BaseResponse.onSuccess(communityPostConverter.toPostPreviewListDTO(postSlice.getContent(), postSlice.hasNext())); } diff --git a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java index e527c67a..f0d4e3c5 100644 --- a/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java +++ b/src/main/java/gaji/service/domain/post/web/dto/CommunityPostResponseDTO.java @@ -2,6 +2,7 @@ import gaji.service.domain.common.web.dto.HashtagResponseDTO; import gaji.service.domain.enums.CategoryEnum; +import gaji.service.domain.enums.PostStatusEnum; import gaji.service.domain.enums.PostTypeEnum; import lombok.AllArgsConstructor; import lombok.Builder; @@ -53,6 +54,7 @@ public static class PostPreviewDTO { private String uploadTime; private int hit; private int popularityScore; + private PostStatusEnum status; private List hashtagList = new ArrayList<>(); } @@ -70,7 +72,6 @@ public static class PostPreviewListDTO { @NoArgsConstructor @AllArgsConstructor public static class PostDetailDTO { - private CategoryEnum category; private Long userId; private PostTypeEnum type; private String createdAt; @@ -85,6 +86,7 @@ public static class PostDetailDTO { private boolean likeStatus; private String body; private String category; + private PostStatusEnum status; private List hashtagList = new ArrayList<>(); } diff --git a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java index 896ce377..b940191a 100644 --- a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java +++ b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java @@ -92,8 +92,8 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo -// // 리다이렉션 URL 생성 - String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) + // 리다이렉션 URL 생성 + /*String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) .queryParam("access_token", accessToken) .build().toUriString(); From 4be978960825c32e3441e8ff79999fbeb0b7f9d9 Mon Sep 17 00:00:00 2001 From: strongmhk Date: Wed, 21 Aug 2024 12:57:30 +0900 Subject: [PATCH 40/44] =?UTF-8?q?=E2=9C=A8=20[#97]=20feature:=20=EC=BB=A8?= =?UTF-8?q?=EB=B2=84=ED=84=B0=EC=97=90=EC=84=9C=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=EB=A5=BC=20=ED=95=98=EB=8F=84=EB=A1=9D=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 --- .../domain/common/converter/CategoryConverter.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/common/converter/CategoryConverter.java b/src/main/java/gaji/service/domain/common/converter/CategoryConverter.java index 1d122843..1d5ded03 100644 --- a/src/main/java/gaji/service/domain/common/converter/CategoryConverter.java +++ b/src/main/java/gaji/service/domain/common/converter/CategoryConverter.java @@ -5,6 +5,8 @@ import gaji.service.domain.common.web.dto.CategoryResponseDTO; import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostTypeEnum; +import gaji.service.global.exception.RestApiException; +import gaji.service.global.exception.code.status.GlobalErrorStatus; import org.springframework.core.convert.converter.Converter; import java.util.List; @@ -15,7 +17,11 @@ public class CategoryConverter implements Converter { // @RequestParam으로 String->CategoryEnum으로 convert할 때 필요한 메서드 @Override public CategoryEnum convert(String source) { - return CategoryEnum.from(source); + CategoryEnum category = CategoryEnum.from(source); + if (category == null) { + throw new RestApiException(GlobalErrorStatus._INVALID_CATEGORY); + } + return category; } public static Category toCategory(CategoryEnum category) { From 6b011b0ec8f47e3d003814778c5b28bfbd24e428 Mon Sep 17 00:00:00 2001 From: strongmhk Date: Wed, 21 Aug 2024 12:58:11 +0900 Subject: [PATCH 41/44] =?UTF-8?q?:fire:=20[#97]=20remove:=20=EC=A3=BC?= =?UTF-8?q?=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/common/validation/CategoryExistsValidator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java b/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java index 26d4635c..9bee765e 100644 --- a/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java +++ b/src/main/java/gaji/service/domain/common/validation/CategoryExistsValidator.java @@ -22,7 +22,6 @@ public void initialize(ExistsCategory constraintAnnotation) { @Override public boolean isValid(String value, ConstraintValidatorContext context) { - // TODO: 유효하지 않은 카테고리값 들어왔을 때 boolean isValid = categoryService.existsByCategory(CategoryEnum.from(value)); if (!isValid) { From 3b37031b3e0d204de5d3e6829e7f97c12638959b Mon Sep 17 00:00:00 2001 From: strongmhk Date: Wed, 21 Aug 2024 13:29:30 +0900 Subject: [PATCH 42/44] =?UTF-8?q?:hammer:=20fix:=20redirection=20=EC=88=98?= =?UTF-8?q?=ED=96=89=ED=95=98=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/gaji/service/jwt/service/CustomSuccessHandler.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java index b940191a..27617b8f 100644 --- a/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java +++ b/src/main/java/gaji/service/jwt/service/CustomSuccessHandler.java @@ -93,12 +93,12 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 리다이렉션 URL 생성 - /*String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) + String targetUrl = UriComponentsBuilder.fromUriString(finalRedirectionUrl) .queryParam("access_token", accessToken) .build().toUriString(); // 리다이렉션 수행 - getRedirectStrategy().sendRedirect(request, response, targetUrl);*/ + getRedirectStrategy().sendRedirect(request, response, targetUrl); } private void addRefreshEntity(String username, String refresh, Long expiredMs) { From dc8b10d97bc3bb82ad23d0adfb7861b3fc5b0e9d Mon Sep 17 00:00:00 2001 From: ShimFFF <105415118+ShimFFF@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:54:28 +0900 Subject: [PATCH 43/44] =?UTF-8?q?:memo:=20Docs:=20=EC=8A=A4=ED=84=B0?= =?UTF-8?q?=EB=94=94=20=EC=84=A4=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index bbe0eb66..294fd39c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,2 @@ # Server -> 스터디 관리 서비스 "가지" 서버 +> 스터디 관리 서비스 "가지" 서버입니다 From 47ccda2b433209915f94ebcbb55b44ce6c111f0a Mon Sep 17 00:00:00 2001 From: shimfff Date: Wed, 21 Aug 2024 14:01:22 +0900 Subject: [PATCH 44/44] =?UTF-8?q?:sparkles:=20Feat:=20=ED=8F=AC=ED=8A=B8?= =?UTF-8?q?=20=EB=B2=88=ED=98=B8=208000=EB=B2=88=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gaji/service/domain/room/entity/Way.java | 20 ------------------- src/main/resources/application-dev.yml | 2 +- 2 files changed, 1 insertion(+), 21 deletions(-) delete mode 100644 src/main/java/gaji/service/domain/room/entity/Way.java diff --git a/src/main/java/gaji/service/domain/room/entity/Way.java b/src/main/java/gaji/service/domain/room/entity/Way.java deleted file mode 100644 index 35c3fa61..00000000 --- a/src/main/java/gaji/service/domain/room/entity/Way.java +++ /dev/null @@ -1,20 +0,0 @@ -package gaji.service.domain.room.entity; - -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Entity -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Way { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - private String name; -} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 0f4bfc41..d131c545 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -1,5 +1,5 @@ server: - port: 8080 + port: 8000 spring: application: