From ca5c708236c70051a37c783704f67cb8fd8f2c2a Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:31:50 +0900 Subject: [PATCH 01/19] =?UTF-8?q?:wrench:=20Config:=20QueryDSL=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20Config=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 6 ++++++ .../gaji/service/config/QueryDSLConfig.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 src/main/java/gaji/service/config/QueryDSLConfig.java diff --git a/build.gradle b/build.gradle index 60b4f2b5..75db4f34 100644 --- a/build.gradle +++ b/build.gradle @@ -57,6 +57,12 @@ dependencies { implementation 'io.jsonwebtoken:jjwt-jackson:0.12.3' implementation 'mysql:mysql-connector-java:8.0.33' + + //QueryDSL 의존성 추가 + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" } tasks.named('test') { diff --git a/src/main/java/gaji/service/config/QueryDSLConfig.java b/src/main/java/gaji/service/config/QueryDSLConfig.java new file mode 100644 index 00000000..889731b5 --- /dev/null +++ b/src/main/java/gaji/service/config/QueryDSLConfig.java @@ -0,0 +1,19 @@ +package gaji.service.config; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class QueryDSLConfig{ + + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +} From bb83c89e7c74d62e091fdfbc00ffd9cc153f6352 Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:32:40 +0900 Subject: [PATCH 02/19] =?UTF-8?q?:sparkles:=20Feat:=20Page=20=EA=B2=80?= =?UTF-8?q?=EC=A6=9D=20=EC=96=B4=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20?= =?UTF-8?q?=EB=B0=8F=20Validator=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/common/annotation/CheckPage.java | 17 +++++++++++ .../validation/PageNumberValidator.java | 29 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/gaji/service/domain/common/annotation/CheckPage.java create mode 100644 src/main/java/gaji/service/domain/common/validation/PageNumberValidator.java diff --git a/src/main/java/gaji/service/domain/common/annotation/CheckPage.java b/src/main/java/gaji/service/domain/common/annotation/CheckPage.java new file mode 100644 index 00000000..da951170 --- /dev/null +++ b/src/main/java/gaji/service/domain/common/annotation/CheckPage.java @@ -0,0 +1,17 @@ +package gaji.service.domain.common.annotation; + +import gaji.service.domain.common.validation.PageNumberValidator; +import jakarta.validation.Payload; +import jakarta.validation.Constraint; + +import java.lang.annotation.*; + +@Documented +@Constraint(validatedBy = PageNumberValidator.class) +@Target( { ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER }) +@Retention(RetentionPolicy.RUNTIME) +public @interface CheckPage { + String message() default "유효하지 않은 페이지 숫자 입니다."; + Class[] groups() default {}; + Class[] payload() default {}; +} diff --git a/src/main/java/gaji/service/domain/common/validation/PageNumberValidator.java b/src/main/java/gaji/service/domain/common/validation/PageNumberValidator.java new file mode 100644 index 00000000..24cdc980 --- /dev/null +++ b/src/main/java/gaji/service/domain/common/validation/PageNumberValidator.java @@ -0,0 +1,29 @@ +package gaji.service.domain.common.validation; + +import gaji.service.domain.common.annotation.CheckPage; +import gaji.service.global.exception.code.status.GlobalErrorStatus; +import jakarta.validation.ConstraintValidator; +import jakarta.validation.ConstraintValidatorContext; +import org.springframework.stereotype.Component; + +@Component +public class PageNumberValidator implements ConstraintValidator { + + @Override + public void initialize(CheckPage constraintAnnotation) { + ConstraintValidator.super.initialize(constraintAnnotation); + } + + @Override + public boolean isValid(Integer value, ConstraintValidatorContext context) { + boolean isValid = value>=0; + + if (!isValid){ + context.disableDefaultConstraintViolation(); + context.buildConstraintViolationWithTemplate(GlobalErrorStatus._INTERNAL_PAGE_ERROR.toString()) + .addConstraintViolation(); + } + + return isValid; + } +} \ No newline at end of file From 5635164ca5de72c1db36bd8a02d7353486f8fc27 Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:33:47 +0900 Subject: [PATCH 03/19] =?UTF-8?q?:sparkles:=20Feat:=20RoomCustomRepository?= =?UTF-8?q?=20=EB=B0=8F=20Impl=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/repository/RoomCustomRepository.java | 10 ++++ .../repository/RoomCustomRepositoryImpl.java | 46 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java create mode 100644 src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java diff --git a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java new file mode 100644 index 00000000..0c372c00 --- /dev/null +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java @@ -0,0 +1,10 @@ +package gaji.service.domain.room.repository; + +import gaji.service.domain.room.entity.Room; +import gaji.service.domain.user.entity.User; + +import java.util.List; + +public interface RoomCustomRepository { + List findTop3OngoingAndTop3EndedRoomsByUser(User user, Integer limit); +} diff --git a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java new file mode 100644 index 00000000..bdf260f9 --- /dev/null +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java @@ -0,0 +1,46 @@ +package gaji.service.domain.room.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import gaji.service.domain.room.entity.QRoom; +import gaji.service.domain.room.entity.Room; +import gaji.service.domain.studyMate.QStudyMate; +import gaji.service.domain.user.entity.User; +import lombok.AllArgsConstructor; +import org.joda.time.LocalDate; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Repository +@AllArgsConstructor +public class RoomCustomRepositoryImpl implements RoomCustomRepository { + private final JPAQueryFactory jpaQueryFactory; + + @Override + public List findTop3OngoingAndTop3EndedRoomsByUser(User user, Integer limit) { + QRoom room = QRoom.room; + QStudyMate studyMate = QStudyMate.studyMate; + + LocalDate now = LocalDate.now(); + + List ongoingRooms = jpaQueryFactory.selectFrom(room) + .join(studyMate).on(room.id.eq(studyMate.room.id)) + .where(studyMate.user.eq(user) + .and(room.studyEndDay.after(now))) + .orderBy(room.studyEndDay.desc()) + .limit(limit) + .fetch(); + + List endedRooms = jpaQueryFactory.selectFrom(room) + .join(studyMate).on(room.id.eq(studyMate.room.id)) + .where(studyMate.user.eq(user) + .and(room.studyEndDay.before(now))) + .orderBy(room.studyEnd.desc()) + .limit(limit) + .fetch(); + + ongoingRooms.addAll(endedRooms); + + return ongoingRooms; + } +} From b87f6e5acf245fce4a69d063c4492ecbc00eb7fc Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:34:08 +0900 Subject: [PATCH 04/19] =?UTF-8?q?:sparkles:=20Feat:=20UserConverter=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/converter/UserConverter.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/gaji/service/domain/user/converter/UserConverter.java b/src/main/java/gaji/service/domain/user/converter/UserConverter.java index 393d8582..60d4bbe0 100644 --- a/src/main/java/gaji/service/domain/user/converter/UserConverter.java +++ b/src/main/java/gaji/service/domain/user/converter/UserConverter.java @@ -1,4 +1,31 @@ package gaji.service.domain.user.converter; +import gaji.service.domain.room.entity.Room; +import gaji.service.domain.user.web.dto.UserResponseDTO; +import org.springframework.data.domain.Page; + +import java.time.LocalDate; +import java.util.List; +import java.util.stream.Collectors; + public class UserConverter { + public static UserResponseDTO.GetRoomDTO toGetRoomDTO(Room room) { + return UserResponseDTO.GetRoomDTO.builder() + .roomId(room.getId()) + .name(room.getName()) + .description(room.getDescription()) + .thumbnail_url(room.getThumbnailUrl()) + .isOngoing(room.getStudyEndDay().isAfter(LocalDate.now())) //스터디 종료 날짜가 현재날짜보다 뒤라면 true + .build(); + } + + public static UserResponseDTO.GetRoomListDTO toGetRoomListDTO(List roomList) { + List GetRoomDTOList = roomList.stream() + .map(UserConverter::toGetRoomDTO).toList(); + + return UserResponseDTO.GetRoomListDTO.builder() + .roomList(GetRoomDTOList) + .totalElements(GetRoomDTOList.size()) + .build(); + } } From dc28e954b78541e13b4c78360c5371dcffc06a9c Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:34:54 +0900 Subject: [PATCH 05/19] =?UTF-8?q?:sparkles:=20Feat:=20UserQueryServiceImpl?= =?UTF-8?q?=20=EC=97=90=20getUserRoomList=20=EB=A9=94=EC=84=9C=EB=93=9C=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 --- .../domain/user/service/UserQueryService.java | 6 ++++++ .../user/service/UserQueryServiceImpl.java | 17 +++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/main/java/gaji/service/domain/user/service/UserQueryService.java b/src/main/java/gaji/service/domain/user/service/UserQueryService.java index f63b23aa..a45a55a5 100644 --- a/src/main/java/gaji/service/domain/user/service/UserQueryService.java +++ b/src/main/java/gaji/service/domain/user/service/UserQueryService.java @@ -1,11 +1,17 @@ package gaji.service.domain.user.service; +import gaji.service.domain.room.entity.Room; import gaji.service.domain.user.entity.User; +import org.springframework.data.domain.Page; + + +import java.util.List; public interface UserQueryService { boolean existUserById(Long userId); User findUserById(Long userId); + List getUserRoomList(Long userId, Integer limit); } 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 22494874..ba8feccd 100644 --- a/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java @@ -1,13 +1,20 @@ package gaji.service.domain.user.service; +import gaji.service.domain.room.entity.Room; +import gaji.service.domain.room.repository.RoomCustomRepository; +import gaji.service.domain.room.repository.RoomRepository; import gaji.service.domain.user.code.UserErrorStatus; import gaji.service.domain.user.entity.User; import gaji.service.domain.user.repository.UserRepository; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @RequiredArgsConstructor @@ -15,6 +22,7 @@ public class UserQueryServiceImpl implements UserQueryService { private final UserRepository userRepository; + private final RoomCustomRepository roomCustomRepository; @Override public boolean existUserById(Long userId) { @@ -26,4 +34,13 @@ public User findUserById(Long userId){ return userRepository.findById(userId) .orElseThrow(() -> new RestApiException(UserErrorStatus._USER_NOT_FOUND)); } + + @Override + public List getUserRoomList(Long userId, Integer limit) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new RestApiException(UserErrorStatus._USER_NOT_FOUND)); + List roomList = roomCustomRepository.findTop3OngoingAndTop3EndedRoomsByUser(user, limit); + + return roomList; + } } From e297376be4294fc68342ffb383ff833a25d689da Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:35:25 +0900 Subject: [PATCH 06/19] =?UTF-8?q?:sparkles:=20Feat:=20UserRestController?= =?UTF-8?q?=20=EC=97=90=20API=20=EA=B2=BD=EB=A1=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/UserRestController.java | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java index c866a100..4d3a9ace 100644 --- a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java +++ b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java @@ -1,16 +1,19 @@ package gaji.service.domain.user.web.controller; +import gaji.service.domain.common.annotation.CheckPage; +import gaji.service.domain.room.entity.Room; import gaji.service.domain.user.converter.UserConverter; import gaji.service.domain.user.entity.User; import gaji.service.domain.user.service.UserCommandService; import gaji.service.domain.user.service.UserQueryService; import gaji.service.domain.user.web.dto.UserResponseDTO; import gaji.service.global.base.BaseResponse; +import gaji.service.jwt.service.TokenProviderService; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.data.domain.Page; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @RequestMapping("/api/users") @@ -18,5 +21,21 @@ public class UserRestController { private final UserCommandService userCommandService; private final UserQueryService userQueryService; + private final TokenProviderService tokenProviderService; + + @GetMapping("/rooms") + public BaseResponse getMyRoomList(@RequestHeader("Authorization") String authorizationHeader, + @RequestParam(defaultValue = "3") Integer limit) { + Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); + List userRoomList = userQueryService.getUserRoomList(userId, limit); + return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); + } + + @GetMapping("/rooms/{userId}") + public BaseResponse getUserRoomList(@PathVariable Long userId, + @RequestParam(defaultValue = "3") Integer limit) { + List userRoomList = userQueryService.getUserRoomList(userId, limit); + return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); + } } From cd13059e9352c207ac72c8c0a53943789981df49 Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:36:06 +0900 Subject: [PATCH 07/19] =?UTF-8?q?:sparkles:=20Feat:=20UserResponseDTO=20?= =?UTF-8?q?=EC=97=90=20GetRoomDTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/web/dto/UserResponseDTO.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java b/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java index a31a197e..504efac3 100644 --- a/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java +++ b/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java @@ -6,8 +6,30 @@ import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.List; public class UserResponseDTO { + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class GetRoomDTO { + Long roomId; + String name; + String description; + String thumbnail_url; + Boolean isOngoing; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class GetRoomListDTO { + List roomList; + Integer totalElements; + } } From 07a302731636fb127989c4ba9482161f1bc1042e Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 15:38:01 +0900 Subject: [PATCH 08/19] =?UTF-8?q?:bug:=20Bug:=20RoomCommandServiceImpl=20?= =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/domain/room/service/RoomCommandServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 7b325861..6e11d65e 100644 --- a/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java +++ b/src/main/java/gaji/service/domain/room/service/RoomCommandServiceImpl.java @@ -48,7 +48,7 @@ public Assignment createAssignment(Long roomId, Long userId, RoomRequestDto.Assi // .orElseThrow(() -> new RestApiException(PostErrorStatus._USER_NOT_FOUND)); - RoomEvent roomEvent = roomQueryService.findRoomEventByRoomIdAndWeeks(roomId, requestDto.getWeeks()); + RoomEvent roomEvent = roomQueryService.findRoomEventByRoomIdAndWeeks(roomId, requestDto.getWeek()); // List을 단일 String으로 변환 String bodyContent = String.join(", ", requestDto.getBodyList()); From 8a1dd2ffdf807596ec044225c5c957271fde88ff Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 16:36:20 +0900 Subject: [PATCH 09/19] =?UTF-8?q?:recycle:=20Refactor:=20Qclass=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=A0=95=EB=A0=AC=20=EA=B8=B0?= =?UTF-8?q?=EC=A4=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/room/repository/RoomCustomRepositoryImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) 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 bdf260f9..378a1cce 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java @@ -6,9 +6,10 @@ import gaji.service.domain.studyMate.QStudyMate; import gaji.service.domain.user.entity.User; import lombok.AllArgsConstructor; -import org.joda.time.LocalDate; + import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.List; @Repository @@ -27,7 +28,7 @@ public List findTop3OngoingAndTop3EndedRoomsByUser(User user, Integer limi .join(studyMate).on(room.id.eq(studyMate.room.id)) .where(studyMate.user.eq(user) .and(room.studyEndDay.after(now))) - .orderBy(room.studyEndDay.desc()) + .orderBy(room.studyStartDay.desc()) .limit(limit) .fetch(); @@ -35,7 +36,7 @@ public List findTop3OngoingAndTop3EndedRoomsByUser(User user, Integer limi .join(studyMate).on(room.id.eq(studyMate.room.id)) .where(studyMate.user.eq(user) .and(room.studyEndDay.before(now))) - .orderBy(room.studyEnd.desc()) + .orderBy(room.studyStartDay.desc()) .limit(limit) .fetch(); From e7c98ce9b34cacd087f3b2fea9a2ed0b4bbe17d3 Mon Sep 17 00:00:00 2001 From: karryred Date: Thu, 8 Aug 2024 16:46:38 +0900 Subject: [PATCH 10/19] =?UTF-8?q?:recycle:=20Refactor:=20SecurityConfig=20?= =?UTF-8?q?WhiteList=EC=97=90=20=EB=AA=A8=EB=93=A0=20api=20=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=B6=94=EA=B0=80=ED=95=9C=EA=B1=B0=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 --- src/main/java/gaji/service/config/SecurityConfig.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/gaji/service/config/SecurityConfig.java b/src/main/java/gaji/service/config/SecurityConfig.java index 46d5b7ed..8ead9635 100644 --- a/src/main/java/gaji/service/config/SecurityConfig.java +++ b/src/main/java/gaji/service/config/SecurityConfig.java @@ -34,10 +34,8 @@ public class SecurityConfig { private static final String[] AUTH_WHITELIST = { "/oauth2/**", "/swagger-ui/**", "/api-docs", "/swagger-ui-custom.html", - "/v3/api-docs/**", "/api-docs/**", "/swagger-ui.html", "/reissue", "/", "/my" - ,"/api/users/**","api/users","/api/**" + "/v3/api-docs/**", "/api-docs/**", "/swagger-ui.html", "/reissue", "/", "/my", }; - @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { From 1539012f8ebe6579420a711268202b7c1a1f1477 Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 18:55:28 +0900 Subject: [PATCH 11/19] =?UTF-8?q?:recycle:=20Refactor:=20Cursor=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=95=EC=9D=84=20=EC=A0=81=EC=9A=A9?= =?UTF-8?q?=EC=8B=9C=ED=82=A4=EA=B3=A0=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EB=91=90=EA=B0=9C=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/repository/RoomCustomRepository.java | 7 +++- .../repository/RoomCustomRepositoryImpl.java | 41 +++++++++++++------ 2 files changed, 35 insertions(+), 13 deletions(-) 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 0c372c00..dfd4f681 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java @@ -1,10 +1,15 @@ package gaji.service.domain.room.repository; +import com.querydsl.core.Tuple; import gaji.service.domain.room.entity.Room; import gaji.service.domain.user.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import java.time.LocalDate; import java.util.List; public interface RoomCustomRepository { - List findTop3OngoingAndTop3EndedRoomsByUser(User user, Integer limit); + public List findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit); + public List findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit); } 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 378a1cce..fa9556be 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java @@ -1,5 +1,7 @@ package gaji.service.domain.room.repository; +import com.querydsl.core.Tuple; +import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import gaji.service.domain.room.entity.QRoom; import gaji.service.domain.room.entity.Room; @@ -17,31 +19,46 @@ public class RoomCustomRepositoryImpl implements RoomCustomRepository { private final JPAQueryFactory jpaQueryFactory; - @Override - public List findTop3OngoingAndTop3EndedRoomsByUser(User user, Integer limit) { + public List findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit) { QRoom room = QRoom.room; QStudyMate studyMate = QStudyMate.studyMate; LocalDate now = LocalDate.now(); - List ongoingRooms = jpaQueryFactory.selectFrom(room) + BooleanExpression cursorCondition = (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) + .or(room.studyStartDay.lt(cursorDate)); + + List ongoingRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl, room.studyStartDay) + .from(room) .join(studyMate).on(room.id.eq(studyMate.room.id)) - .where(studyMate.user.eq(user) - .and(room.studyEndDay.after(now))) - .orderBy(room.studyStartDay.desc()) + .where(studyMate.user.eq(user).and(room.studyEndDay.after(now)) + .and(cursorCondition)) + .orderBy(room.studyStartDay.desc(), room.id.asc()) .limit(limit) .fetch(); - List endedRooms = jpaQueryFactory.selectFrom(room) + return ongoingRooms; + } + + @Override + public List findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit) { + QRoom room = QRoom.room; + QStudyMate studyMate = QStudyMate.studyMate; + + LocalDate now = LocalDate.now(); + + BooleanExpression cursorCondition = (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) + .or(room.studyStartDay.lt(cursorDate)); + + List endedRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl) + .from(room) .join(studyMate).on(room.id.eq(studyMate.room.id)) .where(studyMate.user.eq(user) - .and(room.studyEndDay.before(now))) - .orderBy(room.studyStartDay.desc()) + .and(room.studyEndDay.before(now)).and(cursorCondition)) + .orderBy(room.studyStartDay.desc(), room.id.asc()) .limit(limit) .fetch(); - ongoingRooms.addAll(endedRooms); - - return ongoingRooms; + return endedRooms; } } From 937826b4530dbfe5541f724fc3769a0c14d6fa7f Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 18:56:08 +0900 Subject: [PATCH 12/19] :recycle: Refactor: UserConverter --- .../domain/user/converter/UserConverter.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/gaji/service/domain/user/converter/UserConverter.java b/src/main/java/gaji/service/domain/user/converter/UserConverter.java index 60d4bbe0..2b1e0476 100644 --- a/src/main/java/gaji/service/domain/user/converter/UserConverter.java +++ b/src/main/java/gaji/service/domain/user/converter/UserConverter.java @@ -1,31 +1,31 @@ package gaji.service.domain.user.converter; -import gaji.service.domain.room.entity.Room; +import com.querydsl.core.Tuple; +import gaji.service.domain.room.entity.QRoom; import gaji.service.domain.user.web.dto.UserResponseDTO; -import org.springframework.data.domain.Page; -import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; public class UserConverter { - public static UserResponseDTO.GetRoomDTO toGetRoomDTO(Room room) { + public static UserResponseDTO.GetRoomDTO toGetRoomDTO(Tuple tuple) { return UserResponseDTO.GetRoomDTO.builder() - .roomId(room.getId()) - .name(room.getName()) - .description(room.getDescription()) - .thumbnail_url(room.getThumbnailUrl()) - .isOngoing(room.getStudyEndDay().isAfter(LocalDate.now())) //스터디 종료 날짜가 현재날짜보다 뒤라면 true + .roomId(tuple.get(QRoom.room.id)) + .name(tuple.get(QRoom.room.name)) + .description(tuple.get(QRoom.room.description)) + .thumbnail_url(tuple.get(QRoom.room.thumbnailUrl)) + .studyStartDay(tuple.get(QRoom.room.studyStartDay)) .build(); } - public static UserResponseDTO.GetRoomListDTO toGetRoomListDTO(List roomList) { - List GetRoomDTOList = roomList.stream() - .map(UserConverter::toGetRoomDTO).toList(); + public static UserResponseDTO.GetRoomListDTO toGetRoomListDTO(List roomList) { + List getRoomDTOList = roomList.stream() + .map(UserConverter::toGetRoomDTO) + .collect(Collectors.toList()); return UserResponseDTO.GetRoomListDTO.builder() - .roomList(GetRoomDTOList) - .totalElements(GetRoomDTOList.size()) + .roomList(getRoomDTOList) + .totalElements(getRoomDTOList.size()) .build(); } } From 72ef5a31891aaf4ed47b2ae8e1c5dd7d1c38b233 Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 18:57:00 +0900 Subject: [PATCH 13/19] =?UTF-8?q?:recycle:=20Refactor:=20UserQueryService?= =?UTF-8?q?=20=EB=B0=8F=20Impl=20getUserRoomList=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/service/UserQueryService.java | 6 ++++-- .../user/service/UserQueryServiceImpl.java | 19 +++++++++++++------ 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/gaji/service/domain/user/service/UserQueryService.java b/src/main/java/gaji/service/domain/user/service/UserQueryService.java index 77603c98..ebbbdd5c 100644 --- a/src/main/java/gaji/service/domain/user/service/UserQueryService.java +++ b/src/main/java/gaji/service/domain/user/service/UserQueryService.java @@ -1,15 +1,17 @@ package gaji.service.domain.user.service; -import gaji.service.domain.room.entity.Room; +import com.querydsl.core.Tuple; +import gaji.service.domain.enums.RoomTypeEnum; import gaji.service.domain.user.entity.User; +import java.time.LocalDate; import java.util.List; public interface UserQueryService { boolean existUserById(Long userId); User findUserById(Long userId); - List getUserRoomList(Long userId, Integer limit); + List getUserRoomList(Long userId, LocalDate cursorDate, Long cursorId, RoomTypeEnum type, Integer limit); } 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 39294f7f..00b4cd4f 100644 --- a/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java @@ -1,18 +1,17 @@ package gaji.service.domain.user.service; -import gaji.service.domain.room.entity.Room; +import com.querydsl.core.Tuple; +import gaji.service.domain.enums.RoomTypeEnum; import gaji.service.domain.room.repository.RoomCustomRepository; -import gaji.service.domain.room.repository.RoomRepository; import gaji.service.domain.user.code.UserErrorStatus; import gaji.service.domain.user.entity.User; import gaji.service.domain.user.repository.UserRepository; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; import java.util.List; @@ -36,10 +35,18 @@ public User findUserById(Long userId) { } @Override - public List getUserRoomList(Long userId, Integer limit) { + public List getUserRoomList(Long userId, LocalDate cursorDate, Long cursorId, RoomTypeEnum type, Integer limit) { User user = userRepository.findById(userId) .orElseThrow(() -> new RestApiException(UserErrorStatus._USER_NOT_FOUND)); - List roomList = roomCustomRepository.findTop3OngoingAndTop3EndedRoomsByUser(user, limit); + + List roomList; + + if(type == RoomTypeEnum.ONGOING) { + roomList = roomCustomRepository.findAllOngoingRoomsByUser(user, cursorDate, cursorId, limit); + } + else{ + roomList = roomCustomRepository.findAllEndedRoomsByUser(user, cursorDate, cursorId, limit); + } return roomList; } From d150f4ff5fb3f912535f0629032a403af8badfdc Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 18:58:01 +0900 Subject: [PATCH 14/19] =?UTF-8?q?:recycle:=20Refactor:=20UserResponseDTO?= =?UTF-8?q?=20=EB=B0=98=ED=99=98=EA=B0=92=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/gaji/service/domain/user/web/dto/UserResponseDTO.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java b/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java index 504efac3..dcec42d1 100644 --- a/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java +++ b/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java @@ -5,6 +5,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -19,7 +20,7 @@ public static class GetRoomDTO { String name; String description; String thumbnail_url; - Boolean isOngoing; + LocalDate studyStartDay; } @Builder From 94a7d5e35e3ac3f3d8a2e38de23c5ec74f58a4b0 Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 18:59:02 +0900 Subject: [PATCH 15/19] =?UTF-8?q?:recycle:=20Refactor:=20UserRestControlle?= =?UTF-8?q?r=20RequestParam=20=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/UserRestController.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java index 4d3a9ace..fb305e97 100644 --- a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java +++ b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java @@ -1,18 +1,17 @@ package gaji.service.domain.user.web.controller; -import gaji.service.domain.common.annotation.CheckPage; -import gaji.service.domain.room.entity.Room; +import com.querydsl.core.Tuple; +import gaji.service.domain.enums.RoomTypeEnum; import gaji.service.domain.user.converter.UserConverter; -import gaji.service.domain.user.entity.User; import gaji.service.domain.user.service.UserCommandService; import gaji.service.domain.user.service.UserQueryService; import gaji.service.domain.user.web.dto.UserResponseDTO; import gaji.service.global.base.BaseResponse; import gaji.service.jwt.service.TokenProviderService; import lombok.RequiredArgsConstructor; -import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; @RestController @@ -25,17 +24,24 @@ public class UserRestController { @GetMapping("/rooms") public BaseResponse getMyRoomList(@RequestHeader("Authorization") String authorizationHeader, + @RequestParam("cursorDate") LocalDate cursorDate, + @RequestParam("cursorId") Long cursorId, + @RequestParam("type") RoomTypeEnum type, @RequestParam(defaultValue = "3") Integer limit) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); - List userRoomList = userQueryService.getUserRoomList(userId, limit); + List userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); } @GetMapping("/rooms/{userId}") public BaseResponse getUserRoomList(@PathVariable Long userId, + @RequestParam("cursorDate") LocalDate cursorDate, + @RequestParam("cursorId") Long cursorId, + @RequestParam("type") RoomTypeEnum type, @RequestParam(defaultValue = "3") Integer limit) { - List userRoomList = userQueryService.getUserRoomList(userId, limit); + List userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); } + } From 87cb8ec9cc607186aab1f883a3b1ade51480403a Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 18:59:47 +0900 Subject: [PATCH 16/19] =?UTF-8?q?:sparkles:=20Feat:=20RoomTypeEnum=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 --- src/main/java/gaji/service/domain/enums/RoomTypeEnum.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/gaji/service/domain/enums/RoomTypeEnum.java diff --git a/src/main/java/gaji/service/domain/enums/RoomTypeEnum.java b/src/main/java/gaji/service/domain/enums/RoomTypeEnum.java new file mode 100644 index 00000000..33c4ab39 --- /dev/null +++ b/src/main/java/gaji/service/domain/enums/RoomTypeEnum.java @@ -0,0 +1,5 @@ +package gaji.service.domain.enums; + +public enum RoomTypeEnum { + ONGOING, ENDED +} From 3c63af5b762eb51fa2d15e162f81ac07b3865f2c Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 20:20:14 +0900 Subject: [PATCH 17/19] =?UTF-8?q?:recycle:=20Refactor:=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=83=80=EC=9E=85=20Slice=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/repository/RoomCustomRepository.java | 8 ++- .../repository/RoomCustomRepositoryImpl.java | 53 ++++++++++++++----- .../domain/user/converter/UserConverter.java | 5 +- .../domain/user/service/UserQueryService.java | 4 +- .../user/service/UserQueryServiceImpl.java | 17 +++--- .../web/controller/UserRestController.java | 18 +++---- .../domain/user/web/dto/UserResponseDTO.java | 3 +- 7 files changed, 68 insertions(+), 40 deletions(-) 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 dfd4f681..aecc6e6a 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepository.java @@ -1,15 +1,13 @@ package gaji.service.domain.room.repository; import com.querydsl.core.Tuple; -import gaji.service.domain.room.entity.Room; import gaji.service.domain.user.entity.User; -import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import java.time.LocalDate; -import java.util.List; public interface RoomCustomRepository { - public List findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit); - public List findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit); + public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable); + public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, 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 fa9556be..d3cd3132 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java @@ -4,11 +4,13 @@ import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import gaji.service.domain.room.entity.QRoom; -import gaji.service.domain.room.entity.Room; import gaji.service.domain.studyMate.QStudyMate; import gaji.service.domain.user.entity.User; import lombok.AllArgsConstructor; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; import org.springframework.stereotype.Repository; import java.time.LocalDate; @@ -19,7 +21,7 @@ public class RoomCustomRepositoryImpl implements RoomCustomRepository { private final JPAQueryFactory jpaQueryFactory; - public List findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit) { + public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable) { QRoom room = QRoom.room; QStudyMate studyMate = QStudyMate.studyMate; @@ -28,20 +30,26 @@ public List findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Lo BooleanExpression cursorCondition = (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) .or(room.studyStartDay.lt(cursorDate)); + 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) .from(room) - .join(studyMate).on(room.id.eq(studyMate.room.id)) - .where(studyMate.user.eq(user).and(room.studyEndDay.after(now)) + .where(room.id.in(userRoomIds) + .and(room.studyEndDay.after(now)) .and(cursorCondition)) .orderBy(room.studyStartDay.desc(), room.id.asc()) - .limit(limit) + .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 .fetch(); - return ongoingRooms; + return checkLastPage(pageable, ongoingRooms); } - @Override - public List findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Integer limit) { + + public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable) { QRoom room = QRoom.room; QStudyMate studyMate = QStudyMate.studyMate; @@ -50,15 +58,32 @@ public List findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long BooleanExpression cursorCondition = (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) .or(room.studyStartDay.lt(cursorDate)); - List endedRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl) + 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) .from(room) - .join(studyMate).on(room.id.eq(studyMate.room.id)) - .where(studyMate.user.eq(user) - .and(room.studyEndDay.before(now)).and(cursorCondition)) + .where(room.id.in(userRoomIds) + .and(room.studyEndDay.before(now)) + .and(cursorCondition)) .orderBy(room.studyStartDay.desc(), room.id.asc()) - .limit(limit) + .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 .fetch(); - return endedRooms; + return checkLastPage(pageable, ongoingRooms); + } + + + private Slice checkLastPage(Pageable pageable, List roomList) { + boolean hasNext = false; + + if (roomList.size() > pageable.getPageSize()) { + hasNext = true; + roomList.remove(pageable.getPageSize()); // 더 가져왔을 시, 삭제 + } + return new SliceImpl(roomList, pageable, hasNext); } } diff --git a/src/main/java/gaji/service/domain/user/converter/UserConverter.java b/src/main/java/gaji/service/domain/user/converter/UserConverter.java index 2b1e0476..4f980695 100644 --- a/src/main/java/gaji/service/domain/user/converter/UserConverter.java +++ b/src/main/java/gaji/service/domain/user/converter/UserConverter.java @@ -3,6 +3,7 @@ import com.querydsl.core.Tuple; import gaji.service.domain.room.entity.QRoom; import gaji.service.domain.user.web.dto.UserResponseDTO; +import org.springframework.data.domain.Slice; import java.util.List; import java.util.stream.Collectors; @@ -18,14 +19,14 @@ public static UserResponseDTO.GetRoomDTO toGetRoomDTO(Tuple tuple) { .build(); } - public static UserResponseDTO.GetRoomListDTO toGetRoomListDTO(List roomList) { + public static UserResponseDTO.GetRoomListDTO toGetRoomListDTO(Slice roomList) { List getRoomDTOList = roomList.stream() .map(UserConverter::toGetRoomDTO) .collect(Collectors.toList()); return UserResponseDTO.GetRoomListDTO.builder() .roomList(getRoomDTOList) - .totalElements(getRoomDTOList.size()) + .hasNext(roomList.hasNext()) .build(); } } diff --git a/src/main/java/gaji/service/domain/user/service/UserQueryService.java b/src/main/java/gaji/service/domain/user/service/UserQueryService.java index ebbbdd5c..14dea5eb 100644 --- a/src/main/java/gaji/service/domain/user/service/UserQueryService.java +++ b/src/main/java/gaji/service/domain/user/service/UserQueryService.java @@ -4,14 +4,14 @@ import com.querydsl.core.Tuple; import gaji.service.domain.enums.RoomTypeEnum; import gaji.service.domain.user.entity.User; +import org.springframework.data.domain.Slice; import java.time.LocalDate; -import java.util.List; public interface UserQueryService { boolean existUserById(Long userId); User findUserById(Long userId); - List getUserRoomList(Long userId, LocalDate cursorDate, Long cursorId, RoomTypeEnum type, Integer limit); + Slice getUserRoomList(Long userId, LocalDate cursorDate, Long cursorId, RoomTypeEnum type, int size); } 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 00b4cd4f..5dabc569 100644 --- a/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java +++ b/src/main/java/gaji/service/domain/user/service/UserQueryServiceImpl.java @@ -8,12 +8,12 @@ import gaji.service.domain.user.repository.UserRepository; import gaji.service.global.exception.RestApiException; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDate; -import java.util.List; - @Service @RequiredArgsConstructor @@ -35,17 +35,22 @@ public User findUserById(Long userId) { } @Override - public List getUserRoomList(Long userId, LocalDate cursorDate, Long cursorId, RoomTypeEnum type, Integer limit) { + public Slice getUserRoomList(Long userId, LocalDate cursorDate, Long cursorId, RoomTypeEnum type, int size) { User user = userRepository.findById(userId) .orElseThrow(() -> new RestApiException(UserErrorStatus._USER_NOT_FOUND)); - List roomList; + 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, limit); + roomList = roomCustomRepository.findAllOngoingRoomsByUser(user, cursorDate, cursorId, pageRequest); } else{ - roomList = roomCustomRepository.findAllEndedRoomsByUser(user, cursorDate, cursorId, limit); + roomList = roomCustomRepository.findAllEndedRoomsByUser(user, cursorDate, cursorId, pageRequest); } return roomList; diff --git a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java index fb305e97..00701ceb 100644 --- a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java +++ b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java @@ -9,10 +9,10 @@ import gaji.service.global.base.BaseResponse; import gaji.service.jwt.service.TokenProviderService; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Slice; import org.springframework.web.bind.annotation.*; import java.time.LocalDate; -import java.util.List; @RestController @RequestMapping("/api/users") @@ -24,22 +24,22 @@ public class UserRestController { @GetMapping("/rooms") public BaseResponse getMyRoomList(@RequestHeader("Authorization") String authorizationHeader, - @RequestParam("cursorDate") LocalDate cursorDate, - @RequestParam("cursorId") Long cursorId, + @RequestParam(value = "cursorDate",required = false) LocalDate cursorDate, + @RequestParam(value = "cursorId",required = false) Long cursorId, @RequestParam("type") RoomTypeEnum type, - @RequestParam(defaultValue = "3") Integer limit) { + @RequestParam(defaultValue = "10") Integer limit) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); - List userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); + Slice userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); } @GetMapping("/rooms/{userId}") public BaseResponse getUserRoomList(@PathVariable Long userId, - @RequestParam("cursorDate") LocalDate cursorDate, - @RequestParam("cursorId") Long cursorId, + @RequestParam(value = "cursorDate",required = false) LocalDate cursorDate, + @RequestParam(value = "cursorId",required = false) Long cursorId, @RequestParam("type") RoomTypeEnum type, - @RequestParam(defaultValue = "3") Integer limit) { - List userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); + @RequestParam(defaultValue = "10") Integer limit) { + Slice userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); } diff --git a/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java b/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java index dcec42d1..e11f5634 100644 --- a/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java +++ b/src/main/java/gaji/service/domain/user/web/dto/UserResponseDTO.java @@ -6,7 +6,6 @@ import lombok.NoArgsConstructor; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.List; public class UserResponseDTO { @@ -29,7 +28,7 @@ public static class GetRoomDTO { @AllArgsConstructor public static class GetRoomListDTO { List roomList; - Integer totalElements; + boolean hasNext; } } From c795aee31998b40a3a04a34246248c8a9640c511 Mon Sep 17 00:00:00 2001 From: karryred Date: Sat, 10 Aug 2024 20:42:44 +0900 Subject: [PATCH 18/19] =?UTF-8?q?:recycle:=20Refactor:=20UserRestControlle?= =?UTF-8?q?r=20=EB=B3=80=EC=88=98=20=EB=84=A4=EC=9D=B4=EB=B0=8D=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 --- .../domain/user/web/controller/UserRestController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java index 00701ceb..a48a1838 100644 --- a/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java +++ b/src/main/java/gaji/service/domain/user/web/controller/UserRestController.java @@ -27,9 +27,9 @@ public BaseResponse getMyRoomList(@RequestHeader @RequestParam(value = "cursorDate",required = false) LocalDate cursorDate, @RequestParam(value = "cursorId",required = false) Long cursorId, @RequestParam("type") RoomTypeEnum type, - @RequestParam(defaultValue = "10") Integer limit) { + @RequestParam(defaultValue = "10") int size) { Long userId = tokenProviderService.getUserIdFromToken(authorizationHeader); - Slice userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); + Slice userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, size); return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); } @@ -38,8 +38,8 @@ public BaseResponse getUserRoomList(@PathVariabl @RequestParam(value = "cursorDate",required = false) LocalDate cursorDate, @RequestParam(value = "cursorId",required = false) Long cursorId, @RequestParam("type") RoomTypeEnum type, - @RequestParam(defaultValue = "10") Integer limit) { - Slice userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, limit); + @RequestParam(defaultValue = "10") int size) { + Slice userRoomList = userQueryService.getUserRoomList(userId, cursorDate, cursorId, type, size); return BaseResponse.onSuccess(UserConverter.toGetRoomListDTO(userRoomList)); } From fec04d2c76c5eb0f8804e6e8bf2af4949a3d1da6 Mon Sep 17 00:00:00 2001 From: karryred Date: Mon, 12 Aug 2024 23:01:32 +0900 Subject: [PATCH 19/19] =?UTF-8?q?:recycle:=20Refactor:=20=EC=A4=91?= =?UTF-8?q?=EB=B3=B5=20=EB=B3=80=EC=88=98=20=EC=B6=94=EC=B6=9C=20=EB=B0=8F?= =?UTF-8?q?=20=EC=A4=91=EB=B3=B5=20=EC=BD=94=EB=93=9C=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/RoomCustomRepositoryImpl.java | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) 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 d3cd3132..37767e24 100644 --- a/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java +++ b/src/main/java/gaji/service/domain/room/repository/RoomCustomRepositoryImpl.java @@ -21,15 +21,10 @@ public class RoomCustomRepositoryImpl implements RoomCustomRepository { private final JPAQueryFactory jpaQueryFactory; - public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable) { - QRoom room = QRoom.room; - QStudyMate studyMate = QStudyMate.studyMate; - - LocalDate now = LocalDate.now(); - - BooleanExpression cursorCondition = (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) - .or(room.studyStartDay.lt(cursorDate)); + private final QRoom room = QRoom.room; + private final QStudyMate studyMate = QStudyMate.studyMate; + public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable) { List userRoomIds = jpaQueryFactory .select(studyMate.room.id) .from(studyMate) @@ -39,8 +34,8 @@ 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(now)) - .and(cursorCondition)) + .and(room.studyEndDay.after(getCurrentDay())) + .and(getCursorCondition(cursorDate, cursorId))) .orderBy(room.studyStartDay.desc(), room.id.asc()) .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 .fetch(); @@ -50,9 +45,6 @@ public Slice findAllOngoingRoomsByUser(User user, LocalDate cursorDate, L public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Long cursorId, Pageable pageable) { - QRoom room = QRoom.room; - QStudyMate studyMate = QStudyMate.studyMate; - LocalDate now = LocalDate.now(); BooleanExpression cursorCondition = (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) @@ -67,8 +59,8 @@ public Slice findAllEndedRoomsByUser(User user, LocalDate cursorDate, Lon List ongoingRooms = jpaQueryFactory.select(room.id, room.name, room.description, room.thumbnailUrl, room.studyStartDay) .from(room) .where(room.id.in(userRoomIds) - .and(room.studyEndDay.before(now)) - .and(cursorCondition)) + .and(room.studyEndDay.before(getCurrentDay())) + .and(getCursorCondition(cursorDate, cursorId))) .orderBy(room.studyStartDay.desc(), room.id.asc()) .limit(pageable.getPageSize()+1) // size보다 1개 더 가져와서 다음 페이지 여부 확인 .fetch(); @@ -86,4 +78,14 @@ private Slice checkLastPage(Pageable pageable, List roomList) { } return new SliceImpl(roomList, pageable, hasNext); } + + private BooleanExpression getCursorCondition(LocalDate cursorDate, Long cursorId) { + return (room.studyStartDay.eq(cursorDate).and(room.id.gt(cursorId))) + .or(room.studyStartDay.lt(cursorDate)); + } + + private LocalDate getCurrentDay() { + return LocalDate.now(); + } + }