TraceAttachmentController.java
package fr.avenirsesr.portfolio.file.application.adapter.controller;
import fr.avenirsesr.portfolio.file.application.adapter.dto.AttachmentUploadDTO;
import fr.avenirsesr.portfolio.file.application.adapter.mapper.AttachmentUploadDTOMapper;
import fr.avenirsesr.portfolio.file.domain.port.input.TraceAttachmentService;
import fr.avenirsesr.portfolio.shared.application.adapter.utils.UserUtil;
import fr.avenirsesr.portfolio.user.domain.model.User;
import jakarta.validation.Valid;
import java.io.IOException;
import java.security.Principal;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/me/storage/traces")
public class TraceAttachmentController {
private final UserUtil userUtil;
private final TraceAttachmentService service;
@PostMapping(value = "/{traceId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public ResponseEntity<AttachmentUploadDTO> uploadAttachment(
Principal principal,
@Valid @PathVariable UUID traceId,
@RequestParam("file") MultipartFile file)
throws IOException {
log.debug(
"Received attachment upload request from user [{}] for trace [{}]",
principal.getName(),
traceId);
User user = userUtil.getUser(principal);
var attachment =
service.uploadTraceAttachment(
user.toStudent(),
traceId,
file.getOriginalFilename(),
file.getContentType(),
file.getSize(),
file.getBytes());
return ResponseEntity.status(201).body(AttachmentUploadDTOMapper.fromDomain(attachment));
}
}