1 package de.dlr.shepard.neo4Core.services;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.List;
6
7 import de.dlr.shepard.exceptions.InvalidAuthException;
8 import de.dlr.shepard.exceptions.InvalidBodyException;
9 import de.dlr.shepard.mongoDB.FileService;
10 import de.dlr.shepard.mongoDB.NamedInputStream;
11 import de.dlr.shepard.mongoDB.ShepardFile;
12 import de.dlr.shepard.neo4Core.dao.DataObjectDAO;
13 import de.dlr.shepard.neo4Core.dao.FileContainerDAO;
14 import de.dlr.shepard.neo4Core.dao.FileReferenceDAO;
15 import de.dlr.shepard.neo4Core.dao.ShepardFileDAO;
16 import de.dlr.shepard.neo4Core.dao.UserDAO;
17 import de.dlr.shepard.neo4Core.entities.FileReference;
18 import de.dlr.shepard.neo4Core.io.FileReferenceIO;
19 import de.dlr.shepard.security.PermissionsUtil;
20 import de.dlr.shepard.util.AccessType;
21 import de.dlr.shepard.util.DateHelper;
22 import lombok.extern.slf4j.Slf4j;
23
24 @Slf4j
25 public class FileReferenceService implements IReferenceService<FileReference, FileReferenceIO> {
26
27 private FileReferenceDAO fileReferenceDAO = new FileReferenceDAO();
28 private DataObjectDAO dataObjectDAO = new DataObjectDAO();
29 private FileContainerDAO containerDAO = new FileContainerDAO();
30 private ShepardFileDAO fileDAO = new ShepardFileDAO();
31 private UserDAO userDAO = new UserDAO();
32 private DateHelper dateHelper = new DateHelper();
33 private FileService fileService = new FileService();
34 private PermissionsUtil permissionsUtil = new PermissionsUtil();
35
36 @Override
37 public List<FileReference> getAllReferencesByDataObjectShepardId(long dataObjectShepardId) {
38 var references = fileReferenceDAO.findByDataObjectShepardId(dataObjectShepardId);
39 return references;
40 }
41
42 @Override
43 public FileReference getReferenceByShepardId(long shepardId) {
44 FileReference fileReference = fileReferenceDAO.findByShepardId(shepardId);
45 if (fileReference == null || fileReference.isDeleted()) {
46 log.error("File Reference with id {} is null or deleted", shepardId);
47 return null;
48 }
49 return fileReference;
50 }
51
52 @Override
53 public FileReference createReferenceByShepardId(long dataObjectShepardId, FileReferenceIO fileReference,
54 String username) {
55 var user = userDAO.find(username);
56 var dataObject = dataObjectDAO.findLightByShepardId(dataObjectShepardId);
57 var container = containerDAO.findLightByNeo4jId(fileReference.getFileContainerId());
58 if (container == null || container.isDeleted())
59 throw new InvalidBodyException("invalid container");
60 var toCreate = new FileReference();
61 toCreate.setCreatedAt(dateHelper.getDate());
62 toCreate.setCreatedBy(user);
63 toCreate.setDataObject(dataObject);
64 toCreate.setName(fileReference.getName());
65 toCreate.setFileContainer(container);
66
67
68 for (var oid : fileReference.getFileOids()) {
69 var file = fileDAO.find(container.getId(), oid);
70 if (file != null) {
71 toCreate.addFile(file);
72 } else {
73 log.warn("Could not find file with oid: {}", oid);
74 }
75 }
76
77 var created = fileReferenceDAO.createOrUpdate(toCreate);
78 created.setShepardId(created.getId());
79 created = fileReferenceDAO.createOrUpdate(created);
80 return created;
81 }
82
83 @Override
84 public boolean deleteReferenceByShepardId(long fileReferenceShepardId, String username) {
85 FileReference fileReference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
86 var user = userDAO.find(username);
87 fileReference.setDeleted(true);
88 fileReference.setUpdatedBy(user);
89 fileReference.setUpdatedAt(dateHelper.getDate());
90 fileReferenceDAO.createOrUpdate(fileReference);
91 return true;
92 }
93
94 public NamedInputStream getPayloadByShepardId(long fileReferenceShepardId, String oid, String username) {
95 FileReference reference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
96
97 long containerId = reference.getFileContainer().getId();
98 String mongoId = reference.getFileContainer().getMongoId();
99 if (!permissionsUtil.isAllowed(containerId, AccessType.Read, username))
100 throw new InvalidAuthException("You are not authorized to access this file");
101 return fileService.getPayload(mongoId, oid);
102 }
103
104 public List<ShepardFile> getFilesByShepardId(long fileReferenceShepardId) {
105 FileReference reference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
106 return reference.getFiles();
107 }
108
109 public List<NamedInputStream> getAllPayloadsByShepardId(long fileReferenceShepardId, String username) {
110 FileReference reference = fileReferenceDAO.findByShepardId(fileReferenceShepardId);
111 if (reference.getFileContainer() == null || reference.getFileContainer().isDeleted())
112 return Collections.emptyList();
113
114 if (!permissionsUtil.isAllowed(reference.getFileContainer().getId(), AccessType.Read, username))
115 throw new InvalidAuthException();
116
117 var files = reference.getFiles();
118 var result = new ArrayList<NamedInputStream>(files.size());
119 for (var file : files) {
120 var nis = fileService.getPayload(reference.getFileContainer().getMongoId(), file.getOid());
121 if (nis != null)
122 result.add(nis);
123 }
124 return result;
125 }
126
127 }