StorageController.java

package fr.avenirsesr.portfolio.file.application.adapter.controller;

import fr.avenirsesr.portfolio.file.domain.model.EUserPhotoType;
import fr.avenirsesr.portfolio.file.domain.port.input.UserResourceService;
import fr.avenirsesr.portfolio.file.domain.port.output.service.FileStorageService;
import fr.avenirsesr.portfolio.file.infrastructure.configuration.FileStorageConstants;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid;
import java.io.IOException;
import java.util.UUID;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.MimeType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@AllArgsConstructor
@RestController
@RequestMapping("/storage")
public class StorageController {
  private final UserResourceService userResourceService;
  private final FileStorageService fileStorageService;

  @GetMapping("/users/{fileId}")
  public ResponseEntity<ByteArrayResource> getUserResourceByFileId(@Valid @PathVariable UUID fileId)
      throws IOException {
    log.debug("Received request to get user photo id [{}]", fileId);
    var userPhoto = userResourceService.getUserPhotoById(fileId);
    byte[] photo = userResourceService.fetchContent(userPhoto);

    return ResponseEntity.ok()
        .contentType(MediaType.asMediaType(MimeType.valueOf(userPhoto.getFileType().getMimeType())))
        .body(new ByteArrayResource(photo));
  }

  @GetMapping("/users/default/{photoType}")
  public ResponseEntity<ByteArrayResource> getDefaultResource(
      @Valid
          @Parameter(
              name = "photoType",
              in = ParameterIn.PATH,
              required = true,
              schema = @Schema(ref = "#/components/schemas/UserPhotoType"))
          @PathVariable
          EUserPhotoType photoType)
      throws IOException {
    log.debug("Received request to get default {} photo", photoType);
    byte[] photo =
        fileStorageService.get(
            switch (photoType) {
              case PROFILE -> FileStorageConstants.USER_PROFILE_DEFAULT_PATH;
              case COVER -> FileStorageConstants.USER_COVER_DEFAULT_PATH;
            });

    var fileType =
        switch (photoType) {
          case PROFILE -> FileStorageConstants.USER_PROFILE_DEFAULT_FILE_TYPE;
          case COVER -> FileStorageConstants.USER_COVER_DEFAULT_FILE_TYPE;
        };

    return ResponseEntity.ok()
        .contentType(MediaType.asMediaType(MimeType.valueOf(fileType.getMimeType())))
        .body(new ByteArrayResource(photo));
  }
}