diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberController.kt index 7070169..ca129a2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberController.kt @@ -36,6 +36,12 @@ class AdminMemberController(private val service: AdminMemberService) { pageable: Pageable ) = ApiResponse.ok(service.searchMember(searchWord, pageable)) + @GetMapping("/search-by-nickname") + fun searchMemberByNickname( + @RequestParam(value = "search_word") searchWord: String, + @RequestParam(value = "size", required = false) size: Int? + ) = ApiResponse.ok(service.searchMemberByNickname(searchWord = searchWord, size = size ?: 20)) + @GetMapping("/creator/all/list") fun getCreatorAllList() = ApiResponse.ok(service.getCreatorAllList()) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberRepository.kt index 538259b..4249bd3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberRepository.kt @@ -16,6 +16,7 @@ interface AdminMemberQueryRepository { fun searchMemberTotalCount(searchWord: String, role: MemberRole? = null): Int fun getCreatorAllList(): List fun findByIdAndActive(memberId: Long): Member? + fun searchMemberByNickname(searchWord: String, limit: Long = 20): List } class AdminMemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : AdminMemberQueryRepository { @@ -121,4 +122,22 @@ class AdminMemberQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) .orderBy(member.id.desc()) .fetchFirst() } + + override fun searchMemberByNickname(searchWord: String, limit: Long): List { + return queryFactory + .select( + QAdminSimpleMemberResponse( + member.id, + member.nickname + ) + ) + .from(member) + .where( + member.nickname.contains(searchWord) + .and(member.isActive.isTrue) + ) + .orderBy(member.id.desc()) + .limit(limit) + .fetch() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt index 3946cbe..5a1f50f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminMemberService.kt @@ -145,6 +145,12 @@ class AdminMemberService( return repository.getCreatorAllList() } + fun searchMemberByNickname(searchWord: String, size: Int = 20): List { + if (searchWord.length < 2) throw SodaException("2글자 이상 입력하세요.") + val limit = if (size <= 0) 20 else size + return repository.searchMemberByNickname(searchWord = searchWord, limit = limit.toLong()) + } + @Transactional fun resetPassword(request: ResetPasswordRequest) { val member = repository.findByIdAndActive(memberId = request.memberId) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminSimpleMemberResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminSimpleMemberResponse.kt new file mode 100644 index 0000000..00d0ea5 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminSimpleMemberResponse.kt @@ -0,0 +1,12 @@ +package kr.co.vividnext.sodalive.admin.member + +import com.querydsl.core.annotations.QueryProjection + +/** + * 관리자용 간단 회원 응답 DTO + * 닉네임 검색 결과로 사용되며 charge 등에서 memberId 선택에 활용된다. + */ +data class AdminSimpleMemberResponse @QueryProjection constructor( + val id: Long, + val nickname: String +)