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>> 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> getAccount(@PathVariable Long id) { return ResponseEntity.ok(ApiResponse.success(accountService.getAccount(id))); } @PutMapping("/accounts/{id}") @Operation(summary = "계정 수정") public ResponseEntity> updateAccount( @PathVariable Long id, @RequestBody BypassAccountUpdateRequest request) { return ResponseEntity.ok(ApiResponse.success(accountService.updateAccount(id, request))); } @DeleteMapping("/accounts/{id}") @Operation(summary = "계정 삭제") public ResponseEntity> deleteAccount(@PathVariable Long id) { accountService.deleteAccount(id); return ResponseEntity.ok(ApiResponse.success(null)); } @PostMapping("/accounts/{id}/reset-password") @Operation(summary = "비밀번호 재설정") public ResponseEntity> resetPassword(@PathVariable Long id) { return ResponseEntity.ok(ApiResponse.success(accountService.resetPassword(id))); } // --- Request management --- @PostMapping("/requests") @Operation(summary = "API 접근 신청 (공개)") public ResponseEntity> submitRequest( @RequestBody BypassRequestSubmitRequest request) { return ResponseEntity.ok(ApiResponse.success(requestService.submitRequest(request))); } @GetMapping("/requests") @Operation(summary = "신청 목록 조회") public ResponseEntity>> 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> getRequest(@PathVariable Long id) { return ResponseEntity.ok(ApiResponse.success(requestService.getRequest(id))); } @PostMapping("/requests/{id}/approve") @Operation(summary = "신청 승인 (계정 자동 생성)") public ResponseEntity> approveRequest( @PathVariable Long id, @RequestBody BypassRequestReviewRequest review) { return ResponseEntity.ok(ApiResponse.success(requestService.approveRequest(id, review))); } @PostMapping("/requests/{id}/reject") @Operation(summary = "신청 거절") public ResponseEntity> rejectRequest( @PathVariable Long id, @RequestBody BypassRequestReviewRequest review) { return ResponseEntity.ok(ApiResponse.success(requestService.rejectRequest(id, review))); } @PostMapping("/requests/{id}/reopen") @Operation(summary = "신청 재심사 (거절 → 대기)") public ResponseEntity> reopenRequest(@PathVariable Long id) { return ResponseEntity.ok(ApiResponse.success(requestService.reopenRequest(id))); } }