ExportController.java

package com.ambrosiaandrade.pets.controller;

import com.ambrosiaandrade.pets.service.ExportService;
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;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "4. Export controller", description = "Controller for exporting data in different formats")
@RestController
@RequestMapping("/export")
public class ExportController {

    private final ExportService service;

    public ExportController(ExportService service) {
        this.service = service;
    }

    @Operation(summary = "Export data in CSV format",
            description = "Exports the data in CSV format. The response is a CSV file containing the exported data.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200",
                    description = "CSV file exported successfully",
                    content = {@Content(mediaType = "text/csv", schema = @Schema(type = "string"))}),
            @ApiResponse(responseCode = "500",
                    description = "Internal server error while exporting CSV",
                    content = {@Content(mediaType = "text/csv")})
    })
    @GetMapping("/csv")
    public ResponseEntity<byte[]> getCsv() {
        var bytes = service.getCsv();

        HttpHeaders headers = new HttpHeaders();
        headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=pets.csv");
        headers.set(HttpHeaders.CONTENT_TYPE, "text/csv; charset=UTF-8");

        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
    }

    @Operation(summary = "Export data in PDF format",
            description = "Exports the data in PDF format. The response is a PDF file containing the exported data.")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "200",
                    description = "PDF file exported successfully",
                    content = {@Content(mediaType = "application/pdf", schema = @Schema(type = "string"))}),
            @ApiResponse(responseCode = "500",
                    description = "Internal server error while exporting PDF",
                    content = {@Content(mediaType = "application/pdf")})
    })
    @GetMapping("/pdf")
    public ResponseEntity<byte[]> getPdf() {
        var bytes = service.getPdf();

        HttpHeaders headers = new HttpHeaders();
        headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=pets.pdf");
        headers.set(HttpHeaders.CONTENT_TYPE, "application/pdf");

        return new ResponseEntity<>(bytes, headers, HttpStatus.OK);
    }

}