package com.billpaymentservice.bbps.controller; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.billpaymentservice.bbps.dto.ResponseModel; import com.billpaymentservice.bbps.dto.request.BillFetchByBillIdRequest; import com.billpaymentservice.bbps.dto.request.BillFetchByClientIdRequest; import com.billpaymentservice.bbps.dto.request.BillValidateByClientIdRequest; import com.billpaymentservice.bbps.dto.request.FetchBillRequest; import com.billpaymentservice.bbps.dto.request.FetchBillValidatestRequest; import com.billpaymentservice.bbps.dto.response.BillDataResponse; import com.billpaymentservice.bbps.dto.response.FetchBillValidateResponse; import com.billpaymentservice.bbps.service.AgentService; import com.billpaymentservice.bbps.util.ApiDocCommonResponses; import com.billpaymentservice.bbps.util.BBPSConstant; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; @RestController @RequestMapping("/agent") @CrossOrigin(origins = "*") public class AgentController { private final AgentService agentService; public AgentController(AgentService agentService) { this.agentService = agentService; } @PostMapping(value = "/requestBillFetch") @Operation(summary = "Initiate bill fetch request", description = "This API initiates a bill fetch request for the given customer/biller details.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Bill fetch request initiated successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity requestBillFetch(@Validated @RequestBody FetchBillRequest fetchBillRequest) { ResponseModel response = agentService.initiateBillFetch(fetchBillRequest); return ResponseEntity.ok(response); } @PostMapping(value = "/fetchBillById") @Operation(summary = "Fetch bill details by bill ID", description = "This API retrieves bill details from the BBPS system using the provided bill ID.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Bill details fetched successfully by bill ID", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity fetchBillById( @Validated @RequestBody BillFetchByBillIdRequest billFetchByBillIdRequest) { ResponseModel response = agentService.fetchBillById(billFetchByBillIdRequest); return ResponseEntity.ok(response); } @PostMapping(value = "/requestBillValidate") @Operation(summary = "Initiate bill validation request", description = "This API validates customer input and bill details .") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Bill validation initiated successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity requestBillValidate( @Validated @RequestBody FetchBillValidatestRequest fetchBillValidateRequest) { ResponseModel response = agentService.initiateBillValidate(fetchBillValidateRequest); return ResponseEntity.ok(response); } @PostMapping(value = "/requestBillValidateByBillId") @Operation(summary = "Bill validate by details by bill ID", description = "This API retrieves bill details from BBPS using the provided bill ID.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Bill details fetched successfully by bill ID", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity requestBillByBillId( @Validated @RequestBody BillFetchByBillIdRequest billRequest) { ResponseModel response = agentService.initiateBillValidateByBillId(billRequest); return ResponseEntity.ok(response); } @PostMapping(value = "/fetchBillByClientReqId") @Operation(summary = "Fetch bill details by client request ID", description = "This API fetches bill details using the client-generated request ID (clientReqId).") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Bill details fetched successfully using client request ID", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity fetchBillByClientReqId( @Validated @RequestBody BillFetchByClientIdRequest billFetchByClientIdRequest) { ResponseModel response = agentService.fetchBillByClientReqId(billFetchByClientIdRequest); return ResponseEntity.ok(response); } @PostMapping(value = "/fetchBillValidateByClientReqId") @Operation(summary = "Fetch bill details by client request ID", description = "This API retrieves bill details using the client's request ID (clientReqId).") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Bill details fetched successfully using client request ID", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity fetchBillValidateByClientReqId( @Validated @RequestBody BillValidateByClientIdRequest billValidateByClientIdRequest) { ResponseModel response = agentService.fetchBillValidateByClientReqId(billValidateByClientIdRequest); return ResponseEntity.ok(response); } @PostMapping(value = "/callback/billFetch") @Operation(summary = "Handle bill fetch callback", description = "This callback API is invoked by BBPS/Biller to send bill fetch response.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Callback received and processed successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity handleBillFetchCallback(@RequestBody BillDataResponse billDataResponse) { ResponseModel genralResp = agentService.processBillFetchCallback(billDataResponse); // Return a response indicating successful receipt return ResponseEntity.ok(genralResp); } @PostMapping(value = "/callback/billValidate") @Operation(summary = "Handle bill validate callback", description = "This callback API is triggered by BBPS/Biller to send bill validation response.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Callback received and processed successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity handleBillValidateCallback( @RequestBody FetchBillValidateResponse fetchBillValidateResponse) { ResponseModel genralResp = agentService.processBillValidateCallback(fetchBillValidateResponse); // Return a response indicating successful receipt return ResponseEntity.ok(genralResp); } }