diff --git a/src/main/java/gaji/service/domain/common/entity/SelectCategory.java b/src/main/java/gaji/service/domain/common/entity/SelectCategory.java index 3d0f0969..5f575a8c 100644 --- a/src/main/java/gaji/service/domain/common/entity/SelectCategory.java +++ b/src/main/java/gaji/service/domain/common/entity/SelectCategory.java @@ -30,4 +30,8 @@ public SelectCategory(Category category, Long entityId, PostTypeEnum type) { this.entityId = entityId; this.type = type; } + + public void updateCategory(Category category) { + this.category = category; + } } \ No newline at end of file diff --git a/src/main/java/gaji/service/domain/common/repository/SelectCategoryRepository.java b/src/main/java/gaji/service/domain/common/repository/SelectCategoryRepository.java index 16af3119..e693d385 100644 --- a/src/main/java/gaji/service/domain/common/repository/SelectCategoryRepository.java +++ b/src/main/java/gaji/service/domain/common/repository/SelectCategoryRepository.java @@ -7,4 +7,8 @@ public interface SelectCategoryRepository extends JpaRepository, SelectCategoryQueryDslRepository { SelectCategory findByEntityIdAndType(Long entityId, PostTypeEnum type); + + void deleteByEntityIdAndType(Long entityId, PostTypeEnum type); + + boolean existsByEntityIdAndType(Long entityId, PostTypeEnum type); } 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 3618d7de..a36fc9b7 100644 --- a/src/main/java/gaji/service/domain/common/service/CategoryService.java +++ b/src/main/java/gaji/service/domain/common/service/CategoryService.java @@ -22,7 +22,10 @@ public interface CategoryService { SelectCategory findByEntityIdAndType(Long entityId, PostTypeEnum type); + void deleteByEntityIdAndType(Long entityId, PostTypeEnum type); + List findAllByCategory(CategoryEnum category); + boolean existsByEntityIdAndType(Long entityId, PostTypeEnum type); } 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 524da346..f1a0761b 100644 --- a/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java +++ b/src/main/java/gaji/service/domain/common/service/CategoryServiceImpl.java @@ -45,6 +45,11 @@ public List findAllByCategory(CategoryEnum category) { return categoryRepository.findAllByCategory(category); } + @Override + public boolean existsByEntityIdAndType(Long entityId, PostTypeEnum type) { + return selectCategoryRepository.existsByEntityIdAndType(entityId, type); + } + @Override public Category findByCategoryId(Long categoryId) { return categoryRepository.findById(categoryId) @@ -87,4 +92,9 @@ public void saveAllSelectCategory(List selectCategoryList) { public SelectCategory findByEntityIdAndType(Long entityId, PostTypeEnum type) { return selectCategoryRepository.findByEntityIdAndType(entityId, type); } + + @Override + public void deleteByEntityIdAndType(Long entityId, PostTypeEnum type) { + selectCategoryRepository.deleteByEntityIdAndType(entityId, type); + } } diff --git a/src/main/java/gaji/service/domain/enums/CategoryEnum.java b/src/main/java/gaji/service/domain/enums/CategoryEnum.java index 4fbd43b8..d1e22037 100644 --- a/src/main/java/gaji/service/domain/enums/CategoryEnum.java +++ b/src/main/java/gaji/service/domain/enums/CategoryEnum.java @@ -2,8 +2,6 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; -import gaji.service.global.exception.RestApiException; -import gaji.service.global.exception.code.status.GlobalErrorStatus; import lombok.Getter; import lombok.extern.slf4j.Slf4j; 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 ed0bd72e..f86408f0 100644 --- a/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/CommunityPostConverter.java @@ -1,13 +1,11 @@ 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; @@ -17,8 +15,8 @@ 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.CommunityPostResponseDTO; import gaji.service.domain.post.web.dto.CommunityPostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostResponseDTO; import gaji.service.domain.user.entity.User; import gaji.service.global.converter.DateConverter; import lombok.RequiredArgsConstructor; @@ -26,7 +24,6 @@ import java.time.LocalDate; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; @RequiredArgsConstructor 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 844b0b40..c6d53c7e 100644 --- a/src/main/java/gaji/service/domain/post/converter/PostStatusConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/PostStatusConverter.java @@ -1,10 +1,7 @@ package gaji.service.domain.post.converter; import gaji.service.domain.enums.PostStatusEnum; -import gaji.service.domain.post.code.CommunityPostErrorStatus; -import gaji.service.global.exception.RestApiException; import org.springframework.core.convert.converter.Converter; -import org.springframework.util.StringUtils; public class PostStatusConverter implements Converter { 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 27b75508..cb9b6392 100644 --- a/src/main/java/gaji/service/domain/post/converter/PostTypeConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/PostTypeConverter.java @@ -1,10 +1,7 @@ package gaji.service.domain.post.converter; import gaji.service.domain.enums.PostTypeEnum; -import gaji.service.domain.post.code.CommunityPostErrorStatus; -import gaji.service.global.exception.RestApiException; import org.springframework.core.convert.converter.Converter; -import org.springframework.util.StringUtils; public class PostTypeConverter implements Converter { 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 b8b2388f..f859135f 100644 --- a/src/main/java/gaji/service/domain/post/converter/SortTypeConverter.java +++ b/src/main/java/gaji/service/domain/post/converter/SortTypeConverter.java @@ -1,10 +1,7 @@ package gaji.service.domain.post.converter; import gaji.service.domain.enums.SortType; -import gaji.service.global.exception.RestApiException; -import gaji.service.global.exception.code.status.GlobalErrorStatus; import org.springframework.core.convert.converter.Converter; -import org.springframework.util.StringUtils; public class SortTypeConverter implements Converter { 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 19658c31..830ab88b 100644 --- a/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/post/repository/CommunityPostQueryDslRepositoryImpl.java @@ -158,7 +158,7 @@ private Slice checkLastPage(Pageable pageable, List postList) { private OrderSpecifier orderBySortType(SortType sortTypeCond) { return switch (sortTypeCond) { case HOT -> commnuityPost.popularityScore.desc(); // HOT: 인기점수 내림차순 - case LIKE -> commnuityPost.createdAt.desc(); // LIKE: 좋아요 내림차순 + case LIKE -> commnuityPost.likeCnt.desc(); // LIKE: 좋아요 내림차순 case HIT -> commnuityPost.hit.desc(); // HIT: 조회수 내림차순 default -> commnuityPost.createdAt.desc(); // null or RECENT: 최신순(생성일자 내림차순) }; 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 0d95980d..02fedc61 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 @@ -15,8 +15,8 @@ import gaji.service.domain.post.service.CommunityPostCommandService; 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.CommunityPostRequestDTO; +import gaji.service.domain.post.web.dto.CommunityPostResponseDTO; import gaji.service.global.base.BaseResponse; import gaji.service.jwt.service.TokenProviderService; import io.swagger.v3.oas.annotations.Operation; 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 f0d4e3c5..bcd2583c 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,7 +1,6 @@ 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.PostStatusEnum; import gaji.service.domain.enums.PostTypeEnum; import lombok.AllArgsConstructor; diff --git a/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java b/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java index 0d70d917..e49d568f 100644 --- a/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java +++ b/src/main/java/gaji/service/domain/recruit/code/RecruitErrorStatus.java @@ -11,6 +11,7 @@ @AllArgsConstructor public enum RecruitErrorStatus implements BaseErrorCodeInterface { _RECRUIT_POST_NOT_FOUND(HttpStatus.BAD_REQUEST, "RECRUIT_4001", "모집 게시글을 찾을 수 없습니다."), + _RECRUIT_POST_ALREADY_COMPLETE(HttpStatus.BAD_REQUEST, "RECRUIT4002", "이미 모집 완료된 게시글 입니다."), _COMMENT_NOT_FOUND(HttpStatus.BAD_REQUEST, "COMMENT_4001", "존재하지 않는 댓글입니다."), _COMMENT_ALREADY_DELETE(HttpStatus.BAD_REQUEST, "COMMENT_4002", "이미 삭제된 댓글입니다."), 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 9ef5031a..af88d5db 100644 --- a/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java +++ b/src/main/java/gaji/service/domain/recruit/converter/RecruitConverter.java @@ -5,14 +5,13 @@ 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; @@ -25,7 +24,7 @@ @Component public class RecruitConverter { - public static Room toRoom(RecruitRequestDTO.CreateRoomDTO request, User user, String thumbnailUrl, String inviteCode, int peopleMaximum) { + public static Room toRoom(RecruitRequestDTO.RoomContentDTO request, User user, String thumbnailUrl, String inviteCode, int peopleMaximum) { return Room.builder() .user(user) .name(request.getName()) @@ -42,12 +41,18 @@ public static Room toRoom(RecruitRequestDTO.CreateRoomDTO request, User user, St .build(); } - public static RecruitResponseDTO.CreateRoomResponseDTO toResponseDTO(Room room) { + public static RecruitResponseDTO.CreateRoomResponseDTO toCreateRoomResponseDTO(Room room) { return RecruitResponseDTO.CreateRoomResponseDTO.builder() .roomId(room.getId()) .build(); } + public static RecruitResponseDTO.UpdateRoomResponseDTO toUpdateRoomResponseDTO(Room room) { + return RecruitResponseDTO.UpdateRoomResponseDTO.builder() + .roomId(room.getId()) + .build(); + } + public static CategoryEnum toCategory(SelectCategory selectCategory) { return selectCategory.getCategory().getCategory(); } @@ -116,7 +121,7 @@ public static RecruitResponseDTO.CommentListResponseDTO toCommentListDTO(int com .build(); } - public static StudyComment toComment(RecruitRequestDTO.WriteCommentDTO request, User user, Room room, StudyComment parentComment) { + public static StudyComment toComment(RecruitRequestDTO.CommentContentDTO request, User user, Room room, StudyComment parentComment) { return StudyComment.builder() .user(user) .room(room) @@ -131,6 +136,12 @@ public static RecruitResponseDTO.WriteCommentResponseDTO toWriteCommentDTO(Study .build(); } + public static RecruitResponseDTO.UpdateCommentResponseDTO toUpdateCommentDTO(StudyComment comment) { + return RecruitResponseDTO.UpdateCommentResponseDTO.builder() + .commentId(comment.getId()) + .build(); + } + public static RecruitPostLikes toRecruitPostLikes(User user, Room room) { return RecruitPostLikes.builder() .user(user) @@ -180,4 +191,10 @@ public static RecruitResponseDTO.JoinStudyResponseDTO toJoinStudyResponseDTO(Lon .roomId(roomId) .build(); } + + public static RecruitResponseDTO.RecruitCompleteResponseDTO toRecruitCompleteResponseDTO(Long roomId) { + return RecruitResponseDTO.RecruitCompleteResponseDTO.builder() + .roomId(roomId) + .build(); + } } diff --git a/src/main/java/gaji/service/domain/recruit/entity/StudyComment.java b/src/main/java/gaji/service/domain/recruit/entity/StudyComment.java index aefbfeb9..6c399b5a 100644 --- a/src/main/java/gaji/service/domain/recruit/entity/StudyComment.java +++ b/src/main/java/gaji/service/domain/recruit/entity/StudyComment.java @@ -62,4 +62,9 @@ public StudyComment(User user, Room room, StudyComment parentComment, String bod this.commentOrder = parent.getCommentOrder(); } } + + public void update(String body) { + this.body = body; + this.status = CommentStatus.UPDATED; + } } diff --git a/src/main/java/gaji/service/domain/recruit/repository/RecruitCustomRepositoryImpl.java b/src/main/java/gaji/service/domain/recruit/repository/RecruitCustomRepositoryImpl.java index c9707ff7..8ce10478 100644 --- a/src/main/java/gaji/service/domain/recruit/repository/RecruitCustomRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/recruit/repository/RecruitCustomRepositoryImpl.java @@ -28,10 +28,9 @@ public RecruitResponseDTO.PreviewListResponseDTO findByCategoryOrderBySortType( CategoryEnum category, PreviewFilter filter, SortType sortType, String query, Long value, Pageable pageable) { List results = queryFactory .selectFrom(room) - .join(selectCategory).on(selectCategory.entityId.eq(room.id) - .and(selectCategory.type.eq(PostTypeEnum.ROOM)) - .and(categoryEq(category))) - .where(lastStudyValue(sortType, value), checkFilter(filter), searchPost(query)) + .leftJoin(selectCategory).on(selectCategory.entityId.eq(room.id) + .and(selectCategory.type.eq(PostTypeEnum.ROOM))) + .where(categoryEq(category), lastStudyValue(sortType, value), checkFilter(filter), searchPost(query)) .orderBy(getOrderSpecifier(sortType)) .limit(pageable.getPageSize() + 1) .fetch(); diff --git a/src/main/java/gaji/service/domain/recruit/repository/StudyCommentRepository.java b/src/main/java/gaji/service/domain/recruit/repository/StudyCommentRepository.java index 800cc9a5..fec04747 100644 --- a/src/main/java/gaji/service/domain/recruit/repository/StudyCommentRepository.java +++ b/src/main/java/gaji/service/domain/recruit/repository/StudyCommentRepository.java @@ -7,4 +7,6 @@ public interface StudyCommentRepository extends JpaRepository, StudyCommentCustomRepository { int countByRoom(Room room); + + void deleteAllByRoom(Room room); } 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 241b50bf..2f4a74ad 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandService.java @@ -7,7 +7,11 @@ public interface RecruitCommandService { - RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.CreateRoomDTO request, Long userId); + RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.RoomContentDTO request, Long userId); + + RecruitResponseDTO.UpdateRoomResponseDTO updateRoom(RecruitRequestDTO.RoomContentDTO request, Long userId, Long roomId); + + void deleteStudy(Long userId, Long roomId); RecruitResponseDTO.StudyLikesIdResponseDTO likeStudy(Long userId, Long roomId); @@ -23,6 +27,7 @@ public interface RecruitCommandService { void kickStudy(Long userId, Long roomId, Long targetId); + RecruitResponseDTO.RecruitCompleteResponseDTO recruitComplete(Long userId, Long roomId); 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 c23da98e..163e9018 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitCommandServiceImpl.java @@ -6,6 +6,7 @@ import gaji.service.domain.common.service.CategoryService; import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PostTypeEnum; +import gaji.service.domain.enums.RecruitPostTypeEnum; import gaji.service.domain.enums.Role; import gaji.service.domain.recruit.code.RecruitErrorStatus; import gaji.service.domain.recruit.converter.RecruitConverter; @@ -27,12 +28,12 @@ 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; import java.security.SecureRandom; +import java.util.List; import java.util.Random; @Service @@ -48,12 +49,11 @@ public class RecruitCommandServiceImpl implements RecruitCommandService { private final MaterialCommandService materialCommandService; private final RecruitPostLikesRepository recruitPostLikesRepository; private final RecruitPostBookmarkRepository recruitPostBookmarkRepository; - - private static final String DEFAULT_THUMBNAIL_URL = "https://gaji-bucket.s3.ap-northeast-2.amazonaws.com/study/gaji.png"; + private final StudyCommentCommandService studyCommentCommandService; @Override @Transactional - public RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.CreateRoomDTO request, Long userId) { + public RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.RoomContentDTO request, Long userId) { String inviteCode = null; int peopleMaximum = 0; @@ -72,29 +72,64 @@ public RecruitResponseDTO.CreateRoomResponseDTO createRoom(RecruitRequestDTO.Cre StudyMate studyMate = RecruitConverter.toStudyMate(user, room, Role.READER); studyMateCommandService.saveStudyMate(studyMate); - if (request.getMaterialList() != null && !request.getMaterialList().isEmpty()){ - Material material; - for (String MaterialUrl : request.getMaterialList()) { - material = RecruitConverter.toMaterial(MaterialUrl, room); - room.addMaterial(material); - materialCommandService.saveMaterial(material); - } + addMaterial(request.getMaterialList(), room); + roomCommandService.saveRoom(room); + + if (request.getCategory() != null && !request.getCategory().isBlank()) { + Category category = categoryService.findByCategory(CategoryEnum.fromValue(request.getCategory())); + + SelectCategory selectCategory = CategoryConverter.toSelectCategory(category, room.getId(), PostTypeEnum.ROOM); + categoryService.saveSelectCategory(selectCategory); } - roomCommandService.saveRoom(room); + return RecruitConverter.toCreateRoomResponseDTO(room); + } + + @Override + @Transactional + public RecruitResponseDTO.UpdateRoomResponseDTO updateRoom(RecruitRequestDTO.RoomContentDTO request, Long userId, Long roomId) { + Room room = roomQueryService.findRoomById(roomId); + + if (!room.getUser().getId().equals(userId)) { + throw new RestApiException(StudyMateErrorStatus._ONLY_LEADER_POSSIBLE); + } + + String inviteCode = null; + int peopleMaximum = 0; + + if (request.isPrivate()) { + inviteCode = generateInviteCode(); + } + + if (request.isPeopleLimited()) { + peopleMaximum = request.getPeopleMaximum(); + } + + room.update(request, request.getThumbnailUrl(), inviteCode, peopleMaximum); + ; - // if (request.getCategoryId() == null) { - // throw new RestApiException(GlobalErrorStatus._INVALID_CATEGORY); - // } + materialCommandService.deleteAllByRoom(room); + addMaterial(request.getMaterialList(), room); + + roomCommandService.saveRoom(room); - //Long categoryId = request.getCategoryId(); - //Category category = categoryService.findByCategoryId(categoryId); - Category category = categoryService.findAllByCategory(CategoryEnum.fromValue(request.getCategory())).get(0); + Category category = categoryService.findByCategory(CategoryEnum.fromValue(request.getCategory())); - 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); + return RecruitConverter.toUpdateRoomResponseDTO(room); + } + + private void addMaterial(List materialList, Room room) { + if (materialList != null && !materialList.isEmpty()){ + Material material; + for (String MaterialUrl : materialList) { + material = RecruitConverter.toMaterial(MaterialUrl, room); + room.addMaterial(material); + materialCommandService.saveMaterial(material); + } + } } private String generateInviteCode() { @@ -111,6 +146,21 @@ private String generateInviteCode() { return code.toString(); } + @Override + @Transactional + public void deleteStudy(Long userId, Long roomId) { + Room room = roomQueryService.findRoomById(roomId); + + if (!room.getUser().getId().equals(userId)) { + throw new RestApiException(StudyMateErrorStatus._ONLY_LEADER_POSSIBLE); + } + + studyCommentCommandService.deleteByRoom(room); + categoryService.deleteByEntityIdAndType(roomId, PostTypeEnum.ROOM); + + roomCommandService.deleteRoom(room); + } + @Override @Transactional public RecruitResponseDTO.StudyLikesIdResponseDTO likeStudy(Long userId, Long roomId) { @@ -223,6 +273,25 @@ public void kickStudy(Long userId, Long roomId, Long targetId) { } } + @Override + @Transactional + public RecruitResponseDTO.RecruitCompleteResponseDTO recruitComplete(Long userId, Long roomId) { + Room room = roomQueryService.findRoomById(roomId); + + if (room.getRecruitPostTypeEnum().equals(RecruitPostTypeEnum.RECRUITMENT_COMPLETED)) { + throw new RestApiException(RecruitErrorStatus._RECRUIT_POST_ALREADY_COMPLETE); + } + + if (!room.getUser().getId().equals(userId)) { + throw new RestApiException(StudyMateErrorStatus._ONLY_LEADER_POSSIBLE); + } + + room.updateRecruitStatus(RecruitPostTypeEnum.RECRUITMENT_COMPLETED); + roomCommandService.saveRoom(room); + + return RecruitConverter.toRecruitCompleteResponseDTO(roomId); + } + @Override public boolean userLikeStatus(Room room, User user) { return recruitPostLikesRepository.existsByUserAndRoom(user, 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 22fa6923..d429c624 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryService.java @@ -1,6 +1,5 @@ package gaji.service.domain.recruit.service; -import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PreviewFilter; import gaji.service.domain.enums.SortType; import gaji.service.domain.recruit.web.dto.RecruitResponseDTO; 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 140539db..f56dc77e 100644 --- a/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/RecruitQueryServiceImpl.java @@ -49,10 +49,16 @@ public RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId) { room.addView(); roomCommandService.saveRoom(room); - SelectCategory selectCategory = - categoryService.findByEntityIdAndType(room.getId(), PostTypeEnum.ROOM); + CategoryEnum category; + if (categoryService.existsByEntityIdAndType(roomId, PostTypeEnum.ROOM)) { + SelectCategory selectCategory = + categoryService.findByEntityIdAndType(room.getId(), PostTypeEnum.ROOM); + + category = RecruitConverter.toCategory(selectCategory); + } else { + category = null; + } - CategoryEnum category = RecruitConverter.toCategory(selectCategory); return RecruitConverter.toStudyDetailDTO(user, room, category, likeStatus, bookmarkStatus); } @@ -62,16 +68,11 @@ public RecruitResponseDTO.studyDetailResponseDTO getStudyDetail(Long roomId) { public RecruitResponseDTO.PreviewListResponseDTO getPreviewList( 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); diff --git a/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandService.java b/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandService.java index e75b831d..fc0e81de 100644 --- a/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandService.java +++ b/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandService.java @@ -2,13 +2,19 @@ import gaji.service.domain.recruit.web.dto.RecruitRequestDTO; import gaji.service.domain.recruit.web.dto.RecruitResponseDTO; +import gaji.service.domain.room.entity.Room; public interface StudyCommentCommandService { RecruitResponseDTO.WriteCommentResponseDTO writeComment( - Long userId, Long roomId, Long parentCommentId, RecruitRequestDTO.WriteCommentDTO request); + Long userId, Long roomId, Long parentCommentId, RecruitRequestDTO.CommentContentDTO request); + + RecruitResponseDTO.UpdateCommentResponseDTO updateComment( + Long userId, Long commentId, RecruitRequestDTO.CommentContentDTO request); void deleteComment(Long userId, Long commentId); + + void deleteByRoom(Room room); } diff --git a/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandServiceImpl.java b/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandServiceImpl.java index 1357f070..5796c1cb 100644 --- a/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/recruit/service/StudyCommentCommandServiceImpl.java @@ -26,7 +26,7 @@ public class StudyCommentCommandServiceImpl implements StudyCommentCommandServic private final RoomQueryService roomQueryService; @Override - public RecruitResponseDTO.WriteCommentResponseDTO writeComment(Long userId, Long roomId, Long parentCommentId, RecruitRequestDTO.WriteCommentDTO request) { + public RecruitResponseDTO.WriteCommentResponseDTO writeComment(Long userId, Long roomId, Long parentCommentId, RecruitRequestDTO.CommentContentDTO request) { User user = userQueryService.findUserById(userId); Room room = roomQueryService.findRoomById(roomId); @@ -36,6 +36,21 @@ public RecruitResponseDTO.WriteCommentResponseDTO writeComment(Long userId, Long return RecruitConverter.toWriteCommentDTO(comment); } + @Override + public RecruitResponseDTO.UpdateCommentResponseDTO updateComment(Long userId, Long commentId, RecruitRequestDTO.CommentContentDTO request) { + + StudyComment comment = studyCommentRepository.findById(commentId).orElseThrow(() -> new RestApiException(RecruitErrorStatus._COMMENT_NOT_FOUND)); + + if (!(comment.getUser().getId().equals(userId))) { + throw new RestApiException(RecruitErrorStatus._COMMENT_NOT_OWNER); + } + + comment.update(request.getBody()); + + studyCommentRepository.save(comment); + return RecruitConverter.toUpdateCommentDTO(comment); + } + @Override public void deleteComment(Long userId, Long commentId) { StudyComment comment = studyCommentRepository.findById(commentId) @@ -51,7 +66,7 @@ public void deleteComment(Long userId, Long commentId) { } private StudyComment createComment( - RecruitRequestDTO.WriteCommentDTO request, User user, Room room, Long parentCommentId) { + RecruitRequestDTO.CommentContentDTO request, User user, Room room, Long parentCommentId) { if (parentCommentId != null) { StudyComment parentComment = studyCommentRepository.findById(parentCommentId). orElseThrow(()->new RestApiException(RecruitErrorStatus._COMMENT_NOT_FOUND)); @@ -65,4 +80,8 @@ private StudyComment createComment( } + @Override + public void deleteByRoom(Room room) { + studyCommentRepository.deleteAllByRoom(room); + } } diff --git a/src/main/java/gaji/service/domain/recruit/validation/CategoryExistValidator.java b/src/main/java/gaji/service/domain/recruit/validation/CategoryExistValidator.java index b948c4e1..421c2cff 100644 --- a/src/main/java/gaji/service/domain/recruit/validation/CategoryExistValidator.java +++ b/src/main/java/gaji/service/domain/recruit/validation/CategoryExistValidator.java @@ -10,7 +10,7 @@ @Component @RequiredArgsConstructor -public class CategoryExistValidator implements ConstraintValidator { +public class CategoryExistValidator implements ConstraintValidator { @Override public void initialize(ExistCategory constraintAnnotation) { @@ -18,8 +18,8 @@ public void initialize(ExistCategory constraintAnnotation) { } @Override - public boolean isValid(CategoryEnum value, ConstraintValidatorContext context) { - if (value == null) { + public boolean isValid(String value, ConstraintValidatorContext context) { + if (value == null || value.isBlank()) { return true; } @@ -33,9 +33,9 @@ public boolean isValid(CategoryEnum value, ConstraintValidatorContext context) { return isValid; } - private boolean isEnumValueValid(CategoryEnum value) { + private boolean isEnumValueValid(String value) { for (CategoryEnum category : CategoryEnum.values()) { - if (category == value) { + if (category.getValue().equals(value)) { return true; } } 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 a94bb889..fd640385 100644 --- a/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java +++ b/src/main/java/gaji/service/domain/recruit/web/controller/RecruitController.java @@ -1,6 +1,5 @@ package gaji.service.domain.recruit.web.controller; -import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.enums.PreviewFilter; import gaji.service.domain.enums.SortType; import gaji.service.domain.recruit.service.RecruitCommandService; @@ -31,7 +30,7 @@ public class RecruitController { @PostMapping("") @Operation(summary = "스터디 모집 게시글 생성 API", description = "스터디 모집 게시글을 생성하는 API입니다.") public BaseResponse createRoom( - @RequestBody @Valid RecruitRequestDTO.CreateRoomDTO request, + @RequestBody @Valid RecruitRequestDTO.RoomContentDTO request, @RequestHeader("Authorization") String authorizationHeader) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); return BaseResponse.onSuccess( @@ -39,6 +38,30 @@ public BaseResponse createRoom( ); } + @PutMapping("/{roomId}") + @Operation(summary = "스터디 수정 API", description = "스터디를 수정하는 API입니다.") + public BaseResponse updateRoom( + @RequestHeader("Authorization") String authorizationHeader, + @RequestBody @Valid RecruitRequestDTO.RoomContentDTO request, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + + + return BaseResponse.onSuccess( + recruitCommandService.updateRoom(request, userId, roomId) + ); + } + + @DeleteMapping("/{roomId}") + @Operation(summary = "스터디 삭제 API", description = "스터디를 삭제하는 API입니다. 스터디와 관련된 북마크, 좋아요, 댓글 내역을 모두 삭제합니다.") + public BaseResponse deleteStudy( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + recruitCommandService.deleteStudy(userId, roomId); + return BaseResponse.onSuccess(null); + } + @GetMapping("/{roomId}") @Operation(summary = "스터디 정보 상세 조회 API", description = "스터디 상세 정보를 조회하는 API입니다.") public BaseResponse getStudyDetail(@PathVariable Long roomId) { @@ -65,13 +88,25 @@ public BaseResponse writeComment( @RequestHeader("Authorization") String authorizationHeader, @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId, @RequestParam(required = false) @Min(value = 1, message = "parentCommentId는 1 이상 이어야 합니다.") Long parentCommentId, - @RequestBody @Valid RecruitRequestDTO.WriteCommentDTO request) { + @RequestBody @Valid RecruitRequestDTO.CommentContentDTO request) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); RecruitResponseDTO.WriteCommentResponseDTO responseDTO = studyCommentCommandService.writeComment(userId, roomId, parentCommentId, request); return BaseResponse.onSuccess(responseDTO); } + @PutMapping("/comments/{commentId}") + @Operation(summary = "스터디 댓글 수정 API", description = "스터디 댓글을 수정하는 API입니다.") + public BaseResponse updateComment( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "commentId는 1 이상 이어야 합니다.") Long commentId, + @RequestBody @Valid RecruitRequestDTO.CommentContentDTO request) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + return BaseResponse.onSuccess( + studyCommentCommandService.updateComment(userId, commentId, request) + ); + } + @DeleteMapping("/comments/{commentId}") @Operation(summary = "스터디 댓글 삭제 API", description = "스터디 댓글을 삭제하는 API입니다. 댓글의 자식 댓글들도 모두 삭제됩니다.") public BaseResponse deleteComment( @@ -139,7 +174,7 @@ public BaseResponse getPreviewList( @GetMapping("/preview-default") @Operation(summary = "스터디 미리보기 목록 조회 기본 페이지 API", description = "스터디 목록 조회 기본 페이지입니다.") public BaseResponse getDefaultPreviewList( - @RequestParam(defaultValue = "0") @Min(value = 1, message = "nextCategoryId는 1이상 이어야 합니다.") int nextCategoryId, + @RequestParam(defaultValue = "1") @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) { @@ -178,5 +213,16 @@ public BaseResponse kickStudy( recruitCommandService.kickStudy(userId, roomId, targetId); return BaseResponse.onSuccess(null); } + + @PutMapping("/complete-recruit/{roomId}") + @Operation(summary = "스터디 모집 완료 API", description = "스터디 모집 상태를 완료로 바꾸는 API 입니다.") + public BaseResponse recruitComplete( + @RequestHeader("Authorization") String authorizationHeader, + @PathVariable @Min(value = 1, message = "roomId는 1 이상 이어야 합니다.") Long roomId) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + return BaseResponse.onSuccess( + recruitCommandService.recruitComplete(userId, roomId) + ); + } } 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 65d2a915..d604ca9b 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 @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; -import gaji.service.domain.enums.CategoryEnum; import gaji.service.domain.recruit.annotation.ExistCategory; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.Min; @@ -20,7 +19,7 @@ public class RecruitRequestDTO { @Schema(description = "스터디 생성 DTO") @Getter @RequiredArgsConstructor - public static class CreateRoomDTO { + public static class RoomContentDTO { @Schema(description = "스터디 이름") @Size(max = 20, message = "스터디 명은 20자 이내로 입력해주세요.") @@ -72,15 +71,15 @@ public static class CreateRoomDTO { @Min(value = 1, message = "최대 인원은 1이상 이어야 합니다.") private int peopleMaximum; - //@Schema(description = "카테고리의 id") - //@Min(value = 1, message = "id는 1이상 이어야 합니다.") + @Schema(description = "카테고리") + @ExistCategory private String category; } @Schema(description = "스터디 댓글 작성 DTO") @Getter @RequiredArgsConstructor - public static class WriteCommentDTO { + public static class CommentContentDTO { @Schema(description = "댓글 내용") @NotBlank(message = "댓글 내용을 입력해주세요.") private String body; 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 7b988d3e..45ed7c0c 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 @@ -22,6 +22,14 @@ public static class CreateRoomResponseDTO { Long roomId; } + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class UpdateRoomResponseDTO { + Long roomId; + } + @Builder @Getter @NoArgsConstructor @@ -101,6 +109,14 @@ public static class WriteCommentResponseDTO { Long commentId; } + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class UpdateCommentResponseDTO { + Long commentId; + } + @Builder @Getter @NoArgsConstructor @@ -154,4 +170,12 @@ public static class DefaultPreviewListResponseDTO { public static class JoinStudyResponseDTO { Long roomId; } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RecruitCompleteResponseDTO { + Long roomId; + } } 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 7bd7f044..ed66050e 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,7 @@ 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/converter/RoomConverter.java b/src/main/java/gaji/service/domain/room/converter/RoomConverter.java index c9dacbf6..38204154 100644 --- a/src/main/java/gaji/service/domain/room/converter/RoomConverter.java +++ b/src/main/java/gaji/service/domain/room/converter/RoomConverter.java @@ -1,5 +1,6 @@ package gaji.service.domain.room.converter; +import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.entity.RoomNotice; import gaji.service.domain.room.web.dto.RoomResponseDto; import gaji.service.domain.studyMate.entity.Assignment; @@ -18,4 +19,17 @@ public static RoomResponseDto.RoomNoticeDto toRoomNoticeDto(RoomNotice roomNotic .noticeId(roomNotice.getId()) .build(); } + + public static RoomResponseDto.roomEventIdDto toRoomEventIdDto(RoomEvent roomEvent) { + return RoomResponseDto.roomEventIdDto.builder() + .roomEventId(roomEvent.getId()) + .build(); + } + + + public static RoomResponseDto.AssignmentIdDto toAssignmentIdDto(Assignment assignment) { + return RoomResponseDto.AssignmentIdDto.builder() + .assignmentId(assignment.getId()) + .build(); + } } diff --git a/src/main/java/gaji/service/domain/room/entity/Room.java b/src/main/java/gaji/service/domain/room/entity/Room.java index 9264822e..c30cadd6 100644 --- a/src/main/java/gaji/service/domain/room/entity/Room.java +++ b/src/main/java/gaji/service/domain/room/entity/Room.java @@ -4,6 +4,7 @@ import gaji.service.domain.enums.RecruitPostTypeEnum; import gaji.service.domain.recruit.entity.RecruitPostBookmark; import gaji.service.domain.recruit.entity.RecruitPostLikes; +import gaji.service.domain.recruit.web.dto.RecruitRequestDTO; import gaji.service.domain.roomBoard.entity.RoomBoard; import gaji.service.domain.studyMate.entity.Chat; import gaji.service.domain.studyMate.entity.StudyApplicant; @@ -157,4 +158,22 @@ public void increaseBookmark() { public void decreaseBookmark() { this.bookmarks--; } + + public void update(RecruitRequestDTO.RoomContentDTO request, String thumbnailUrl, String inviteCode, int peopleMaximum) { + this.name = request.getName(); + this.description = request.getDescription(); + this.thumbnailUrl = thumbnailUrl; + this.recruitStartDay = request.getRecruitStartDay(); + this.recruitEndDay = request.getRecruitEndDay(); + this.studyStartDay = request.getStudyStartDay(); + this.studyEndDay = request.getStudyEndDay(); + this.isPrivate = request.isPrivate(); + this.inviteCode = inviteCode; + this.peopleLimited = request.isPeopleLimited(); + this.peopleMaximum = peopleMaximum; + } + + public void updateRecruitStatus(RecruitPostTypeEnum recruitType) { + this.recruitPostTypeEnum = recruitType; + } } diff --git a/src/main/java/gaji/service/domain/room/entity/RoomEvent.java b/src/main/java/gaji/service/domain/room/entity/RoomEvent.java index 2b1f6337..73833ced 100644 --- a/src/main/java/gaji/service/domain/room/entity/RoomEvent.java +++ b/src/main/java/gaji/service/domain/room/entity/RoomEvent.java @@ -49,13 +49,10 @@ public class RoomEvent { private boolean isPublic; - - - - - - - - + public void updateEvent(LocalDate startTime, LocalDate endTime, String description) { + this.startTime = startTime; + this.endTime = endTime; + this.description = description; + } } diff --git a/src/main/java/gaji/service/domain/room/repository/MaterialRepository.java b/src/main/java/gaji/service/domain/room/repository/MaterialRepository.java index cd3f72c5..15cb7ead 100644 --- a/src/main/java/gaji/service/domain/room/repository/MaterialRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/MaterialRepository.java @@ -1,7 +1,10 @@ package gaji.service.domain.room.repository; import gaji.service.domain.room.entity.Material; +import gaji.service.domain.room.entity.Room; import org.springframework.data.jpa.repository.JpaRepository; public interface MaterialRepository extends JpaRepository { + + void deleteAllByRoom(Room room); } diff --git a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java index aecc6e6a..de9a08dd 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java @@ -9,5 +9,7 @@ public interface RoomCustomRepository { public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable); + public Slice findAllOngoingRoomsByUser(User user, Pageable pageable); public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable); + public Slice findAllEndedRoomsByUser(User user, Pageable pageable); } diff --git a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java index 857c1fde..0a6b3a4a 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java @@ -33,8 +33,7 @@ public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, L List ongoingRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl, room.studyStartDay) .from(room) .where(room.id.in(userRoomIds) - .and(room.studyEndDay.after(getCurrentDay())) - .and(room.studyStartDay.before(getCurrentDay()).or(room.studyStartDay.goe(getCurrentDay()))) // 시작일이 현재 날짜 이전이거나 이후인 경우 포함 + .and(room.studyEndDay.after(getCurrentDay().minusDays(1))) .and(getCursorCondition(cursorDate, cursorId))) .orderBy(room.studyStartDay.desc(), room.id.asc()) .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 @@ -43,20 +42,33 @@ public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, L return checkLastPage(pageable, ongoingRooms); } + public Slice findAllOngoingRoomsByUser(User user, Pageable pageable) { + List userRoomIds = jpaQueryFactory + .select(studyMate.room.id) + .from(studyMate) + .where(studyMate.user.eq(user)) + .fetch(); - public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable) { - LocalDate now = LocalDate.now(); + List ongoingRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl, room.studyStartDay) + .from(room) + .where(room.id.in(userRoomIds) + .and(room.studyEndDay.after(getCurrentDay().minusDays(1)))) + .orderBy(room.studyStartDay.desc(), room.id.asc()) + .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 + .fetch(); - BooleanExpression cursorCondition = (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) - .or(room.studyStartDay.lt(cursorDate)); + return checkLastPage(pageable, ongoingRooms); + } + + public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable) { List userRoomIds = jpaQueryFactory .select(studyMate.room.id) .from(studyMate) .where(studyMate.user.eq(user)) .fetch(); - List ongoingRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl, room.studyStartDay) + List endedRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl, room.studyStartDay) .from(room) .where(room.id.in(userRoomIds) .and(room.studyEndDay.before(getCurrentDay())) @@ -65,7 +77,25 @@ public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Lon .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 .fetch(); - return checkLastPage(pageable, ongoingRooms); + return checkLastPage(pageable, endedRooms); + } + + public Slice findAllEndedRoomsByUser(User user, Pageable pageable) { + List userRoomIds = jpaQueryFactory + .select(studyMate.room.id) + .from(studyMate) + .where(studyMate.user.eq(user)) + .fetch(); + + List endedRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl, room.studyStartDay) + .from(room) + .where(room.id.in(userRoomIds) + .and(room.studyEndDay.before(getCurrentDay()))) + .orderBy(room.studyStartDay.desc(), room.id.asc()) + .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 + .fetch(); + + return checkLastPage(pageable, endedRooms); } diff --git a/src/main/java/gaji/service/domain/room/service/MaterialCommandService.java b/src/main/java/gaji/service/domain/room/service/MaterialCommandService.java index 5498aa0b..7c867fe1 100644 --- a/src/main/java/gaji/service/domain/room/service/MaterialCommandService.java +++ b/src/main/java/gaji/service/domain/room/service/MaterialCommandService.java @@ -1,7 +1,10 @@ package gaji.service.domain.room.service; import gaji.service.domain.room.entity.Material; +import gaji.service.domain.room.entity.Room; public interface MaterialCommandService { void saveMaterial(Material material); + + void deleteAllByRoom(Room room); } diff --git a/src/main/java/gaji/service/domain/room/service/MaterialCommandServiceImpl.java b/src/main/java/gaji/service/domain/room/service/MaterialCommandServiceImpl.java index 80b5eadd..d5eaa958 100644 --- a/src/main/java/gaji/service/domain/room/service/MaterialCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/MaterialCommandServiceImpl.java @@ -1,6 +1,7 @@ package gaji.service.domain.room.service; import gaji.service.domain.room.entity.Material; +import gaji.service.domain.room.entity.Room; import gaji.service.domain.room.repository.MaterialRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -15,4 +16,9 @@ public class MaterialCommandServiceImpl implements MaterialCommandService { public void saveMaterial(Material material) { materialRepository.save(material); } + + @Override + public void deleteAllByRoom(Room room) { + materialRepository.deleteAllByRoom(room); + } } 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 c519b54a..ffd3e7e1 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandService.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandService.java @@ -22,14 +22,21 @@ public interface RoomCommandService { @Transactional RoomNotice createNotice(Long roomId, Long userId, RoomRequestDto.RoomNoticeDto requestDto); + Assignment updateAssignment(Long assignmentId, String newBody); + + void deleteAssignment(Long assignmentId); + RoomEvent setStudyPeriod(Long roomId, Integer weeks, Long userId, RoomRequestDto.StudyPeriodDto requestDto); RoomEvent setStudyDescription(Long roomId, Integer weeks, Long userId, RoomRequestDto.StudyDescriptionDto requestDto); + RoomEvent updateRoomEvent(Long roomId, Integer weeks, RoomRequestDto.RoomEventUpdateDTO updateDTO); + boolean toggleNoticeConfirmation(Long roomId, Long noticeId, Long userId); void saveRoom(Room room); + void deleteRoom(Room room); RoomResponseDto.AssignmentProgressResponse toggleAssignmentCompletion(Long userId, Long userAssignmentId); 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 f4fc561c..a14350f3 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java @@ -102,6 +102,24 @@ public void createUserAssignmentsForStudyMembers(Assignment assignment) { userAssignmentRepository.save(userAssignment); } } + @Override + public Assignment updateAssignment(Long assignmentId, String newBody) { + Assignment assignment = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._ASSIGNMENT_NOT_FOUND)); + + assignment.updateBody(newBody); + + return assignment; + } + + @Override + public void deleteAssignment(Long assignmentId) { + Assignment assignment = assignmentRepository.findById(assignmentId) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._ASSIGNMENT_NOT_FOUND)); + + // UserAssignment들은 CascadeType.ALL과 orphanRemoval = true 설정으로 인해 자동으로 삭제됩니다. + assignmentRepository.delete(assignment); + } @Override public RoomEvent setStudyPeriod(Long roomId, Integer weeks, Long userId, RoomRequestDto.StudyPeriodDto requestDto) { @@ -113,7 +131,7 @@ public RoomEvent setStudyPeriod(Long roomId, Integer weeks, Long userId, RoomReq throw new RestApiException(RoomErrorStatus._USER_NOT_READER_IN_ROOM); } - RoomEvent roomEvent = roomEventRepository.findRoomEventById(roomId) + RoomEvent roomEvent = roomEventRepository.findRoomEventByRoomIdAndWeeks(roomId,weeks) .orElse(RoomEvent.builder().room(room).user(user).build()); RoomEvent updatedRoomEvent = RoomEvent.builder() @@ -131,6 +149,8 @@ public RoomEvent setStudyPeriod(Long roomId, Integer weeks, Long userId, RoomReq return roomEventRepository.save(updatedRoomEvent); } + + @Override public RoomEvent setStudyDescription(Long roomId, Integer weeks, Long userId, RoomRequestDto.StudyDescriptionDto requestDto) { User user = userQueryService.findUserById(userId); @@ -142,7 +162,7 @@ public RoomEvent setStudyDescription(Long roomId, Integer weeks, Long userId, Ro throw new RestApiException(RoomErrorStatus._USER_NOT_READER_IN_ROOM); } - RoomEvent roomEvent = roomEventRepository.findRoomEventById(roomId) + RoomEvent roomEvent = roomEventRepository.findRoomEventByRoomIdAndWeeks(roomId,weeks) .orElse(RoomEvent.builder().room(room).user(user).build()); RoomEvent updatedRoomEvent = RoomEvent.builder() @@ -160,6 +180,17 @@ public RoomEvent setStudyDescription(Long roomId, Integer weeks, Long userId, Ro return roomEventRepository.save(updatedRoomEvent); } + @Override + public RoomEvent updateRoomEvent(Long roomId, Integer weeks, RoomRequestDto.RoomEventUpdateDTO updateDTO) { + RoomEvent roomEvent = roomEventRepository.findRoomEventByRoomIdAndWeeks(roomId,weeks) + .orElseThrow(() -> new RestApiException(RoomErrorStatus._ROOM_EVENT_NOT_FOUND)); + + roomEvent.updateEvent(updateDTO.getStartTime(), updateDTO.getEndTime(), updateDTO.getDescription()); + roomEventRepository.save(roomEvent); + + return roomEvent; + } + @Override public boolean toggleNoticeConfirmation(Long roomId, Long noticeId, Long userId) { RoomNotice roomNotice = roomNoticeRepository.findById(noticeId) @@ -193,8 +224,10 @@ public void saveRoom(Room room) { roomRepository.save(room); } - - + @Override + public void deleteRoom(Room room) { + roomRepository.delete(room); + } @Override public RoomResponseDto.AssignmentProgressResponse toggleAssignmentCompletion(Long userId, Long userAssignmentId) { UserAssignment userAssignment = userAssignmentRepository.findById(userAssignmentId) 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 54dcab95..6ea9d3a1 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 @@ -1,10 +1,13 @@ package gaji.service.domain.room.web.controller; +import gaji.service.domain.room.converter.RoomConverter; import gaji.service.domain.room.entity.RoomEvent; import gaji.service.domain.room.service.RoomCommandService; import gaji.service.domain.room.service.RoomQueryService; import gaji.service.domain.room.web.dto.RoomRequestDto; import gaji.service.domain.room.web.dto.RoomResponseDto; +import gaji.service.domain.roomBoard.service.RoomPost.RoomPostQueryService; +import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto; import gaji.service.domain.studyMate.entity.Assignment; import gaji.service.global.base.BaseResponse; import gaji.service.jwt.service.TokenProviderService; @@ -25,6 +28,7 @@ public class RoomMainController { private final RoomCommandService roomCommandService; private final RoomQueryService roomQueryService; private final TokenProviderService tokenProviderService; + private final RoomPostQueryService roomPostQueryService; @PostMapping("/assignments/{roomId}/{weeks}") @Operation(summary = "스터디룸 과제 등록 API", description = "스터디룸의 과제를 등록하는 API입니다. room의 id가 존재하는지, 스터디에 참여하고 있는 user인지 검증합니다.") @@ -74,6 +78,32 @@ public BaseResponse setStudyDescription( return BaseResponse.onSuccess(responseDto); } + + @PutMapping("/event/{weeks}/{roomId}/update") + @Operation(summary = "주차별 스터디 일정 수정 API", description = "Update the start time, end time, and description of a room event") + public BaseResponse updateRoomEvent( + @PathVariable Long roomId, + @PathVariable Integer weeks, + @RequestBody RoomRequestDto.RoomEventUpdateDTO updateDTO) { + RoomEvent updatedEvent = roomCommandService.updateRoomEvent(roomId,weeks, updateDTO); + return BaseResponse.onSuccess(RoomConverter.toRoomEventIdDto(updatedEvent)); + } + + @PutMapping("/event/{assignmentId}/update") + @Operation(summary = "주차별 스터디 과제 수정 API") + public BaseResponse updateAssignment( + @PathVariable Long assignmentId, + @RequestBody RoomRequestDto.AssignmentUpdateDTO request) { + Assignment updatedAssignment = roomCommandService.updateAssignment(assignmentId, request.getDescription()); + return BaseResponse.onSuccess(RoomConverter.toAssignmentIdDto(updatedAssignment)); + } + + @DeleteMapping("/{assignmentId}") + public BaseResponse deleteAssignment(@PathVariable Long assignmentId) { + roomCommandService.deleteAssignment(assignmentId); + return BaseResponse.onSuccess("delete Complete"); + } + @PostMapping("/main/assignment/{userAssignmentId}") @Operation(summary = "주차별 과제 체크 박스 체크", description = "과제 체크 박스를 클릭하면 과제 완료 상태를 토글합니다.") public ResponseEntity toggleAssignmentCompletion( @@ -111,10 +141,18 @@ public BaseResponse GetRoomMainController(@PathVari return BaseResponse.onSuccess(roomQueryService.getMainStudyRoom(roomId)); } - @GetMapping("/roomPost/{roomId}") + @GetMapping("/home/notice/{roomId}") @Operation(summary = "스터디룸 main 화면 공지사항 정보 조회 API") public BaseResponse GetMainRoomNoticeController(@PathVariable Long roomId){ return BaseResponse.onSuccess(roomQueryService.getMainRoomNotice(roomId)); } + @GetMapping("/home/post/{roomId}") + @Operation(summary = "스터디룸 main 화면 게시글 최신순 3개 조회 API") + public BaseResponse> getMainPostController(@PathVariable Long roomId){ + return BaseResponse.onSuccess(roomPostQueryService.getLatestPosts(roomId)); + } + + + } 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 6d21143b..d6b0dd0f 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 @@ -6,10 +6,7 @@ import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import java.time.LocalDate; import java.util.ArrayList; @@ -66,4 +63,19 @@ public static class StudyDescriptionDto { private String description; } + @Getter + @Setter + public static class RoomEventUpdateDTO { + private LocalDate startTime; + private LocalDate endTime; + private String description; + } + + @Getter + @Setter + public static class AssignmentUpdateDTO { + private String description; + } + + } 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..29f09d2b 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 @@ -243,4 +243,22 @@ public RoomMainNoticeDto(Long id, String authorName, String title, String body, public static class IsConfirmedResponse { private Boolean isConfirmed; } + + @Getter + @Setter + @AllArgsConstructor + @Builder + @RequiredArgsConstructor + public static class roomEventIdDto { + private Long roomEventId; + } + + @Getter + @Setter + @AllArgsConstructor + @Builder + @RequiredArgsConstructor + public static class AssignmentIdDto { + private Long assignmentId; + } } \ No newline at end of file diff --git a/src/main/java/gaji/service/domain/roomBoard/entity/RoomBoard.java b/src/main/java/gaji/service/domain/roomBoard/entity/RoomBoard.java index e7cc5539..69a9103b 100644 --- a/src/main/java/gaji/service/domain/roomBoard/entity/RoomBoard.java +++ b/src/main/java/gaji/service/domain/roomBoard/entity/RoomBoard.java @@ -26,6 +26,7 @@ public class RoomBoard { @JoinColumn(name = "room_id") private Room room; + //추후 삭제합시다. RoomPostType으로 한정된 게시판을 관리한다면 필요 없을거같습니다. private String name; @Enumerated(EnumType.STRING) 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 1cfcc61b..dca8e396 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 @@ -1,6 +1,7 @@ package gaji.service.domain.roomBoard.repository.RoomPost; import gaji.service.domain.roomBoard.entity.RoomPost.RoomPost; +import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto; import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto.PostSummaryDto; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -31,4 +32,12 @@ List findPostSummariesForInfiniteScroll( "END") Optional findCreatedAtByIdOrEarliest(@Param("boardId") Long boardId, @Param("postId") Long postId); + + + @Query("SELECT new gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto$MainPostSummaryDto(" + + "rp.id, rp.title, rp.body, rp.studyMate.user.nickname, rp.createdAt, rp.viewCount) " + + "FROM RoomPost rp " + + "WHERE rp.roomBoard.id = :boardId " + + "ORDER BY rp.createdAt DESC") + List findLatestPostsSummary(@Param("boardId") Long boardId, Pageable pageable); } 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 1432b643..6a582442 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 @@ -14,6 +14,8 @@ public interface RoomPostQueryService { // List getPaginatedTroublePosts(Long boardId, int page, int size); + List getLatestPosts(Long boardId); + 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 8c901dfe..abdf1f88 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 @@ -12,6 +12,7 @@ import gaji.service.domain.roomBoard.web.dto.RoomPostResponseDto; import gaji.service.domain.studyMate.entity.StudyMate; import gaji.service.domain.studyMate.service.StudyMateQueryService; +import gaji.service.global.converter.DateConverter; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.*; @@ -37,6 +38,22 @@ public List getTop3RecentPosts(Long roomId) { return roomPostQueryRepository.findTop3RecentPostsWithUserInfo(roomId); } + @Override + public List getLatestPosts(Long roomId) { + Pageable pageable = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "createdAt")); + RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_POST) + .orElseThrow(() -> new RestApiException(RoomPostErrorStatus._ROOM_BOARD_NOT_FOUND)); + + List posts = roomPostRepository.findLatestPostsSummary(roomBoard.getId(), pageable); + + LocalDateTime now = LocalDateTime.now(); + for (RoomPostResponseDto.MainPostSummaryDto post : posts) { + post.setTimeSincePosted(DateConverter.convertToRelativeTimeFormat(post.getCreatedAt())); + } + + return posts; + } + @Override public List getNextPosts(Long roomId, Long lastPostId, int size) { RoomBoard roomBoard = roomBoardRepository.findRoomBoardByRoomIdAndRoomPostType(roomId, RoomPostType.ROOM_POST) diff --git a/src/main/java/gaji/service/domain/roomBoard/web/dto/RoomPostResponseDto.java b/src/main/java/gaji/service/domain/roomBoard/web/dto/RoomPostResponseDto.java index 08395cf0..f142a093 100644 --- a/src/main/java/gaji/service/domain/roomBoard/web/dto/RoomPostResponseDto.java +++ b/src/main/java/gaji/service/domain/roomBoard/web/dto/RoomPostResponseDto.java @@ -15,7 +15,27 @@ public class RoomPostResponseDto { public static class CreateRoomPostDTO { Long postId; } + @Getter + @Setter + @AllArgsConstructor + public static class MainPostSummaryDto { + private Long id; + private String title; + private String body; + private String userNickname; + private LocalDateTime createdAt; + private int viewCount; + private String timeSincePosted; + public MainPostSummaryDto(Long id, String title, String body, String userNickname, LocalDateTime createdAt, int viewCount) { + this.id = id; + this.title = title; + this.body = body; + this.userNickname = userNickname; + this.createdAt = createdAt; + this.viewCount = viewCount; + } + } @Getter @AllArgsConstructor @NoArgsConstructor @@ -82,6 +102,7 @@ public TroublePostSummaryDto(Long id, String title, String nickname, LocalDateTi } @Getter + @Setter public static class PostSummaryDto { private final Long id; private final String title; 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 da576180..b8f39509 100644 --- a/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java +++ b/src/main/java/gaji/service/domain/studyMate/code/StudyMateErrorStatus.java @@ -13,7 +13,7 @@ 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", "스터디 리더만 가능한 작업입니다."), + _ONLY_LEADER_POSSIBLE(HttpStatus.FORBIDDEN, "StudyMateError_4003", "스터디 리더만 가능한 작업입니다."), _LEADER_IMPOSSIBLE_LEAVE(HttpStatus.BAD_REQUEST, "StudyMateError_4004", "스터디 리더는 나갈 수 없습니다."), ; diff --git a/src/main/java/gaji/service/domain/studyMate/entity/Assignment.java b/src/main/java/gaji/service/domain/studyMate/entity/Assignment.java index 0ccabdec..96fa2fff 100644 --- a/src/main/java/gaji/service/domain/studyMate/entity/Assignment.java +++ b/src/main/java/gaji/service/domain/studyMate/entity/Assignment.java @@ -24,7 +24,20 @@ public class Assignment { @Column(length = 30) private String body; - @OneToMany(mappedBy = "assignment", cascade = CascadeType.ALL) + @OneToMany(mappedBy = "assignment", cascade = CascadeType.ALL, orphanRemoval = true) private final List userAssignmentList = new ArrayList<>(); + public void updateBody(String body) { + this.body = body; + } + + public void addUserAssignment(UserAssignment userAssignment) { + this.userAssignmentList.add(userAssignment); + userAssignment.setAssignment(this); + } + + public void removeUserAssignment(UserAssignment userAssignment) { + this.userAssignmentList.remove(userAssignment); + userAssignment.setAssignment(null); + } } diff --git a/src/main/java/gaji/service/domain/studyMate/entity/UserAssignment.java b/src/main/java/gaji/service/domain/studyMate/entity/UserAssignment.java index 7705616f..719da0ac 100644 --- a/src/main/java/gaji/service/domain/studyMate/entity/UserAssignment.java +++ b/src/main/java/gaji/service/domain/studyMate/entity/UserAssignment.java @@ -22,10 +22,13 @@ public class UserAssignment { @JoinColumn(name = "assignment_id") private Assignment assignment; - //완료여부 private boolean isComplete; public void setComplete(boolean isComplete) { this.isComplete = isComplete; } + + public void setAssignment(Assignment assignment) { + this.assignment = assignment; + } } diff --git a/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java b/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java index 9d6df1cd..07fa25d1 100644 --- a/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java @@ -49,18 +49,25 @@ public Slice getUserRoomList(Long userId, LocalDate cursorDate, Long curs User user = userRepository.findById(userId) .orElseThrow(() -> new RestApiException(UserErrorStatus._USER_NOT_FOUND)); - cursorDate = cursorDate == null ? LocalDate.now() : cursorDate; - cursorId = cursorId == null ? 0 : cursorId; - PageRequest pageRequest = PageRequest.of(0, size); Slice roomList; if(type == RoomTypeEnum.ONGOING) { - roomList = roomCustomRepository.findAllOngoingRoomsByUser(user, cursorDate, cursorId, pageRequest); + if(cursorId != null || cursorDate != null) { + roomList = roomCustomRepository.findAllOngoingRoomsByUser(user, cursorDate, cursorId, pageRequest); + } + else { + roomList = roomCustomRepository.findAllOngoingRoomsByUser(user, pageRequest); + } } else{ - roomList = roomCustomRepository.findAllEndedRoomsByUser(user, cursorDate, cursorId, pageRequest); + if(cursorId != null || cursorDate != null) { + roomList = roomCustomRepository.findAllEndedRoomsByUser(user, cursorDate, cursorId, pageRequest); + } + else { + roomList = roomCustomRepository.findAllEndedRoomsByUser(user, pageRequest); + } } return roomList;