PdfReportController.java

package com.wavii.controller;

import com.wavii.model.PdfDocument;
import com.wavii.model.PdfReport;
import com.wavii.model.User;
import com.wavii.repository.PdfReportRepository;
import com.wavii.service.OdooService;
import com.wavii.service.PdfStorageService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api/pdfs")
@RequiredArgsConstructor
@Slf4j
public class PdfReportController {

    private final PdfStorageService pdfStorageService;
    private final PdfReportRepository pdfReportRepository;
    private final OdooService odooService;

    @PostMapping("/{id}/report")
    public ResponseEntity<?> reportPdf(
            @PathVariable Long id,
            @AuthenticationPrincipal User currentUser,
            @RequestBody ReportRequest request) {
        if (currentUser == null) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
        }
        if (request.reason() == null || request.reason().isBlank()) {
            return ResponseEntity.badRequest().body(Map.of("message", "La razón es obligatoria"));
        }
        try {
            PdfDocument pdf = pdfStorageService.findById(id);
            PdfReport report = PdfReport.builder()
                    .pdfDocument(pdf)
                    .reporter(currentUser)
                    .reason(request.reason())
                    .details(request.details())
                    .build();
            pdfReportRepository.save(report);
            odooService.createModerationReport(
                    "pdf",
                    currentUser.getName(),
                    currentUser.getEmail(),
                    pdf.getSongTitle() != null && !pdf.getSongTitle().isBlank() ? pdf.getSongTitle() : pdf.getOriginalName(),
                    "pdf:" + pdf.getId(),
                    request.reason(),
                    request.details()
            );
            return ResponseEntity.ok(Map.of("message", "Reporte enviado"));
        } catch (Exception e) {
            log.error("Error al reportar PDF {}: {}", id, e.getMessage());
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                    .body(Map.of("message", "Error al enviar el reporte"));
        }
    }

    record ReportRequest(String reason, String details) {}
}