Skip to content

Commit

Permalink
Merge pull request #139 from softeerbootcamp4th/feature/135-event-use…
Browse files Browse the repository at this point in the history
…r-multi-search

[feat] 이벤트 유저를 다양한 조건으로 검색할 수 있게 개선(#135)
  • Loading branch information
blaxsior authored Aug 22, 2024
2 parents 16f8217 + e7d19fb commit c40f7f1
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 5 deletions.
7 changes: 7 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@ public class AdminEventUserController {
@GetMapping
public ResponseEntity<EventUserPageDto> 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);
}

Expand Down
19 changes: 19 additions & 0 deletions src/main/java/hyundai/softeer/orange/config/QueryDSLConfig.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -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<EventUserScoreDto> dto);
Page<EventUser> findBySearch(String search, String field, Pageable pageable);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -14,6 +21,7 @@
@Repository
public class CustomEventUserRepositoryImpl implements CustomEventUserRepository {
private final JdbcTemplate jdbcTemplate;
private final JPAQueryFactory queryFactory;

@Override
public void updateScoreMany(List<EventUserScoreDto> userScores) {
Expand All @@ -33,4 +41,22 @@ public int getBatchSize() {
}
});
}

@Override
public Page<EventUser> 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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,20 @@
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;

import java.util.List;
import java.util.Optional;

@Repository
public interface EventUserRepository extends JpaRepository<EventUser, Long>, CustomEventUserRepository {
public interface EventUserRepository extends JpaRepository<EventUser, Long>, CustomEventUserRepository, JpaSpecificationExecutor<EventUser> {

Optional<EventUser> findByUserNameAndPhoneNumber(String userName, String phoneNumber);

Expand All @@ -34,4 +38,4 @@ public interface EventUserRepository extends JpaRepository<EventUser, Long>, Cus
"JOIN event_metadata e ON e.event_frame_id = ef.id " +
"WHERE e.id = :rawEventId", nativeQuery = true)
List<EventUserScoreDto> findAllUserScoreByDrawEventId(@Param("rawEventId") long rawEventId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,10 +52,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<EventUser> userPage = eventUserRepository.findBySearch(search, field, pageRequest);

Page<EventUser> userPage = eventUserRepository.findBySearch(search, pageRequest);
return EventUserPageDto.from(userPage);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -16,5 +17,6 @@
@Testcontainers
@DataJpaTest
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
@Import(TestConfig.class)
public @interface TCDataJpaTest {
}
18 changes: 18 additions & 0 deletions src/test/java/hyundai/softeer/orange/support/TestConfig.java
Original file line number Diff line number Diff line change
@@ -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);
}
}

0 comments on commit c40f7f1

Please sign in to comment.