package com.talentcard.server.business.admin; import com.talentcard.server.common.ApiResponse; import jakarta.validation.Valid; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; @RestController @RequestMapping("/api/admin/management") public class AdminManagementController { private final AdminManagementService service; private final MerchantSettlementAdminService settlementService; private final PaymentReconciliationAdminService reconciliationService; private final ProtocolSettingAdminService protocolSettingService; public AdminManagementController(AdminManagementService service, MerchantSettlementAdminService settlementService, PaymentReconciliationAdminService reconciliationService, ProtocolSettingAdminService protocolSettingService) { this.service = service; this.settlementService = settlementService; this.reconciliationService = reconciliationService; this.protocolSettingService = protocolSettingService; } @GetMapping("/settings") public ApiResponse> settings() { return ApiResponse.success(service.settings()); } @PutMapping("/settings") public ApiResponse> saveSettings(@RequestBody Map body) { return ApiResponse.success(service.saveSettings(body)); } @GetMapping("/protocols/{key}") public ApiResponse> protocol(@PathVariable String key) { return ApiResponse.success(protocolSettingService.detail(key)); } @PutMapping("/protocols/{key}") public ApiResponse> saveProtocol(@PathVariable String key, @RequestBody Map body) { return ApiResponse.success(protocolSettingService.save(key, body.get("contentHtml"))); } @GetMapping("/roles") public ApiResponse>> roles() { return ApiResponse.success(service.roles()); } @PostMapping("/roles") public ApiResponse> createRole(@Valid @RequestBody AdminRoleRequest request) { return ApiResponse.success(service.createRole(request)); } @PutMapping("/roles/{id}") public ApiResponse> updateRole(@PathVariable Long id, @Valid @RequestBody AdminRoleRequest request) { return ApiResponse.success(service.updateRole(id, request)); } @PatchMapping("/roles/{id}/status") public ApiResponse> updateRoleStatus(@PathVariable Long id, @Valid @RequestBody AdminRoleStatusRequest request) { return ApiResponse.success(service.updateRoleStatus(id, request.status())); } @DeleteMapping("/roles/{id}") public ApiResponse> deleteRole(@PathVariable Long id) { return ApiResponse.success(service.deleteRole(id)); } @GetMapping("/staff") public ApiResponse>> staff() { return ApiResponse.success(service.staff()); } @GetMapping("/staff/account-available") public ApiResponse> staffAccountAvailable(@RequestParam String account) { return ApiResponse.success(service.staffAccountAvailable(account)); } @PostMapping("/staff") public ApiResponse> createStaff(@Valid @RequestBody AdminStaffRequest request) { return ApiResponse.success(service.createStaff(request)); } @PutMapping("/staff/{id}") public ApiResponse> updateStaff(@PathVariable Long id, @Valid @RequestBody AdminStaffRequest request) { return ApiResponse.success(service.updateStaff(id, request)); } @PatchMapping("/staff/{id}/password") public ApiResponse> resetStaffPassword(@PathVariable Long id, @RequestBody Map body) { return ApiResponse.success(service.resetStaffPassword(id, body.get("password"))); } @DeleteMapping("/staff/{id}") public ApiResponse> deleteStaff(@PathVariable Long id) { return ApiResponse.success(service.deleteStaff(id)); } @GetMapping("/merchant-settlement/onboardings") public ApiResponse>> onboardings(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String merchantType, @RequestParam(required = false) String status, @RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate) { return ApiResponse.success(settlementService.onboardings(page, size, merchantName, contactMobile, merchantType, status, startDate, endDate)); } @GetMapping("/merchant-settlement/onboardings/{id}") public ApiResponse> onboarding(@PathVariable Long id) { return ApiResponse.success(settlementService.onboarding(id)); } @GetMapping("/merchant-settlement/bank-cards") public ApiResponse>> bankCards(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String merchantType, @RequestParam(required = false) String status, @RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate) { return ApiResponse.success(settlementService.bankCards(page, size, merchantName, contactMobile, merchantType, status, startDate, endDate)); } @GetMapping("/merchant-settlement/withdrawals") public ApiResponse>> withdrawals(@RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String merchantType, @RequestParam(required = false) String status, @RequestParam(required = false) String startDate, @RequestParam(required = false) String endDate) { return ApiResponse.success(settlementService.withdrawals(page, size, merchantName, contactMobile, merchantType, status, startDate, endDate)); } @GetMapping("/payment-reconciliation/issues") public ApiResponse>> reconciliationIssues(@RequestParam(defaultValue = "open") String status, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "20") int size) { return ApiResponse.success(reconciliationService.issues(status, page, size)); } @PatchMapping("/payment-reconciliation/issues/{id}") public ApiResponse> closeReconciliationIssue(@PathVariable Long id, @RequestBody Map body) { return ApiResponse.success(reconciliationService.close(id, body.get("status"), body.get("operator"))); } @PostMapping("/payment-reconciliation/run") public ApiResponse> runPaymentReconciliation(@RequestParam(defaultValue = "5") int pendingAfterMinutes) { return ApiResponse.success(reconciliationService.run(pendingAfterMinutes)); } }