package com.talentcard.server.business.admin; import java.util.Map; import com.talentcard.server.business.PageResult; import com.talentcard.server.business.admin.auth.AdminAuthInterceptor; import com.talentcard.server.common.ApiResponse; import jakarta.validation.Valid; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; 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.DeleteMapping; 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.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; @RestController @RequestMapping("/api/admin/business") public class AdminBusinessController { private final AdminBusinessService adminBusinessService; public AdminBusinessController(AdminBusinessService adminBusinessService) { this.adminBusinessService = adminBusinessService; } @GetMapping("/dashboard") public ApiResponse> dashboard() { return ApiResponse.success(adminBusinessService.dashboard()); } @GetMapping("/pending-notices") public ApiResponse>> pendingNotices() { return ApiResponse.success(adminBusinessService.pendingNotices()); } @GetMapping("/news") public ApiResponse>> news( @RequestParam(required = false) String title, @RequestParam(required = false) String source, @RequestParam(required = false) Integer status, @RequestParam(required = false) String publishStart, @RequestParam(required = false) String publishEnd, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size ) { return ApiResponse.success(adminBusinessService.news(title, source, status, publishStart, publishEnd, page, size)); } @GetMapping("/news/{id}") public ApiResponse> newsDetail(@PathVariable Long id) { return ApiResponse.success(adminBusinessService.newsDetail(id)); } @PostMapping("/news") @ResponseStatus(HttpStatus.CREATED) public ApiResponse> createNews(@Valid @RequestBody NewsArticleRequest request, HttpServletRequest servletRequest) { String operatorName = String.valueOf(servletRequest.getAttribute(AdminAuthInterceptor.OPERATOR_NAME_ATTRIBUTE)); return ApiResponse.success(adminBusinessService.createNews(request, operatorName)); } @PutMapping("/news/{id}") public ApiResponse> updateNews( @PathVariable Long id, @Valid @RequestBody NewsArticleRequest request ) { return ApiResponse.success(adminBusinessService.updateNews(id, request)); } @PatchMapping("/news/{id}/status") public ApiResponse> updateNewsStatus( @PathVariable Long id, @Valid @RequestBody StatusUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateNewsStatus(id, request.status())); } @GetMapping("/policies") public ApiResponse>> policies( @RequestParam(required = false) String title, @RequestParam(required = false) String author, @RequestParam(required = false) Integer status, @RequestParam(required = false) String publishStart, @RequestParam(required = false) String publishEnd, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size ) { return ApiResponse.success(adminBusinessService.policies(title, author, status, publishStart, publishEnd, page, size)); } @GetMapping("/policies/{id}") public ApiResponse> policyDetail(@PathVariable Long id) { return ApiResponse.success(adminBusinessService.policyDetail(id)); } @PostMapping("/policies") @ResponseStatus(HttpStatus.CREATED) public ApiResponse> createPolicy(@Valid @RequestBody PolicyArticleRequest request, HttpServletRequest servletRequest) { String operatorName = String.valueOf(servletRequest.getAttribute(AdminAuthInterceptor.OPERATOR_NAME_ATTRIBUTE)); Long operatorId = (Long) servletRequest.getAttribute(AdminAuthInterceptor.OPERATOR_ID_ATTRIBUTE); return ApiResponse.success(adminBusinessService.createPolicy(request, operatorId, operatorName)); } @PutMapping("/policies/{id}") public ApiResponse> updatePolicy(@PathVariable Long id, @Valid @RequestBody PolicyArticleRequest request, HttpServletRequest servletRequest) { Long operatorId = (Long) servletRequest.getAttribute(AdminAuthInterceptor.OPERATOR_ID_ATTRIBUTE); return ApiResponse.success(adminBusinessService.updatePolicy(id, request, operatorId)); } @PatchMapping("/policies/{id}/status") public ApiResponse> updatePolicyStatus(@PathVariable Long id, @Valid @RequestBody StatusUpdateRequest request) { return ApiResponse.success(adminBusinessService.updatePolicyStatus(id, request.status())); } @GetMapping("/merchants") public ApiResponse>> merchants( @RequestParam(required = false) String keyword, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String type, @RequestParam(required = false) Integer status, @RequestParam(required = false) Integer recommend, @RequestParam(required = false) String createdStart, @RequestParam(required = false) String createdEnd, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size ) { return ApiResponse.success(adminBusinessService.merchants( keyword, contactMobile, type, status, recommend, createdStart, createdEnd, page, size)); } @GetMapping("/merchants/{id}") public ApiResponse> merchant(@PathVariable Long id) { return ApiResponse.success(adminBusinessService.merchant(id)); } @GetMapping("/merchants/login-account-available") public ApiResponse> merchantLoginAccountAvailable( @RequestParam String account, @RequestParam(required = false) Long merchantId) { return ApiResponse.success(adminBusinessService.merchantLoginAccountAvailable(account, merchantId)); } @PostMapping("/merchants") @ResponseStatus(HttpStatus.CREATED) public ApiResponse> createMerchant(@Valid @RequestBody MerchantCreateRequest request) { return ApiResponse.success(adminBusinessService.createMerchant(request)); } @PutMapping("/merchants/{id}") public ApiResponse> updateMerchant( @PathVariable Long id, @Valid @RequestBody MerchantUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateMerchant(id, request)); } @PatchMapping("/merchants/{id}/status") public ApiResponse> updateMerchantStatus( @PathVariable Long id, @Valid @RequestBody StatusUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateMerchantStatus(id, request.status())); } @PatchMapping("/merchants/{id}/recommend") public ApiResponse> updateMerchantRecommend( @PathVariable Long id, @Valid @RequestBody RecommendUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateMerchantRecommend(id, request.recommend())); } @PostMapping("/benefits") @ResponseStatus(HttpStatus.CREATED) public ApiResponse> createBenefit(@Valid @RequestBody BenefitCreateRequest request) { return ApiResponse.success(adminBusinessService.createBenefit(request)); } @GetMapping("/service-hero-images") public ApiResponse> serviceHeroImages() { return ApiResponse.success(adminBusinessService.serviceHeroImages()); } @PutMapping("/service-hero-images") public ApiResponse> saveServiceHeroImage(@Valid @RequestBody ServiceHeroImageRequest request) { return ApiResponse.success(adminBusinessService.saveServiceHeroImage(request.type(), request.imageUrl())); } @GetMapping("/products") public ApiResponse>> products( @RequestParam(required = false) Long merchantId, @RequestParam(required = false) String merchantName, @RequestParam(required = false) String contactMobile, @RequestParam(required = false) String keyword, @RequestParam(required = false) String type, @RequestParam(required = false) Integer status, @RequestParam(required = false) String createdStart, @RequestParam(required = false) String createdEnd, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size ) { return ApiResponse.success(adminBusinessService.products( merchantId, merchantName, contactMobile, keyword, type, status, createdStart, createdEnd, page, size)); } @GetMapping("/merchants/{id}/products") public ApiResponse>> merchantProducts( @PathVariable Long id, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer status, @RequestParam(required = false) String createdStart, @RequestParam(required = false) String createdEnd, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size ) { return ApiResponse.success(adminBusinessService.merchantProducts(id, keyword, status, createdStart, createdEnd, page, size)); } @GetMapping("/products/{id}") public ApiResponse> product(@PathVariable Long id) { return ApiResponse.success(adminBusinessService.productAuditRecord(id)); } @PostMapping("/products") @ResponseStatus(HttpStatus.CREATED) public ApiResponse> createProduct(@Valid @RequestBody ProductCreateRequest request) { return ApiResponse.success(adminBusinessService.createProduct(request)); } @PutMapping("/products/{id}") public ApiResponse> updateProduct( @PathVariable Long id, @Valid @RequestBody ProductUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateProduct(id, request)); } @PatchMapping("/products/{id}/status") public ApiResponse> updateProductStatus( @PathVariable Long id, @Valid @RequestBody StatusUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateProductStatus(id, request.status())); } @DeleteMapping("/products/{id}") public ApiResponse> deleteProduct(@PathVariable Long id) { return ApiResponse.success(adminBusinessService.deleteProduct(id)); } @PatchMapping("/products/{id}/audit") public ApiResponse> auditProduct( @PathVariable Long id, @Valid @RequestBody ProductAuditRequest request ) { return ApiResponse.success(adminBusinessService.auditProductAuditRecord(id, request)); } @GetMapping("/coupons") public ApiResponse>> coupons( @RequestParam(required = false) Long merchantId, @RequestParam(required = false) String keyword, @RequestParam(required = false) Integer status, @RequestParam(required = false) String createdStart, @RequestParam(required = false) String createdEnd, @RequestParam(defaultValue = "1") int page, @RequestParam(defaultValue = "10") int size ) { return ApiResponse.success(adminBusinessService.coupons( merchantId, keyword, status, createdStart, createdEnd, page, size)); } @GetMapping("/coupons/{id}") public ApiResponse> coupon(@PathVariable Long id) { return ApiResponse.success(adminBusinessService.coupon(id)); } @PostMapping("/coupons") @ResponseStatus(HttpStatus.CREATED) public ApiResponse> createCoupon(@Valid @RequestBody CouponCreateRequest request) { return ApiResponse.success(adminBusinessService.createCoupon(request)); } @PutMapping("/coupons/{id}") public ApiResponse> updateCoupon( @PathVariable Long id, @Valid @RequestBody CouponUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateCoupon(id, request)); } @PatchMapping("/coupons/{id}/status") public ApiResponse> updateCouponStatus( @PathVariable Long id, @Valid @RequestBody StatusUpdateRequest request ) { return ApiResponse.success(adminBusinessService.updateCouponStatus(id, request.status())); } @DeleteMapping("/coupons/{id}") public ApiResponse> deleteCoupon(@PathVariable Long id) { return ApiResponse.success(adminBusinessService.deleteCoupon(id)); } }