package com.billpaymentservice.bbps.controller; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.AllMasterOptionsRequest; import com.billpaymentservice.bbps.dto.request.ComplainStatusRequest; import com.billpaymentservice.bbps.dto.request.ComplaintRequestDTO; import com.billpaymentservice.bbps.dto.request.GetTicketLatestStausRequest; import com.billpaymentservice.bbps.dto.request.ViewAllComplaintsTicketsRequest; import com.billpaymentservice.bbps.service.ComplainService; 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("/complaints") @Validated @CrossOrigin(origins = "*") public class ComplainController { private static final Logger log = LoggerFactory.getLogger(ComplainController.class); private final ComplainService complainService; public ComplainController(ComplainService complainService) { this.complainService = complainService; } @PostMapping(value = "/addComplainTicket") @Operation(summary = "Add complaint ticket", description = "This API creates a new complaint ticket based on the provided request details.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Complaint ticket created successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity addComplain(@Validated @RequestBody ComplaintRequestDTO complainRequestDTO) { ResponseModel response = complainService.addComplain(complainRequestDTO); return ResponseEntity.ok(response); } @PostMapping(value = "/checkTicketStatus") @Operation(summary = "Fetch latest complaint ticket status", description = "This API retrieves the latest status of a complaint ticket based on the provided ticket ID.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Complaint ticket status fetched successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity getComplaintStatus( @Validated @RequestBody GetTicketLatestStausRequest request) { log.info("Received complaint status request for complaintId: {}", request.getTicketId()); ResponseModel response = complainService.getComplaintStatus(request); return ResponseEntity.ok(response); } @PostMapping(value = "/viewComplainsTicketHistory") @Operation(summary = "View complaint ticket history", description = "This API retrieves the full complaint history for the provided ticket ID.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Complaint ticket history fetched successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity viewComplaintHistory(@Validated @RequestBody ComplainStatusRequest request) { log.info("Received complaint View Complaint History request for ticketId: {}", request.getTicketId()); ResponseModel response = complainService.viewComplaintHistory(request); return ResponseEntity.ok(response); } @PostMapping("/viewTicketById") @Operation(summary = "View complaint details by ID", description = "This API retrieves the complaint details for the given complaint ticket ID.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Complaint details fetched successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity viewComplaintById(@Validated @RequestBody ComplainStatusRequest request) { log.info("Received complaint View Complaint By ID request for complaintId: {}", request.getTicketId()); ResponseModel response = complainService.viewComplaintById(request); return ResponseEntity.ok(response); } @PostMapping("/allMasterOptions") @Operation(summary = "Fetch all master options by ID", description = "This API retrieves all master option values based on the provided ID.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "Master options fetched successfully", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity getAllStatuses(@Validated @RequestBody AllMasterOptionsRequest request) { return ResponseEntity.ok(complainService.getAllActiveStatuses(request)); } @PostMapping("/viewAllComplaints") @Operation(summary = "View all complaints by status type", description = "This API retrieves all complaints filtered by the provided status type.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "All complaints fetched successfully based on status type", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity viewAllComplaints( @Validated @RequestBody ViewAllComplaintsTicketsRequest request) { log.info("Received request complaint View All Complaints for Status Type={}", request.getStatusType()); ResponseModel response = complainService.ViewAllComplaints(request); return ResponseEntity.ok(response); } @PostMapping(value = "/viewAllComplaintsByUserId") @Operation(summary = "View all complaints by user ID", description = "This API retrieves all complaint tickets associated with the provided user ID.") @ApiResponses(value = { @ApiResponse(responseCode = BBPSConstant.OK_STR, description = "All complaints fetched successfully by user ID", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ResponseModel.class))) }) @ApiDocCommonResponses public ResponseEntity viewAllComplaintsByUserId( @Validated @RequestBody AllMasterOptionsRequest request) { ResponseModel response = complainService.viewAllComplaintsByUserId(request); return ResponseEntity.ok(response); } }