143 lines
6.8 KiB
Java
143 lines
6.8 KiB
Java
package eu.eudat.controllers.v2;
|
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
import eu.eudat.audit.AuditableAction;
|
|
import eu.eudat.authorization.AuthorizationFlags;
|
|
import eu.eudat.authorization.Permission;
|
|
import eu.eudat.commons.enums.*;
|
|
import eu.eudat.commons.scope.user.UserScope;
|
|
import eu.eudat.convention.ConventionService;
|
|
import eu.eudat.data.StorageFileEntity;
|
|
import eu.eudat.model.*;
|
|
import eu.eudat.model.builder.DescriptionBuilder;
|
|
import eu.eudat.model.censorship.DescriptionCensor;
|
|
import eu.eudat.model.censorship.PublicDescriptionCensor;
|
|
import eu.eudat.model.persist.DescriptionPersist;
|
|
import eu.eudat.model.persist.StorageFilePersist;
|
|
import eu.eudat.model.result.QueryResult;
|
|
import eu.eudat.query.DescriptionQuery;
|
|
import eu.eudat.query.DmpQuery;
|
|
import eu.eudat.query.StorageFileQuery;
|
|
import eu.eudat.query.lookup.DescriptionLookup;
|
|
import eu.eudat.service.description.DescriptionService;
|
|
import eu.eudat.service.elastic.ElasticQueryHelperService;
|
|
import eu.eudat.service.storage.StorageFileProperties;
|
|
import eu.eudat.service.storage.StorageFileService;
|
|
import gr.cite.commons.web.authz.service.AuthorizationService;
|
|
import gr.cite.tools.auditing.AuditService;
|
|
import gr.cite.tools.data.builder.BuilderFactory;
|
|
import gr.cite.tools.data.censor.CensorFactory;
|
|
import gr.cite.tools.data.query.QueryFactory;
|
|
import gr.cite.tools.exception.MyApplicationException;
|
|
import gr.cite.tools.exception.MyForbiddenException;
|
|
import gr.cite.tools.exception.MyNotFoundException;
|
|
import gr.cite.tools.fieldset.BaseFieldSet;
|
|
import gr.cite.tools.fieldset.FieldSet;
|
|
import gr.cite.tools.logging.LoggerService;
|
|
import gr.cite.tools.logging.MapLogEntry;
|
|
import gr.cite.tools.validation.MyValidate;
|
|
import org.apache.commons.io.FilenameUtils;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.springframework.context.MessageSource;
|
|
import org.springframework.context.i18n.LocaleContextHolder;
|
|
import org.springframework.core.io.ByteArrayResource;
|
|
import org.springframework.core.io.InputStreamResource;
|
|
import org.springframework.http.HttpHeaders;
|
|
import org.springframework.http.MediaType;
|
|
import org.springframework.http.ResponseEntity;
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
import org.springframework.web.bind.annotation.*;
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
import javax.management.InvalidApplicationException;
|
|
import java.io.IOException;
|
|
import java.net.URLConnection;
|
|
import java.time.Duration;
|
|
import java.util.*;
|
|
|
|
import static eu.eudat.authorization.AuthorizationFlags.Public;
|
|
|
|
@RestController
|
|
@RequestMapping(path = "api/storage-file")
|
|
public class StorageFileController {
|
|
|
|
private static final LoggerService logger = new LoggerService(LoggerFactory.getLogger(StorageFileController.class));
|
|
private final AuditService auditService;
|
|
private final QueryFactory queryFactory;
|
|
private final MessageSource messageSource;
|
|
private final StorageFileService storageFileService;
|
|
private final StorageFileProperties config;
|
|
private final UserScope userScope;
|
|
private final AuthorizationService authorizationService;
|
|
private final ConventionService conventionService;
|
|
public StorageFileController(
|
|
AuditService auditService,
|
|
QueryFactory queryFactory,
|
|
MessageSource messageSource,
|
|
StorageFileService storageFileService,
|
|
StorageFileProperties config,
|
|
UserScope userScope,
|
|
AuthorizationService authorizationService, ConventionService conventionService) {
|
|
this.auditService = auditService;
|
|
this.queryFactory = queryFactory;
|
|
this.messageSource = messageSource;
|
|
this.storageFileService = storageFileService;
|
|
this.config = config;
|
|
this.userScope = userScope;
|
|
this.authorizationService = authorizationService;
|
|
this.conventionService = conventionService;
|
|
}
|
|
|
|
|
|
@PostMapping("upload-temp-files")
|
|
@Transactional
|
|
public List<StorageFile> uploadTempFiles(@RequestParam("files") MultipartFile[] files) throws IOException {
|
|
logger.debug("upload temp files");
|
|
|
|
this.authorizationService.authorizeForce(Permission.EditStorageFile);
|
|
|
|
List<StorageFile> addedFiles = new ArrayList<>();
|
|
for (MultipartFile file : files) {
|
|
StorageFilePersist storageFilePersist = new StorageFilePersist();
|
|
storageFilePersist.setName(FilenameUtils.removeExtension(file.getName()));
|
|
storageFilePersist.setExtension(FilenameUtils.getExtension(file.getName()));
|
|
storageFilePersist.setMimeType(URLConnection.guessContentTypeFromName(file.getName()));
|
|
storageFilePersist.setOwnerId(this.userScope.getUserIdSafe());
|
|
storageFilePersist.setStorageType(StorageType.Temp);
|
|
storageFilePersist.setLifetime(Duration.ofSeconds(this.config.getTempStoreLifetimeSeconds()));
|
|
StorageFile persisted = this.storageFileService.persistBytes(storageFilePersist, file.getBytes(), new BaseFieldSet(StorageFile._id, StorageFile._name));
|
|
|
|
addedFiles.add(persisted);
|
|
}
|
|
this.auditService.track(AuditableAction.StorageFile_Upload, "models", addedFiles);
|
|
|
|
return addedFiles;
|
|
}
|
|
|
|
@GetMapping("{id}")
|
|
public ResponseEntity<ByteArrayResource> get(@PathVariable("id") UUID id) throws MyApplicationException, MyForbiddenException, MyNotFoundException {
|
|
logger.debug(new MapLogEntry("download" ).And("id", id));
|
|
|
|
this.authorizationService.authorizeForce(Permission.BrowseStorageFile);
|
|
|
|
StorageFileEntity storageFile = this.queryFactory.query(StorageFileQuery.class).ids(id).firstAs(new BaseFieldSet().ensure(StorageFile._createdAt, StorageFile._fullName, StorageFile._mimeType));
|
|
if (storageFile == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, StorageFile.class.getSimpleName()}, LocaleContextHolder.getLocale()));
|
|
|
|
byte[] file = this.storageFileService.readAsBytesSafe(id);
|
|
if (file == null) throw new MyNotFoundException(messageSource.getMessage("General_ItemNotFound", new Object[]{id, StorageFile.class.getSimpleName()}, LocaleContextHolder.getLocale()));
|
|
|
|
this.auditService.track(AuditableAction.StorageFile_Download, Map.ofEntries(
|
|
new AbstractMap.SimpleEntry<String, Object>("id", id)
|
|
));
|
|
|
|
String contentType = storageFile.getMimeType();
|
|
if (this.conventionService.isNullOrEmpty(contentType)) contentType = MediaType.APPLICATION_OCTET_STREAM_VALUE;
|
|
|
|
return ResponseEntity.ok()
|
|
.contentType(MediaType.valueOf(contentType))
|
|
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + storageFile.getName() + (storageFile.getExtension().startsWith(".") ? "" : ".") + storageFile.getExtension() + "\"")
|
|
.body(new ByteArrayResource(file));
|
|
}
|
|
|
|
}
|