Skip to content

Commit 3dfda67

Browse files
committed
refactor/367 관리자대시보드-입점 승인 정렬 수정
1 parent d40e491 commit 3dfda67

File tree

5 files changed

+91
-32
lines changed

5 files changed

+91
-32
lines changed

src/main/java/com/back/domain/artist/repository/ArtistApplicationRepository.java

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,52 @@ public interface ArtistApplicationRepository extends JpaRepository<ArtistApplica
1818
Optional<ArtistApplication> findFirstByUserIdOrderByCreateDateDesc(Long userId); // 최근 신청 1건 조회
1919
boolean existsByUserIdAndStatus(Long userId, ApplicationStatus status); // 중복 신청 방지용 - 특정 상태의 작가 신청서 존재 여부 확인
2020

21-
2221
// ==== 관리자용 ==== //
23-
Page<ArtistApplication> findAllByOrderByCreateDateDesc(Pageable pageable); // 모든 작가 신청서 조회
24-
Page<ArtistApplication> findByStatusOrderByCreateDateDesc( // 상태별 작가 신청서 조회
25-
ApplicationStatus status, Pageable pageable);
2622
long countByStatus(ApplicationStatus status); // 대시보드 통계용 - 특정 상태의 작가 신청서 개수 조회
2723

28-
// 검색
29-
@Query("SELECT a FROM ArtistApplication a WHERE a.artistName LIKE %:artistName% ORDER BY a.createDate DESC")
30-
Page<ArtistApplication> findByArtistNameContainingOrderByCreateDateDesc( // 작가명 검색
31-
@Param("artistName") String artistName, Pageable pageable
32-
);
33-
3424
// userId로 조회
3525
Optional<ArtistApplication> findByUserId(Long userId);
26+
27+
// ==== 관리자 대시보드용 - 동적 정렬 지원 ==== //
28+
/**
29+
* 관리자 입점 신청 목록 조회 (검색 + 필터링 + 동적 정렬)
30+
*
31+
* 기능:
32+
* - 작가명, 이메일, 작가ID로 검색 (keyword)
33+
* - 상태별 필터링 (status)
34+
* - 작가ID, 작가명, 신청일자, 상태로 정렬 (sort, order)
35+
*
36+
* @param keyword 검색어 (작가명/이메일/작가ID)
37+
* @param status 신청 상태 (PENDING/APPROVED/REJECTED/CANCELLED)
38+
* @param sort 정렬 기준 (artistId/artistName/submittedAt/status)
39+
* @param order 정렬 순서 (ASC/DESC)
40+
* @param pageable 페이징 정보
41+
* @return 입점 신청 목록
42+
*/
43+
@Query("""
44+
SELECT a FROM ArtistApplication a
45+
LEFT JOIN FETCH a.user u
46+
WHERE (:keyword IS NULL OR
47+
LOWER(a.artistName) LIKE LOWER(CONCAT('%', :keyword, '%')) OR
48+
LOWER(u.email) LIKE LOWER(CONCAT('%', :keyword, '%')) OR
49+
CAST(u.id AS string) LIKE CONCAT('%', :keyword, '%'))
50+
AND (:status IS NULL OR a.status = :status)
51+
ORDER BY
52+
CASE WHEN :sort = 'artistId' AND :order = 'ASC' THEN u.id END ASC,
53+
CASE WHEN :sort = 'artistId' AND :order = 'DESC' THEN u.id END DESC,
54+
CASE WHEN :sort = 'artistName' AND :order = 'ASC' THEN a.artistName END ASC,
55+
CASE WHEN :sort = 'artistName' AND :order = 'DESC' THEN a.artistName END DESC,
56+
CASE WHEN :sort = 'submittedAt' AND :order = 'ASC' THEN a.createDate END ASC,
57+
CASE WHEN :sort = 'submittedAt' AND :order = 'DESC' THEN a.createDate END DESC,
58+
CASE WHEN :sort = 'status' AND :order = 'ASC' THEN a.status END ASC,
59+
CASE WHEN :sort = 'status' AND :order = 'DESC' THEN a.status END DESC,
60+
a.createDate DESC
61+
""")
62+
Page<ArtistApplication> findArtistApplicationsForAdmin(
63+
@Param("keyword") String keyword,
64+
@Param("status") ApplicationStatus status,
65+
@Param("sort") String sort,
66+
@Param("order") String order,
67+
Pageable pageable
68+
);
3669
}

