From 035385e4fad10c7922aa78a8287e8db736a3bb4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=EC=9E=AC=ED=98=81?= Date: Thu, 19 Dec 2024 20:53:29 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EA=B0=80=EC=9E=85=20=EC=9A=94=EC=B2=AD?= =?UTF-8?q?=20=EA=B1=B0=EC=A0=88=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20(#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 소속 단위 선거 기본 정보 추가 기능 구현 s3 업로드 기능 global로 수정 필요 * feat: 소속 단위 선거 기본 정보 등록용 엔티티 추가 * 온프레미스 환경 회원가입/로그인 코드 추가 (#9) * feat: refreshtoken 저장 엔터티 추가 * feat: 패스워드 암호화 빈 추가 * feat: 회원 가입 로직 구현 * feat: 로그인 필터 추가 * feat: 온프레미스 서버 환경 로그인 기능 추가 (#10) * feat: refreshtoken 저장 엔터티 추가 * feat: 패스워드 암호화 빈 추가 * feat: 회원 가입 로직 구현 * feat: 로그인 필터 추가 * feat: UserDetailsService, dto 구현 * feat: 서울 기준 시 설정 * feat: JWT 발급 코드 추가 * feat: JWTFilter 추가 * feat: cors 설정 추가 * feat: userdetailsservice 예외처리 추가 * fix: url length 추가 length가 255이상 인 경우 오류 가능 수정 * fix: dto추가 requestparam dto로 수정 * feat:선거기본정보 에러코드 추가 * fix: validation, lombok, dto 추가 validation, lombok, dto 추가 * docs: 회원가입 api 스웨거 작성 (#12) * feat: refreshtoken 저장 엔터티 추가 * feat: 패스워드 암호화 빈 추가 * feat: 회원 가입 로직 구현 * feat: 로그인 필터 추가 * feat: UserDetailsService, dto 구현 * feat: 서울 기준 시 설정 * feat: JWT 발급 코드 추가 * feat: JWTFilter 추가 * feat: cors 설정 추가 * feat: userdetailsservice 예외처리 추가 * docs: 회원가입 api 스웨거 작성 * feat: 필터기반 로그인 -> 수동 인증 로직으로 수정 (#13) * feat: refreshtoken 저장 엔터티 추가 * feat: 패스워드 암호화 빈 추가 * feat: 회원 가입 로직 구현 * feat: 로그인 필터 추가 * feat: UserDetailsService, dto 구현 * feat: 서울 기준 시 설정 * feat: JWT 발급 코드 추가 * feat: JWTFilter 추가 * feat: cors 설정 추가 * feat: userdetailsservice 예외처리 추가 * docs: 회원가입 api 스웨거 작성 * feat: 필터기반 로그인 -> 수동 인증 로직으로 수정 * feat: refreshToken 저장 추가 (#14) * feat: refreshtoken 저장 엔터티 추가 * feat: 패스워드 암호화 빈 추가 * feat: 회원 가입 로직 구현 * feat: 로그인 필터 추가 * feat: UserDetailsService, dto 구현 * feat: 서울 기준 시 설정 * feat: JWT 발급 코드 추가 * feat: JWTFilter 추가 * feat: cors 설정 추가 * feat: userdetailsservice 예외처리 추가 * docs: 회원가입 api 스웨거 작성 * feat: 필터기반 로그인 -> 수동 인증 로직으로 수정 * feat: refreshToken 저장 추가 * feat: 회원가입 요청한 유저의 목록 조회 기능 구현 (#16) * feat:s3 bean추가 * fix:import수정 * infra: cicd 연결 테스트 * infra: ci test * fix:후보자 정보 등록 엔티티 요소 수정 피그마 등록화면에 맞게 선거유형, 선본명, 선본 통신공간 주소, 입후보자 공고 이미지, 로고 이미지로 교체 * feat:후보자 등록 선거 유형 단선/경선 선택 옵션 * feat:후보자 등록 기능 개발 * feat : s3서비스 파일 생성, 후보자 등록 시 poster/유저id값 경로에 저장 * fix:엔드포인트 추가 * fix:문자열비교 수정 , transactional추가 * fix:공개 접속 옵션 삭제 * fix:후보자 기본 정보 업로드 클래스명 poster -> candidateInfo로 변경 * fix:엔드포인트 수정 * fix:후보자 정보 등록 폴더명 변경 * feat:각 후보 별 게시물 등록 엔티티 생성 * feat: 각 후보의 게시물 등록 기능 * fix:엔드포인트추가 * fix:dto타입으로 반환 * feat: 유저 가입 승인 기능 구현 (#24) * feat: 회원가입 요청한 유저의 목록 조회 기능 구현 * feat: 유저 가입 승인 기능 구현 * feat: 가입 요청 거절 기능 구현 (#26) * feat: 회원가입 요청한 유저의 목록 조회 기능 구현 * feat: 유저 가입 승인 기능 구현 * feat: 가입 요청 거절 기능 구현 --------- Co-authored-by: ssm00 Co-authored-by: ssm00 Co-authored-by: ssm00 <97657265+ssm00@users.noreply.github.com> --- .../admin/application/AdminService.java | 22 +++++++++++++++++++ .../admin/exception/AlreadyApprovedUser.java | 7 ++++++ .../admin/presentation/AdminController.java | 9 ++++++++ 3 files changed, 38 insertions(+) create mode 100644 src/main/java/com/studentvote/domain/admin/exception/AlreadyApprovedUser.java diff --git a/src/main/java/com/studentvote/domain/admin/application/AdminService.java b/src/main/java/com/studentvote/domain/admin/application/AdminService.java index 37183fc..267c056 100644 --- a/src/main/java/com/studentvote/domain/admin/application/AdminService.java +++ b/src/main/java/com/studentvote/domain/admin/application/AdminService.java @@ -1,6 +1,7 @@ package com.studentvote.domain.admin.application; import com.studentvote.domain.admin.dto.response.AccountsWaitingForApprovalResponse; +import com.studentvote.domain.admin.exception.AlreadyApprovedUser; import com.studentvote.domain.auth.dto.response.CustomUserDetails; import com.studentvote.domain.user.domain.ApprovalStatus; import com.studentvote.domain.user.domain.User; @@ -65,4 +66,25 @@ public Message admitUser(CustomUserDetails userDetails, Long userId) { .message("해당 유저의 승인이 완료되었습니다.") .build(); } + + @Transactional + public Message denyUser(CustomUserDetails userDetails, Long userId) throws AlreadyApprovedUser { + + if (!userDetails.getUsername().equals(MASTER_USERNAME)) { + throw new IllegalArgumentException("접근 권한이 없습니다."); + } + + User user = userRepository.findById(userId) + .orElseThrow(() -> new IllegalArgumentException()); + + if (user.getApprovalStatus() == ApprovalStatus.APPROVED) { + throw new AlreadyApprovedUser(); + } + + user.updateApprovalStatus(ApprovalStatus.REJECTED); + + return Message.builder() + .message("해당 유저의 승인이 거절되었습니다.") + .build(); + } } diff --git a/src/main/java/com/studentvote/domain/admin/exception/AlreadyApprovedUser.java b/src/main/java/com/studentvote/domain/admin/exception/AlreadyApprovedUser.java new file mode 100644 index 0000000..4e0fff8 --- /dev/null +++ b/src/main/java/com/studentvote/domain/admin/exception/AlreadyApprovedUser.java @@ -0,0 +1,7 @@ +package com.studentvote.domain.admin.exception; + +public class AlreadyApprovedUser extends IllegalArgumentException { + public AlreadyApprovedUser() { + super("이미 승인된 유저입니다."); + } +} diff --git a/src/main/java/com/studentvote/domain/admin/presentation/AdminController.java b/src/main/java/com/studentvote/domain/admin/presentation/AdminController.java index a9091db..3381cf7 100644 --- a/src/main/java/com/studentvote/domain/admin/presentation/AdminController.java +++ b/src/main/java/com/studentvote/domain/admin/presentation/AdminController.java @@ -36,4 +36,13 @@ public ResponseCustom admitUser( ) { return ResponseCustom.OK(adminService.admitUser(userDetails, userId)); } + + @Operation(summary = "가입 거절", description = "가입 대기중인 선택한 유저에 대한 가입을 거절합니다.") + @PostMapping("/deny/{userId}") + public ResponseCustom denyUser( + @AuthenticationPrincipal CustomUserDetails userDetails, + @PathVariable Long userId + ) { + return ResponseCustom.OK(adminService.denyUser(userDetails, userId)); + } }