diff --git a/build.gradle b/build.gradle index ec5da408..bdae6ed0 100644 --- a/build.gradle +++ b/build.gradle @@ -70,6 +70,13 @@ dependencies { // sms api implementation 'net.nurigo:sdk:4.3.0' + + // queryDsl + implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' + annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + } tasks.named('test') { diff --git a/src/main/java/hyundai/softeer/orange/admin/controller/AdminEventUserController.java b/src/main/java/hyundai/softeer/orange/admin/controller/AdminEventUserController.java index 4c461353..e5b0b2fb 100644 --- a/src/main/java/hyundai/softeer/orange/admin/controller/AdminEventUserController.java +++ b/src/main/java/hyundai/softeer/orange/admin/controller/AdminEventUserController.java @@ -33,10 +33,11 @@ public class AdminEventUserController { @GetMapping public ResponseEntity getEventUsers( @RequestParam(name="search", required = false, defaultValue = "") String search, + @RequestParam(name="field", required = false, defaultValue = "userName") String field, @RequestParam(name="page", required = false, defaultValue = "0") @Min(0) Integer page, @RequestParam(name="size", required = false, defaultValue = "10") @Min(1) Integer size ) { - var userPageDto = eventUserService.getUserBySearch(search, page, size); + var userPageDto = eventUserService.getUserBySearch(search, field, page, size); return ResponseEntity.ok(userPageDto); } diff --git a/src/main/java/hyundai/softeer/orange/config/QueryDSLConfig.java b/src/main/java/hyundai/softeer/orange/config/QueryDSLConfig.java new file mode 100644 index 00000000..b21d2170 --- /dev/null +++ b/src/main/java/hyundai/softeer/orange/config/QueryDSLConfig.java @@ -0,0 +1,19 @@ +package hyundai.softeer.orange.config; + + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +@RequiredArgsConstructor +public class QueryDSLConfig { + private final EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory(){ + return new JPAQueryFactory(entityManager); + } +} \ No newline at end of file diff --git a/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepository.java b/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepository.java index fbb4eae7..947a4028 100644 --- a/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepository.java +++ b/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepository.java @@ -1,10 +1,14 @@ package hyundai.softeer.orange.eventuser.repository; import hyundai.softeer.orange.eventuser.dto.EventUserScoreDto; +import hyundai.softeer.orange.eventuser.entity.EventUser; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import java.util.Collection; import java.util.List; public interface CustomEventUserRepository { void updateScoreMany(List dto); + Page findBySearch(String search, String field, Pageable pageable); } diff --git a/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepositoryImpl.java b/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepositoryImpl.java index 6172335c..760cfa0a 100644 --- a/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepositoryImpl.java +++ b/src/main/java/hyundai/softeer/orange/eventuser/repository/CustomEventUserRepositoryImpl.java @@ -1,7 +1,14 @@ package hyundai.softeer.orange.eventuser.repository; +import com.querydsl.jpa.impl.JPAQueryFactory; +import hyundai.softeer.orange.event.common.entity.QEventFrame; import hyundai.softeer.orange.eventuser.dto.EventUserScoreDto; +import hyundai.softeer.orange.eventuser.entity.EventUser; +import hyundai.softeer.orange.eventuser.entity.QEventUser; import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageImpl; +import org.springframework.data.domain.Pageable; import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -14,6 +21,7 @@ @Repository public class CustomEventUserRepositoryImpl implements CustomEventUserRepository { private final JdbcTemplate jdbcTemplate; + private final JPAQueryFactory queryFactory; @Override public void updateScoreMany(List userScores) { @@ -33,4 +41,22 @@ public int getBatchSize() { } }); } + + @Override + public Page findBySearch(String search, String field, Pageable pageable) { + QEventUser user = QEventUser.eventUser; + QEventFrame eventFrame = QEventFrame.eventFrame; + + var query = queryFactory.select(user) + .from(user) + .leftJoin(user.eventFrame, eventFrame) + .fetchJoin(); + + if("userName".equals(field)) query.where(user.userName.contains(search)); + else if("phoneNumber".equals(field))query.where(user.phoneNumber.contains(search)); + else if("frameId".equals(field)) query.where(user.eventFrame.frameId.contains(search)); + + var data = query.offset(pageable.getOffset()).limit(pageable.getPageSize()).fetch(); + return new PageImpl<>(data, pageable, data.size()); + } } diff --git a/src/main/java/hyundai/softeer/orange/eventuser/repository/EventUserRepository.java b/src/main/java/hyundai/softeer/orange/eventuser/repository/EventUserRepository.java index a0eb55c3..de2f16e1 100644 --- a/src/main/java/hyundai/softeer/orange/eventuser/repository/EventUserRepository.java +++ b/src/main/java/hyundai/softeer/orange/eventuser/repository/EventUserRepository.java @@ -4,8 +4,12 @@ import hyundai.softeer.orange.eventuser.entity.EventUser; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.FluentQuery; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -13,7 +17,7 @@ import java.util.Optional; @Repository -public interface EventUserRepository extends JpaRepository, CustomEventUserRepository { +public interface EventUserRepository extends JpaRepository, CustomEventUserRepository, JpaSpecificationExecutor { Optional findByUserNameAndPhoneNumber(String userName, String phoneNumber); @@ -32,4 +36,4 @@ public interface EventUserRepository extends JpaRepository, Cus "JOIN event_metadata e ON e.event_frame_id = ef.id " + "WHERE e.id = :rawEventId", nativeQuery = true) List findAllUserScoreByDrawEventId(@Param("rawEventId") long rawEventId); -} + } diff --git a/src/main/java/hyundai/softeer/orange/eventuser/service/EventUserService.java b/src/main/java/hyundai/softeer/orange/eventuser/service/EventUserService.java index 387cfa07..f3b22fab 100644 --- a/src/main/java/hyundai/softeer/orange/eventuser/service/EventUserService.java +++ b/src/main/java/hyundai/softeer/orange/eventuser/service/EventUserService.java @@ -8,7 +8,6 @@ import hyundai.softeer.orange.core.jwt.JWTManager; import hyundai.softeer.orange.event.common.entity.EventFrame; import hyundai.softeer.orange.event.common.repository.EventFrameRepository; -import hyundai.softeer.orange.eventuser.dto.EventUserOnAdminDto; import hyundai.softeer.orange.eventuser.dto.EventUserPageDto; import hyundai.softeer.orange.eventuser.dto.RequestAuthCodeDto; import hyundai.softeer.orange.eventuser.dto.RequestUserDto; @@ -20,7 +19,6 @@ import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -53,10 +51,10 @@ public TokenDto login(RequestUserDto dto) { } @Transactional(readOnly = true) - public EventUserPageDto getUserBySearch(String search, int page, int size) { + public EventUserPageDto getUserBySearch(String search, String field, int page, int size) { PageRequest pageRequest = PageRequest.of(page, size); + Page userPage = eventUserRepository.findBySearch(search, field, pageRequest); - Page userPage = eventUserRepository.findBySearch(search, pageRequest); return EventUserPageDto.from(userPage); } diff --git a/src/test/java/hyundai/softeer/orange/support/TCDataJpaTest.java b/src/test/java/hyundai/softeer/orange/support/TCDataJpaTest.java index 3ca7cb24..ba9e251f 100644 --- a/src/test/java/hyundai/softeer/orange/support/TCDataJpaTest.java +++ b/src/test/java/hyundai/softeer/orange/support/TCDataJpaTest.java @@ -2,6 +2,7 @@ import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; import org.springframework.test.context.ActiveProfiles; import org.testcontainers.junit.jupiter.Testcontainers; @@ -16,5 +17,6 @@ @Testcontainers @DataJpaTest @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@Import(TestConfig.class) public @interface TCDataJpaTest { } diff --git a/src/test/java/hyundai/softeer/orange/support/TestConfig.java b/src/test/java/hyundai/softeer/orange/support/TestConfig.java new file mode 100644 index 00000000..9b5631d4 --- /dev/null +++ b/src/test/java/hyundai/softeer/orange/support/TestConfig.java @@ -0,0 +1,18 @@ +package hyundai.softeer.orange.support; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import jakarta.persistence.EntityManager; +import jakarta.persistence.PersistenceContext; +import org.springframework.boot.test.context.TestConfiguration; +import org.springframework.context.annotation.Bean; + +@TestConfiguration +public class TestConfig { + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } +}