DocumentController.java

package com.edtech.controller;

import com.edtech.dto.DocumentResponseDto;
import com.edtech.model.User;
import com.edtech.service.AuditExportService;
import com.edtech.service.DocumentService;
import java.util.UUID;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.Authentication;
import org.springframework.web.bind.annotation.DeleteMapping;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

/** Documentacao para DocumentController. */
@RestController
@RequestMapping("/api/documents")
public class DocumentController {

  private final DocumentService documentService;
  private final AuditExportService auditExportService;

  /** Documentacao para o metodo DocumentController. */
  public DocumentController(
      DocumentService documentService, AuditExportService auditExportService) {
    this.documentService = documentService;
    this.auditExportService = auditExportService;
  }

  /** Documentacao. */
  @PostMapping(consumes = "multipart/form-data")
  public ResponseEntity<DocumentResponseDto> uploadDocument(
      @RequestParam("file") MultipartFile file,
      @RequestParam("title") String title,
      @RequestParam("projectId") UUID projectId,
      Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    return ResponseEntity.status(HttpStatus.CREATED)
        .body(documentService.uploadDocument(file, title, projectId, user.getId()));
  }

  /** Documentacao. */
  @GetMapping
  public ResponseEntity<Page<DocumentResponseDto>> listDocuments(
      @RequestParam(required = false) UUID projectId,
      @RequestParam(required = false) String title,
      @RequestParam(required = false) com.edtech.model.DocumentStatus status,
      @PageableDefault(size = 20) Pageable pageable,
      Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    return ResponseEntity.ok(
        documentService.listDocumentsByUser(user.getId(), projectId, title, status, pageable));
  }

  @GetMapping("/{id}/download")
  public ResponseEntity<String> downloadDocument(
      @PathVariable UUID id, Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    return ResponseEntity.ok(documentService.getPresignedUrl(id, user.getId()));
  }

  /** Exporta a trilha de auditoria de um documento em arquivo CSV. */
  @GetMapping("/{id}/audit/export")
  public ResponseEntity<byte[]> exportAuditTrail(
      @PathVariable UUID id,
      @RequestParam(defaultValue = "csv") String format,
      Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    byte[] file = auditExportService.exportDocumentAuditTrail(id, user.getId(), format);
    String filename = auditExportService.buildFilename(id, format);

    return ResponseEntity.ok()
        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + filename + "\"")
        .contentType(MediaType.parseMediaType("text/csv"))
        .body(file);
  }

  /** Documentacao. */
  @DeleteMapping("/{id}")
  public ResponseEntity<Void> deleteDocument(@PathVariable UUID id, Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    documentService.deleteDocument(id, user.getId());
    return ResponseEntity.noContent().build();
  }

  /** Documentacao. */
  @PatchMapping("/{id}/status")
  public ResponseEntity<DocumentResponseDto> updateDocumentStatus(
      @PathVariable UUID id,
      @RequestBody com.edtech.dto.DocumentStatusUpdateDto dto,
      Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    DocumentResponseDto response =
        documentService.reviewDocument(id, user.getId(), dto.getStatus(), dto.getFeedback());
    return ResponseEntity.ok(response);
  }

  @PatchMapping("/{id}/star")
  public ResponseEntity<DocumentResponseDto> toggleStar(
      @PathVariable UUID id, Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    return ResponseEntity.ok(documentService.toggleStar(id, user.getId()));
  }

  @GetMapping("/{id}/comments")
  public ResponseEntity<java.util.List<com.edtech.dto.CommentResponseDto>> getComments(
      @PathVariable UUID id, Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    return ResponseEntity.ok(documentService.getComments(id, user.getId()));
  }

  /** Javadoc. */
  @PostMapping("/{id}/comments")
  public ResponseEntity<com.edtech.dto.CommentResponseDto> addComment(
      @PathVariable UUID id,
      @jakarta.validation.Valid @RequestBody com.edtech.dto.CommentRequestDto dto,
      Authentication authentication) {
    User user = (User) authentication.getPrincipal();
    return ResponseEntity.status(HttpStatus.CREATED)
        .body(documentService.addComment(id, user.getId(), dto.getContent()));
  }
}