src/main/java/com/back/domain/artist/service/ArtistApplicationAdminService.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,15 @@ public class ArtistApplicationAdminService {
3434
* TODO: 대시보드 파트와 겹치는 부분이어서 통합 고려
3535
*/
3636
public Page<ArtistApplicationSimpleResponse> getAllApplications(Pageable pageable) {
37+
// 새로운 동적 쿼리 사용 (keyword, status null로 전체 조회, 기본 정렬: submittedAt DESC)
3738
Page<ArtistApplication> applications =
38-
artistApplicationRepository.findAllByOrderByCreateDateDesc(pageable);
39+
artistApplicationRepository.findArtistApplicationsForAdmin(
40+
null, // keyword: 검색어 없음 (전체 조회)
41+
null, // status: 상태 필터 없음 (전체 조회)
42+
"submittedAt", // 신청일자 기준 정렬
43+
"DESC", // 최신순
44+
pageable
45+
);
3946

4047
return applications.map(ArtistApplicationSimpleResponse::from);
4148
}

src/main/java/com/back/domain/dashboard/admin/dto/response/AdminArtistApplicationResponse.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,9 @@ public record Application(
5959
* 작가 정보
6060
*/
6161
public record Artist(
62-
/** 회원 ID */
62+
/** 작가 ID (User ID) */
63+
Long artistId,
64+
/** 회원 ID (이메일) */
6365
String memberId,
6466
/** 작가명 */
6567
String name

src/main/java/com/back/domain/dashboard/admin/service/AdminDashboardServiceImpl.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,13 @@ public AdminOverviewResponse getOverview(AdminOverviewRequest request) {
111111
// 5. 승인 대기 알림
112112
// 작가 입점 신청 승인 대기 (최근 2건)
113113
List<ArtistApplication> pendingApplications = artistApplicationRepository
114-
.findByStatusOrderByCreateDateDesc(ApplicationStatus.PENDING, PageRequest.of(0, 2))
114+
.findArtistApplicationsForAdmin(
115+
null, // keyword: 검색어 없음
116+
ApplicationStatus.PENDING, // status: PENDING만
117+
"submittedAt", // 신청일자 기준
118+
"DESC", // 최신순
119+
PageRequest.of(0, 2)
120+
)
115121
.getContent();
116122

117123
List<AdminOverviewResponse.ArtistApproval> artistApprovals = pendingApplications.stream()
@@ -737,26 +743,22 @@ private String mapFundingSortField(String sort) {
737743
public AdminArtistApplicationResponse getArtistApplications(AdminArtistApplicationSearchRequest request) {
738744
CustomUserDetails adminUser = validateAdminAuthentication();
739745

740-
Pageable pageable = buildPageable(request.page(), request.size(), request.sort(), request.order(),
741-
sort -> "createDate");
742-
743-
Page<ArtistApplication> applicationPage;
746+
Pageable pageable = PageRequest.of(request.page(), request.size());
744747

748+
// 새로운 동적 정렬 쿼리 사용
749+
ApplicationStatus status = null;
745750
if (request.status() != null && !request.status().isBlank()) {
746-
ApplicationStatus appStatus = ApplicationStatus.valueOf(request.status());
747-
if (request.keyword() != null && !request.keyword().isBlank()) {
748-
applicationPage = artistApplicationRepository.findByArtistNameContainingOrderByCreateDateDesc(request.keyword(), pageable);
749-
} else {
750-
applicationPage = artistApplicationRepository.findByStatusOrderByCreateDateDesc(appStatus, pageable);
751-
}
752-
} else {
753-
if (request.keyword() != null && !request.keyword().isBlank()) {
754-
applicationPage = artistApplicationRepository.findByArtistNameContainingOrderByCreateDateDesc(request.keyword(), pageable);
755-
} else {
756-
applicationPage = artistApplicationRepository.findAllByOrderByCreateDateDesc(pageable);
757-
}
751+
status = ApplicationStatus.valueOf(request.status());
758752
}
759753

754+
Page<ArtistApplication> applicationPage = artistApplicationRepository.findArtistApplicationsForAdmin(
755+
request.keyword(),
756+
status,
757+
request.sort(),
758+
request.order(),
759+
pageable
760+
);
761+
760762
long totalApplications = artistApplicationRepository.count();
761763
long pending = artistApplicationRepository.countByStatus(ApplicationStatus.PENDING);
762764
long approved = artistApplicationRepository.countByStatus(ApplicationStatus.APPROVED);
@@ -794,6 +796,7 @@ private AdminArtistApplicationResponse.Application convertToApplicationDto(Artis
794796
return new AdminArtistApplicationResponse.Application(
795797
application.getId(),
796798
new AdminArtistApplicationResponse.Artist(
799+
application.getUser().getId(), // 작가 ID 추가
797800
application.getUser().getEmail() != null ? application.getUser().getEmail() : "N/A",
798801
application.getArtistName()
799802
),

src/test/java/com/back/domain/artist/service/ArtistApplicationAdminServiceTest.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,8 +122,14 @@ void getAllApplications_Success() {
122122
2
123123
);
124124

125-
given(artistApplicationRepository.findAllByOrderByCreateDateDesc(pageable))
126-
.willReturn(applicationPage);
125+
// ⭐ 수정: 새로운 동적 쿼리 메서드 mocking
126+
given(artistApplicationRepository.findArtistApplicationsForAdmin(
127+
null, // keyword
128+
null, // status
129+
"submittedAt", // sort
130+
"DESC", // order
131+
pageable
132+
)).willReturn(applicationPage);
127133

128134
// when
129135
Page<ArtistApplicationSimpleResponse> result = adminService.getAllApplications(pageable);
@@ -133,7 +139,15 @@ void getAllApplications_Success() {
133139
assertThat(result.getTotalElements()).isEqualTo(2);
134140
assertThat(result.getContent().get(0).artistName()).isEqualTo("아티스트1");
135141
assertThat(result.getContent().get(1).artistName()).isEqualTo("아티스트2");
136-
verify(artistApplicationRepository).findAllByOrderByCreateDateDesc(pageable);
142+
143+
// ⭐ 수정: 새로운 메서드 호출 검증
144+
verify(artistApplicationRepository).findArtistApplicationsForAdmin(
145+
null,
146+
null,
147+
"submittedAt",
148+
"DESC",
149+
pageable
150+
);
137151
}
138152
}
139153

0 commit comments

Comments
 (0)