Skip to content

Commit 35c3521

Browse files
authored
Merge pull request #23 from ymkmoon/feature/user-list
Feature/user list
2 parents 903ea87 + 18a4fe4 commit 35c3521

File tree

6 files changed

+137
-57
lines changed

6 files changed

+137
-57
lines changed
Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package com.example.template.admin;
22

3-
import java.util.List;
4-
53
import org.springframework.data.domain.Pageable;
6-
import org.springframework.http.HttpStatus;
74
import org.springframework.http.ResponseEntity;
85
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.PathVariable;
97
import org.springframework.web.bind.annotation.RequestMapping;
108
import org.springframework.web.bind.annotation.RequestParam;
119
import org.springframework.web.bind.annotation.RestController;
1210

11+
import com.example.template.common.ApiResponse;
1312
import com.example.template.common.dto.AdminDto;
13+
import com.example.template.common.dto.ListResponseDto;
1414
import com.example.template.common.dto.OffsetBasedPageRequest;
1515

1616
import jakarta.validation.constraints.NotNull;
@@ -37,13 +37,14 @@ public class AdminController {
3737
* SQL 을 이용한 회원 목록 조회 API
3838
*/
3939
@GetMapping("/v1")
40-
public ResponseEntity<List<AdminDto.AdminResponse>> getVocQuestionsVer1(
41-
AdminDto.AdminListRequest condition,
42-
@RequestParam(name="offset") @NotNull long offset,
43-
@RequestParam(name="limit") @NotNull int limit) {
44-
Pageable pageable = new OffsetBasedPageRequest(offset, limit);
45-
return new ResponseEntity<>(adminService.getAdminListV1(pageable, condition), HttpStatus.OK);
46-
}
40+
public ResponseEntity<ApiResponse<ListResponseDto<AdminDto.AdminResponse>>> getAdminListV1(
41+
AdminDto.AdminListRequest condition,
42+
@RequestParam(name="offset") @NotNull long offset,
43+
@RequestParam(name="limit") @NotNull int limit
44+
) {
45+
Pageable pageable = new OffsetBasedPageRequest(offset, limit);
46+
return ApiResponse.success(adminService.getAdminListV1(pageable, condition));
47+
}
4748

4849
/**
4950
* @param AdminListRequest 회원 조회에 사용되는 요청 정보
@@ -52,13 +53,15 @@ public ResponseEntity<List<AdminDto.AdminResponse>> getVocQuestionsVer1(
5253
* JPA 를 이용한 회원 목록 조회 API
5354
*/
5455
@GetMapping("/v2")
55-
public ResponseEntity<List<AdminDto.AdminResponse>> getVocQuestionsVer2(
56-
AdminDto.AdminListRequest condition,
57-
@RequestParam(name="offset") @NotNull long offset,
58-
@RequestParam(name="limit") @NotNull int limit) {
59-
Pageable pageable = new OffsetBasedPageRequest(offset, limit);
60-
return new ResponseEntity<>(adminService.getAdminListV2(pageable, condition), HttpStatus.OK);
61-
}
56+
public ResponseEntity<ApiResponse<ListResponseDto<AdminDto.AdminResponse>>> getAdminListV2(
57+
AdminDto.AdminListRequest condition,
58+
@RequestParam(name="offset") @NotNull long offset,
59+
@RequestParam(name="limit") @NotNull int limit
60+
) {
61+
Pageable pageable = new OffsetBasedPageRequest(offset, limit);
62+
return ApiResponse.success(adminService.getAdminListV2(pageable, condition));
63+
}
64+
6265

6366
/**
6467
* @param AdminListRequest 회원 조회에 사용되는 요청 정보
@@ -67,13 +70,28 @@ public ResponseEntity<List<AdminDto.AdminResponse>> getVocQuestionsVer2(
6770
* QueryDSL 을 이용한 회원 목록 조회 API
6871
*/
6972
@GetMapping("/v3")
70-
public ResponseEntity<List<AdminDto.AdminResponse>> getVocQuestionsVer3(
71-
AdminDto.AdminListRequest condition,
72-
@RequestParam(name="offset") @NotNull long offset,
73-
@RequestParam(name="limit") @NotNull int limit) {
74-
Pageable pageable = new OffsetBasedPageRequest(offset, limit);
75-
return new ResponseEntity<>(adminService.getAdminListV3(pageable, condition), HttpStatus.OK);
76-
}
73+
public ResponseEntity<ApiResponse<ListResponseDto<AdminDto.AdminResponse>>> getAdminListV3(
74+
AdminDto.AdminListRequest condition,
75+
@RequestParam(name="offset") @NotNull long offset,
76+
@RequestParam(name="limit") @NotNull int limit
77+
) {
78+
Pageable pageable = new OffsetBasedPageRequest(offset, limit);
79+
return ApiResponse.success(adminService.getAdminListV3(pageable, condition));
80+
}
81+
82+
/**
83+
* @param AdminListRequest 회원 조회에 사용되는 요청 정보
84+
* @return AdminListResponse 회원 목록
85+
*
86+
* QueryDSL 을 이용한 회원 목록 조회 API
87+
*/
88+
@GetMapping("/{id}")
89+
public ResponseEntity<ApiResponse<AdminDto.AdminResponse>> getAdminDetail(
90+
@PathVariable(value = "id") String id
91+
) {
92+
return ApiResponse.success(adminService.getAdminDetail(id));
93+
}
94+
7795
}
7896

