[Practice] 관리자 API 만들기 (7)
2021. 4. 15. 14:48ㆍSpring/Practice
1. 문제
- 사용자의 접속을 제한하는 API
2. 풀이
- schema.sql
DROP TABLE IF EXISTS USER;
DROP TABLE IF EXISTS NOTICE;
create table USER (
ID BIGINT auto_increment primary key,
EMAIL VARCHAR(255),
NAME VARCHAR(255),
PASSWORD VARCHAR(255),
PHONE VARCHAR(255),
REG_DATE TIMESTAMP,
UPDATE_DATE TIMESTAMP,
STATUS INTEGER,
LOCK_YN BOOLEAN DEFAULT FALSE
);
create table NOTICE (
ID BIGINT auto_increment primary key,
TITLE VARCHAR(255),
CONTENTS VARCHAR(255),
HITS INTEGER,
LIKES INTEGER,
REG_DATE TIMESTAMP,
UPDATE_DATE TIMESTAMP,
DELETED BOOLEAN DEFAULT FALSE,
DELETED_DATE TIMESTAMP,
USER_ID BIGINT,
constraint FK_NOTICE_USER_ID foreign key(USER_ID) references USER(ID)
);
create table NOTICE_LIKE (
ID BIGINT auto_increment primary key,
NOTICE_ID BIGINT,
constraint FK_NOTICE_LIKE_NOTICE_ID foreign key(NOTICE_ID) references NOTICE(ID),
USER_ID BIGINT,
constraint FK_NOTICE_LIKE_USER_ID foreign key(USER_ID) references USER(ID)
);
create table USER_LOGIN_HISTORY (
ID BIGINT auto_increment primary key,
USER_ID BIGINT,
EMAIL VARCHAR(255),
NAME VARCHAR(255),
LOGIN_DATE TIMESTAMP,
IP_ADDR VARCHAR(255)
);
- data.sql
INSERT INTO USER(ID, EMAIL, PASSWORD, PHONE, REG_DATE, UPDATE_DATE, NAME, STATUS, LOCK_YN) VALUES(1, 'test1@naver.com', '1111', '010-1111-1111', '2021-01-01 01:01:01.000000', null, '테스트1', 1, 0);
INSERT INTO USER(ID, EMAIL, PASSWORD, PHONE, REG_DATE, UPDATE_DATE, NAME, STATUS, LOCK_YN) VALUES(2, 'test2@naver.com', '2222', '010-2222-2222', '2021-01-02 02:02:02.000000', null, '테스트2', 1, 0);
INSERT INTO USER(ID, EMAIL, PASSWORD, PHONE, REG_DATE, UPDATE_DATE, NAME, STATUS, LOCK_YN) VALUES(3, 'test3@naver.com', '3333', '010-3333-3333', '2021-01-03 03:03:03.000000', null, '테스트3', 2, 0);
INSERT INTO NOTICE(ID, CONTENTS, HITS, LIKES, REG_DATE, TITLE, USER_ID) VALUES(1, '내용1', 0, 0, '2021-01-01 01:01:01.000000', '제목1', 1);
INSERT INTO NOTICE(ID, CONTENTS, HITS, LIKES, REG_DATE, TITLE, USER_ID) VALUES(2, '내용2', 0, 0, '2021-01-02 02:02:02.000000', '제목2', 1);
INSERT INTO NOTICE(ID, CONTENTS, HITS, LIKES, REG_DATE, TITLE, USER_ID) VALUES(3, '내용3', 0, 0, '2021-01-03 03:03:03.000000', '제목3', 1);
INSERT INTO NOTICE_LIKE(ID, NOTICE_ID, USER_ID) VALUES(1, 3, 1);
INSERT INTO NOTICE_LIKE(ID, NOTICE_ID, USER_ID) VALUES(2, 2, 1);
- 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.exception.UserNotFoundException;
import com.example.jpa.sample.user.model.ResponseMessage;
import com.example.jpa.sample.user.model.UserSearch;
import com.example.jpa.sample.user.model.UserStatusInput;
import com.example.jpa.sample.user.repository.UserLoginHistoryRepository;
import com.example.jpa.sample.user.repository.UserRepository;
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;
/*
// 문제 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.coundByUser(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());
}
}
728x90
'Spring > Practice' 카테고리의 다른 글
[Practice] 관리자 API 만들기 (9) (0) | 2021.04.15 |
---|---|
[Practice] 관리자 API 만들기 (8) (0) | 2021.04.15 |
[Practice] 관리자 API 만들기 (6) (0) | 2021.04.15 |
[Practice] 관리자 API 만들기 (5) (0) | 2021.04.15 |