diff --git a/src/main/java/hyundai/softeer/orange/admin/controller/AdminEventUserController.java b/src/main/java/hyundai/softeer/orange/admin/controller/AdminEventUserController.java new file mode 100644 index 00000000..d7f84bb9 --- /dev/null +++ b/src/main/java/hyundai/softeer/orange/admin/controller/AdminEventUserController.java @@ -0,0 +1,46 @@ +package hyundai.softeer.orange.admin.controller; + +import hyundai.softeer.orange.core.auth.Auth; +import hyundai.softeer.orange.core.auth.AuthRole; +import hyundai.softeer.orange.core.auth.list.AdminAuthRequirement; +import hyundai.softeer.orange.eventuser.dto.EventUserPageDto; +import hyundai.softeer.orange.eventuser.service.EventUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.constraints.Min; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Tag(name="admin event user", description = "어드민 페이지에서 이벤트 유저 정보 조회에 사용하는 API") +@RequiredArgsConstructor +@RequestMapping("/api/v1/admin/event-users") +@RestController +@AdminAuthRequirement @Auth({AuthRole.admin}) +public class AdminEventUserController { + private final EventUserService eventUserService; + + /** + * @param search 이벤트 유저 이름 검색어 + * @param page 현재 페이지 + * @param size 한 페이지의 크기 + */ + @Operation(summary = "이벤트 유저 목록을 검색한다", description="이벤트 유저 목록을 검색한다. 이름을 기준으로 검색할 수 있으며, 페이지 / 사이즈가 존재한다.", responses = { + @ApiResponse(responseCode = "200", description = "매칭되는 이벤트 유저 리스트를 반환한다."), + }) + @GetMapping + public ResponseEntity getEventUsers( + @RequestParam(name="search", required = false, defaultValue = "") String search, + @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); + return ResponseEntity.ok(userPageDto); + } + +} diff --git a/src/main/java/hyundai/softeer/orange/eventuser/dto/EventUserOnAdminDto.java b/src/main/java/hyundai/softeer/orange/eventuser/dto/EventUserOnAdminDto.java new file mode 100644 index 00000000..40ae0808 --- /dev/null +++ b/src/main/java/hyundai/softeer/orange/eventuser/dto/EventUserOnAdminDto.java @@ -0,0 +1,19 @@ +package hyundai.softeer.orange.eventuser.dto; + +import hyundai.softeer.orange.eventuser.entity.EventUser; +import lombok.Getter; + +@Getter +public class EventUserOnAdminDto { + private String userName; + private String phoneNumber; + private String frameId; + + public static EventUserOnAdminDto from(EventUser eventUser) { + EventUserOnAdminDto dto = new EventUserOnAdminDto(); + dto.userName = eventUser.getUserName(); + dto.phoneNumber = eventUser.getPhoneNumber(); + dto.frameId = eventUser.getEventFrame().getFrameId(); + return dto; + } +} diff --git a/src/main/java/hyundai/softeer/orange/eventuser/dto/EventUserPageDto.java b/src/main/java/hyundai/softeer/orange/eventuser/dto/EventUserPageDto.java new file mode 100644 index 00000000..6f08ee6a --- /dev/null +++ b/src/main/java/hyundai/softeer/orange/eventuser/dto/EventUserPageDto.java @@ -0,0 +1,24 @@ +package hyundai.softeer.orange.eventuser.dto; + +import hyundai.softeer.orange.eventuser.entity.EventUser; +import lombok.Getter; +import org.springframework.data.domain.Page; + +import java.util.List; + +@Getter +public class EventUserPageDto { + private List users; + private int totalPage; + private int number; + private int size; + + public static EventUserPageDto from(Page userPage) { + EventUserPageDto dto = new EventUserPageDto(); + dto.users = userPage.getContent().stream().map(EventUserOnAdminDto::from).toList(); + dto.totalPage = userPage.getTotalPages(); + dto.number = userPage.getNumber(); + dto.size = userPage.getSize(); + return dto; + } +} 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 01bd4038..a0eb55c3 100644 --- a/src/main/java/hyundai/softeer/orange/eventuser/repository/EventUserRepository.java +++ b/src/main/java/hyundai/softeer/orange/eventuser/repository/EventUserRepository.java @@ -2,6 +2,8 @@ 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 org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -20,6 +22,9 @@ public interface EventUserRepository extends JpaRepository, Cus @Query("SELECT eu FROM EventUser eu WHERE eu.userId IN :userIds") List findAllByUserId(@Param("userIds") List userIds); + @Query("SELECT eu FROM EventUser eu join fetch eu.eventFrame WHERE eu.userName LIKE %:search%") + Page findBySearch(@Param("search") String search, Pageable pageable); + boolean existsByPhoneNumber(String phoneNumber); @Query(value = "SELECT u.id as userId, u.score as score FROM event_user u " + 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 df5809f5..387cfa07 100644 --- a/src/main/java/hyundai/softeer/orange/eventuser/service/EventUserService.java +++ b/src/main/java/hyundai/softeer/orange/eventuser/service/EventUserService.java @@ -8,6 +8,8 @@ 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; import hyundai.softeer.orange.eventuser.entity.EventUser; @@ -16,6 +18,9 @@ import lombok.RequiredArgsConstructor; import org.slf4j.Logger; 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; @@ -47,6 +52,14 @@ public TokenDto login(RequestUserDto dto) { return generateToken(eventUser); } + @Transactional(readOnly = true) + public EventUserPageDto getUserBySearch(String search, int page, int size) { + PageRequest pageRequest = PageRequest.of(page, size); + + Page userPage = eventUserRepository.findBySearch(search, pageRequest); + return EventUserPageDto.from(userPage); + } + /** * 1. 유저가 입력한 인증번호와 Redis에 저장된 인증번호 비교 * 2. 일치하면 신규 유저 저장하고 JWT 토큰 발급