snp-batch-validation/src/main/java/com/snp/batch/global/controller/BypassAccountController.java
HYOJIN ad18ab9c30 feat(email): Bypass API 계정 이메일 알림 및 거절 후속 조치 (#140)
- 이메일 공통 모듈 (spring-boot-starter-mail, EmailService, Thymeleaf 템플릿)
- 승인 시 계정 발급 이메일 / 거절 시 사유 이메일 자동 발송
- 재심사 기능 (REJECTED → PENDING)
- UI 텍스트 리레이블링 (S&P Global API)
- 신청 폼 전화번호 필드 제거 및 레이아웃 개선
2026-04-03 10:34:45 +09:00

124 lines
5.4 KiB
Java

package com.snp.batch.global.controller;
import com.snp.batch.common.web.ApiResponse;
import com.snp.batch.global.dto.bypass.BypassAccountResponse;
import com.snp.batch.global.dto.bypass.BypassAccountUpdateRequest;
import com.snp.batch.global.dto.bypass.BypassRequestReviewRequest;
import com.snp.batch.global.dto.bypass.BypassRequestResponse;
import com.snp.batch.global.dto.bypass.BypassRequestSubmitRequest;
import com.snp.batch.service.BypassApiAccountService;
import com.snp.batch.service.BypassApiRequestService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Bypass API 계정 및 신청 관리 컨트롤러
*/
@Slf4j
@RestController
@RequestMapping("/api/bypass-account")
@RequiredArgsConstructor
@Tag(name = "Bypass Account", description = "Bypass API 계정 및 신청 관리")
public class BypassAccountController {
private final BypassApiAccountService accountService;
private final BypassApiRequestService requestService;
// --- Account CRUD ---
@GetMapping("/accounts")
@Operation(summary = "계정 목록 조회")
public ResponseEntity<ApiResponse<Page<BypassAccountResponse>>> getAccounts(
@RequestParam(required = false) String status,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
return ResponseEntity.ok(ApiResponse.success(accountService.getAccounts(status, page, size)));
}
@GetMapping("/accounts/{id}")
@Operation(summary = "계정 상세 조회")
public ResponseEntity<ApiResponse<BypassAccountResponse>> getAccount(@PathVariable Long id) {
return ResponseEntity.ok(ApiResponse.success(accountService.getAccount(id)));
}
@PutMapping("/accounts/{id}")
@Operation(summary = "계정 수정")
public ResponseEntity<ApiResponse<BypassAccountResponse>> updateAccount(
@PathVariable Long id,
@RequestBody BypassAccountUpdateRequest request) {
return ResponseEntity.ok(ApiResponse.success(accountService.updateAccount(id, request)));
}
@DeleteMapping("/accounts/{id}")
@Operation(summary = "계정 삭제")
public ResponseEntity<ApiResponse<Void>> deleteAccount(@PathVariable Long id) {
accountService.deleteAccount(id);
return ResponseEntity.ok(ApiResponse.success(null));
}
@PostMapping("/accounts/{id}/reset-password")
@Operation(summary = "비밀번호 재설정")
public ResponseEntity<ApiResponse<BypassAccountResponse>> resetPassword(@PathVariable Long id) {
return ResponseEntity.ok(ApiResponse.success(accountService.resetPassword(id)));
}
// --- Request management ---
@PostMapping("/requests")
@Operation(summary = "API 접근 신청 (공개)")
public ResponseEntity<ApiResponse<BypassRequestResponse>> submitRequest(
@RequestBody BypassRequestSubmitRequest request) {
return ResponseEntity.ok(ApiResponse.success(requestService.submitRequest(request)));
}
@GetMapping("/requests")
@Operation(summary = "신청 목록 조회")
public ResponseEntity<ApiResponse<Page<BypassRequestResponse>>> getRequests(
@RequestParam(required = false) String status,
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) {
return ResponseEntity.ok(ApiResponse.success(requestService.getRequests(status, page, size)));
}
@GetMapping("/requests/{id}")
@Operation(summary = "신청 상세 조회")
public ResponseEntity<ApiResponse<BypassRequestResponse>> getRequest(@PathVariable Long id) {
return ResponseEntity.ok(ApiResponse.success(requestService.getRequest(id)));
}
@PostMapping("/requests/{id}/approve")
@Operation(summary = "신청 승인 (계정 자동 생성)")
public ResponseEntity<ApiResponse<BypassAccountResponse>> approveRequest(
@PathVariable Long id,
@RequestBody BypassRequestReviewRequest review) {
return ResponseEntity.ok(ApiResponse.success(requestService.approveRequest(id, review)));
}
@PostMapping("/requests/{id}/reject")
@Operation(summary = "신청 거절")
public ResponseEntity<ApiResponse<BypassRequestResponse>> rejectRequest(
@PathVariable Long id,
@RequestBody BypassRequestReviewRequest review) {
return ResponseEntity.ok(ApiResponse.success(requestService.rejectRequest(id, review)));
}
@PostMapping("/requests/{id}/reopen")
@Operation(summary = "신청 재심사 (거절 → 대기)")
public ResponseEntity<ApiResponse<BypassRequestResponse>> reopenRequest(@PathVariable Long id) {
return ResponseEntity.ok(ApiResponse.success(requestService.reopenRequest(id)));
}
}