[Practice] 관리자 API 만들기 (11)
2021. 4. 15. 16:38ㆍSpring/Practice
1. 문제
- 사용자별 공지사항의 게시글 수를 리턴하는 API
2. 풀이
- UserNoticeCount.java
package com.example.jpa.sample.user.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
public class UserNoticeCount {
private Long id;
private String email;
private String name;
private Long noticeCount;
}
- UserService.java
package com.example.jpa.sample.user.service;
import com.example.jpa.sample.user.entity.User;
import com.example.jpa.sample.user.model.UserNoticeCount;
import com.example.jpa.sample.user.model.UserSummary;
import java.util.List;
public interface UserService {
UserSummary getUserStatusCount();
List<User> getTodayUsers();
List<UserNoticeCount> getUserNoticeCount();
}
- UserServiceImpl.java
package com.example.jpa.sample.user.service;
import com.example.jpa.sample.user.entity.User;
import com.example.jpa.sample.user.model.UserNoticeCount;
import com.example.jpa.sample.user.model.UserStatus;
import com.example.jpa.sample.user.model.UserSummary;
import com.example.jpa.sample.user.repository.UserCustomRepository;
import com.example.jpa.sample.user.repository.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.List;
@RequiredArgsConstructor
@Service
public class UserServiceImpl implements UserService {
private final UserRepository userRepository;
private final UserCustomRepository userCustomRepository;
@Override
public UserSummary getUserStatusCount() {
Long stopUserCount = userRepository.countByStatus(UserStatus.Stop);
Long usingUserCount = userRepository.countByStatus(UserStatus.Using);
Long totalUserCount = userRepository.count();
return UserSummary.builder()
.stopUserCount(stopUserCount)
.usingUserCount(usingUserCount)
.totalUserCount(totalUserCount)
.build();
}
@Override
public List<User> getTodayUsers() {
// 현재 시간을 기준
LocalDateTime t = LocalDateTime.now();
LocalDateTime startDate = LocalDateTime.of(t.getYear(), t.getMonth(), t.getDayOfMonth(), 0, 0);
LocalDateTime endDate = startDate.plusDays(1);
return userRepository.findToday(startDate, endDate);
}
@Override
public List<UserNoticeCount> getUserNoticeCount() {
return userCustomRepository.findUserNoticeCount();
}
}
- UserCustomRepository.java
package com.example.jpa.sample.user.repository;
import com.example.jpa.sample.user.model.UserNoticeCount;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import javax.persistence.EntityManager;
import java.util.List;
@RequiredArgsConstructor
@Repository
public class UserCustomRepository {
private final EntityManager entityManager;
// Native SQL Query
public List<UserNoticeCount> findUserNoticeCount() {
String sql = "SELECT u.id, u.email, u.name, (SELECT COUNT(*) FROM Notice n WHERE n.user_id = u.id) notice_count FROM User u;";
List<UserNoticeCount> userNoticeCountList = entityManager.createNativeQuery(sql).getResultList();
return userNoticeCountList;
}
}
- ApiAdminUserController.java
package com.example.jpa.sample.user.controller;
import com.example.jpa.sample.notice.repository.NoticeRepository;
import com.example.jpa.sample.user.entity.User;
import com.example.jpa.sample.user.entity.UserLoginHistory;
import com.example.jpa.sample.user.model.*;
import com.example.jpa.sample.user.repository.UserLoginHistoryRepository;
import com.example.jpa.sample.user.repository.UserRepository;
import com.example.jpa.sample.user.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Optional;
@RequiredArgsConstructor
@RestController
public class ApiAdminUserController {
private final UserRepository userRepository;
private final NoticeRepository noticeRepository;
private final UserLoginHistoryRepository userLoginHistoryRepository;
private final UserService userService;
/*
// 문제 1
@GetMapping("/api/admin/user")
public ResponseMessage userList() {
Long totalUserCount = userRepository.count();
List<User> userList = userRepository.findAll();
return ResponseMessage.builder()
.totalCount(totalUserCount)
.data(userList)
.build();
}
*/
// 문제 2
@GetMapping("/api/admin/user/{id}")
public ResponseEntity<?> userDetail(@PathVariable Long id) {
Optional<User> user = userRepository.findById(id);
if(!user.isPresent()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다."), HttpStatus.BAD_REQUEST);
}
return ResponseEntity.ok().body(ResponseMessage.success(user));
}
// 문제 3
@GetMapping("/api/admin/user/search")
public ResponseEntity<?> findUser(@RequestBody UserSearch userSearch) {
List<User> userList = userRepository.findByEmailContainsOrPhoneContainsOrNameContains(userSearch.getEmail(), userSearch.getPhone(), userSearch.getName());
return ResponseEntity.ok().body(ResponseMessage.success(userList));
}
// 문제 4
@PatchMapping("/api/admin/user/{id}/status")
public ResponseEntity<?> userStatus(@PathVariable Long id, @RequestBody UserStatusInput userStatusInput) {
Optional<User> optionalUser = userRepository.findById(id);
if(!optionalUser.isPresent()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다."), HttpStatus.BAD_REQUEST);
}
User user = optionalUser.get();
user.setStatus(userStatusInput.getStatus());
userRepository.save(user);
return ResponseEntity.ok().build();
}
// 문제 5
@DeleteMapping("/api/admin/user/{id}")
public ResponseEntity<?> deleteUser(@PathVariable Long id) {
Optional<User> optionalUser = userRepository.findById(id);
if(!optionalUser.isPresent()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다."), HttpStatus.BAD_REQUEST);
}
User user = optionalUser.get();
if(noticeRepository.countByUser(user) > 0) {
return new ResponseEntity<>(ResponseMessage.fail("사용자가 작성한 공지사항이 있습니다."), HttpStatus.BAD_REQUEST);
}
userRepository.delete(user);
return ResponseEntity.ok().build();
}
// 문제 6
@GetMapping("/api/admin/user/login/history")
public ResponseEntity<?> userLoginHistory() {
List<UserLoginHistory> userLoginHistoryList = userLoginHistoryRepository.findAll();
return ResponseEntity.ok().body(userLoginHistoryList);
}
// 문제 7
@PatchMapping("/api/admin/user/{id}/lock")
public ResponseEntity<?> userLock(@PathVariable Long id) {
Optional<User> optionalUser = userRepository.findById(id);
if(!optionalUser.isPresent()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다."), HttpStatus.BAD_REQUEST);
}
User user = optionalUser.get();
if(user.isLockYn()) {
return new ResponseEntity<>(ResponseMessage.fail("이미 접속제한이 된 사용자입니다."), HttpStatus.BAD_REQUEST);
}
user.setLockYn(true);
userRepository.save(user);
return ResponseEntity.ok().body(ResponseMessage.success());
}
// 문제 8
@PatchMapping("/api/admin/user/{id}/unlock")
public ResponseEntity<?> userUnLock(@PathVariable Long id) {
Optional<User> optionalUser = userRepository.findById(id);
if(!optionalUser.isPresent()) {
return new ResponseEntity<>(ResponseMessage.fail("사용자 정보가 존재하지 않습니다."), HttpStatus.BAD_REQUEST);
}
User user = optionalUser.get();
if(!user.isLockYn()) {
return new ResponseEntity<>(ResponseMessage.fail("이미 접속제한이 해제된 사용자입니다."), HttpStatus.BAD_REQUEST);
}
user.setLockYn(false);
userRepository.save(user);
return ResponseEntity.ok().body(ResponseMessage.success());
}
// 문제 9
@GetMapping("/api/admin/user/status/count")
public ResponseEntity<?> userStatusCount() {
UserSummary userSummary = userService.getUserStatusCount();
return ResponseEntity.ok().body(ResponseMessage.success(userSummary));
}
// 문제 10
@GetMapping("/api/admin/user/today")
public ResponseEntity<?> todayUser() {
List<User> users = userService.getTodayUsers();
return ResponseEntity.ok().body(ResponseMessage.success(users));
}
// 문제 11
@GetMapping("/api/admin/user/notice/count")
public ResponseEntity<?> userNoticeCount() {
List<UserNoticeCount> userNoticeCountList = userService.getUserNoticeCount();
return ResponseEntity.ok().body(ResponseMessage.success(userNoticeCountList));
}
}
728x90
'Spring > Practice' 카테고리의 다른 글
[Practice] 관리자 API 만들기 (13) (0) | 2021.04.15 |
---|---|
[Practice] 관리자 API 만들기 (12) (0) | 2021.04.15 |
[Practice] 관리자 API 만들기 (10) (0) | 2021.04.15 |
[Practice] 관리자 API 만들기 (9) (0) | 2021.04.15 |