7997

src/main/java/com/example/template/admin/AdminRepository.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,17 @@ List<AdminEntity> findAdminListV1(@Param("loginId") String loginId,
3939
@Param("offset") long offset,
4040
@Param("limit") int limit);
4141

42+
@Query(value = "SELECT COUNT(*) FROM admin " +
43+
"WHERE (:loginId IS NULL OR login_id = :loginId) " +
44+
"AND (:name IS NULL OR name = :name) " +
45+
"AND (:email IS NULL OR email = :email) " +
46+
"AND (:phoneNumber IS NULL OR phone_number = :phoneNumber)",
47+
nativeQuery = true)
48+
long countAdminListV1(@Param("loginId") String loginId,
49+
@Param("name") String name,
50+
@Param("email") String email,
51+
@Param("phoneNumber") String phoneNumber);
52+
4253

4354
/**
4455
* V2: Spring Data JPA의 Pageable을 활용한 회원 목록 조회
Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package com.example.template.admin;
22

3-
import java.util.List;
4-
53
import org.springframework.data.domain.Pageable;
64
import org.springframework.transaction.annotation.Transactional;
75

86
import com.example.template.common.dto.AdminDto;
7+
import com.example.template.common.dto.ListResponseDto;
98

109
@Transactional(readOnly = true)
1110
public interface AdminService {
12-
List<AdminDto.AdminResponse> getAdminListV1(Pageable pageable, AdminDto.AdminListRequest condition);
13-
List<AdminDto.AdminResponse> getAdminListV2(Pageable pageable, AdminDto.AdminListRequest condition);
14-
List<AdminDto.AdminResponse> getAdminListV3(Pageable pageable, AdminDto.AdminListRequest condition);
15-
11+
ListResponseDto<AdminDto.AdminResponse> getAdminListV1(Pageable pageable, AdminDto.AdminListRequest condition);
12+
long countAdminListV1(AdminDto.AdminListRequest condition);
13+
ListResponseDto<AdminDto.AdminResponse> getAdminListV2(Pageable pageable, AdminDto.AdminListRequest condition);
14+
ListResponseDto<AdminDto.AdminResponse> getAdminListV3(Pageable pageable, AdminDto.AdminListRequest condition);
15+
AdminDto.AdminResponse getAdminDetail(String id);
1616
}

src/main/java/com/example/template/admin/AdminServiceImpl.java

Lines changed: 56 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.example.template.admin;
22

33
import java.util.List;
4-
import java.util.stream.Collectors;
54

65
import org.springframework.data.domain.Page;
76
import org.springframework.data.domain.Pageable;
7+
import org.springframework.security.core.userdetails.UsernameNotFoundException;
88
import org.springframework.stereotype.Service;
99

1010
import com.example.template.common.dto.AdminDto;
11+
import com.example.template.common.dto.AdminDto.AdminResponse;
12+
import com.example.template.constants.ResponseCode;
13+
import com.example.template.common.dto.ListResponseDto;
1114
import com.example.template.model.entity.AdminEntity;
1215

1316
import lombok.RequiredArgsConstructor;
@@ -19,37 +22,64 @@ public class AdminServiceImpl implements AdminService {
1922
private final AdminRepository adminRepository;
2023
private final AdminRepositoryCustom adminRepositoryCustom;
2124

22-
@Override
23-
public List<AdminDto.AdminResponse> getAdminListV1(Pageable pageable, AdminDto.AdminListRequest condition) {
24-
25-
List<AdminEntity> adminEntities = adminRepository.findAdminListV1(
25+
public ListResponseDto<AdminDto.AdminResponse> getAdminListV1(Pageable pageable, AdminDto.AdminListRequest condition) {
26+
List<AdminEntity> adminEntities = adminRepository.findAdminListV1(
27+
condition.getLoginId(),
28+
condition.getName(),
29+
condition.getEmail(),
30+
condition.getPhoneNumber(),
31+
pageable.getOffset(),
32+
pageable.getPageSize()
33+
);
34+
35+
List<AdminDto.AdminResponse> list = adminEntities.stream()
36+
.map(AdminEntity::toAdminResponse)
37+
.toList();
38+
39+
long totalCount = adminRepository.countAdminListV1(
40+
condition.getLoginId(),
41+
condition.getName(),
42+
condition.getEmail(),
43+
condition.getPhoneNumber()
44+
);
45+
46+
return ListResponseDto.of(totalCount, list);
47+
}
48+
49+
50+
@Override
51+
public long countAdminListV1(AdminDto.AdminListRequest condition) {
52+
return adminRepository.countAdminListV1(
2653
condition.getLoginId(),
2754
condition.getName(),
2855
condition.getEmail(),
29-
condition.getPhoneNumber(),
30-
pageable.getOffset(),
31-
pageable.getPageSize()
56+
condition.getPhoneNumber()
3257
);
33-
34-
return adminEntities.stream()
35-
.map(AdminEntity::toAdminResponse)
36-
.collect(Collectors.toList());
37-
}
58+
}
3859

39-
@Override
40-
public List<AdminDto.AdminResponse> getAdminListV2(Pageable pageable, AdminDto.AdminListRequest condition) {
41-
Page<AdminEntity> adminEntities = adminRepository.findAllByOrderByCreatedAtDescIdDesc(pageable);
42-
43-
return adminEntities.getContent().stream()
44-
.map(AdminEntity::toAdminResponse)
45-
.collect(Collectors.toList());
46-
}
47-
48-
@Override
49-
public List<AdminDto.AdminResponse> getAdminListV3(Pageable pageable, AdminDto.AdminListRequest condition) {
50-
Page<AdminDto.AdminResponse> result = adminRepositoryCustom.searchAdmin(condition, pageable);
51-
return result.getContent();
60+
@Override
61+
public ListResponseDto<AdminDto.AdminResponse> getAdminListV2(Pageable pageable, AdminDto.AdminListRequest condition) {
62+
Page<AdminEntity> adminEntities = adminRepository.findAllByOrderByCreatedAtDescIdDesc(pageable);
63+
64+
List<AdminDto.AdminResponse> list = adminEntities.getContent().stream()
65+
.map(AdminEntity::toAdminResponse)
66+
.toList();
5267

68+
return ListResponseDto.of(adminEntities.getTotalElements(), list);
69+
}
70+
71+
@Override
72+
public ListResponseDto<AdminDto.AdminResponse> getAdminListV3(Pageable pageable, AdminDto.AdminListRequest condition) {
73+
Page<AdminDto.AdminResponse> result = adminRepositoryCustom.searchAdmin(condition, pageable);
74+
return ListResponseDto.of(result.getTotalElements(), result.getContent());
75+
}
76+
77+
78+
@Override
79+
public AdminResponse getAdminDetail(String id) {
80+
AdminEntity admin = adminRepository.findById(id)
81+
.orElseThrow(() -> new UsernameNotFoundException(ResponseCode.USER_NAME_NOT_FOUND.getDetail()));
82+
return admin.toAdminResponse();
5383
}
5484

5585
}

src/main/java/com/example/template/common/ApiResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public static <T> ResponseEntity<ApiResponse<T>> success(T data) {
5151
.build()
5252
);
5353
}
54-
54+
5555
public static <T> ResponseEntity<ApiResponse<T>> error(ResponseCode responseCode) {
5656
return ResponseEntity.status(responseCode.getHttpStatus())
5757
.body(ApiResponse.<T>builder()
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.example.template.common.dto;
2+
3+
import java.util.List;
4+
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@Builder
10+
public class ListResponseDto<T> {
11+
12+
private final long totalCount;
13+
private final List<T> list;
14+
15+
public static <T> ListResponseDto<T> of(long totalCount, List<T> list) {
16+
return ListResponseDto.<T>builder()
17+
.totalCount(totalCount)
18+
.list(list)
19+
.build();
20+
}
21+
}

0 commit comments

Comments
 (0)