From 82bd93c1ae3006b828994f1b7bb29184e0e76b49 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 10 Nov 2025 14:39:44 +0900 Subject: [PATCH] =?UTF-8?q?feat(admin-member):=20=EB=8B=89=EB=84=A4?= =?UTF-8?q?=EC=9E=84=20=EA=B2=80=EC=83=89=EC=9C=BC=EB=A1=9C=20=ED=9A=8C?= =?UTF-8?q?=EC=9B=90=20id,=20nickname=20=EB=B0=98=ED=99=98=20API=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 --- .../admin/member/AdminMemberController.kt | 6 ++++++ .../admin/member/AdminMemberRepository.kt | 19 +++++++++++++++++++ .../admin/member/AdminMemberService.kt | 6 ++++++ .../admin/member/AdminSimpleMemberResponse.kt | 12 ++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/member/AdminSimpleMemberResponse.kt 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 +)