View Javadoc
1   package de.dlr.shepard.data.structureddata.services;
2   
3   import de.dlr.shepard.auth.permission.services.PermissionsService;
4   import de.dlr.shepard.auth.users.entities.User;
5   import de.dlr.shepard.auth.users.services.UserService;
6   import de.dlr.shepard.common.exceptions.InvalidPathException;
7   import de.dlr.shepard.common.exceptions.InvalidRequestException;
8   import de.dlr.shepard.common.util.DateHelper;
9   import de.dlr.shepard.common.util.PermissionType;
10  import de.dlr.shepard.common.util.QueryParamHelper;
11  import de.dlr.shepard.data.AbstractContainerService;
12  import de.dlr.shepard.data.structureddata.daos.StructuredDataContainerDAO;
13  import de.dlr.shepard.data.structureddata.entities.StructuredData;
14  import de.dlr.shepard.data.structureddata.entities.StructuredDataContainer;
15  import de.dlr.shepard.data.structureddata.entities.StructuredDataPayload;
16  import de.dlr.shepard.data.structureddata.io.StructuredDataContainerIO;
17  import io.quarkus.logging.Log;
18  import jakarta.enterprise.context.RequestScoped;
19  import jakarta.inject.Inject;
20  import java.util.List;
21  
22  @RequestScoped
23  public class StructuredDataContainerService
24    extends AbstractContainerService<StructuredDataContainer, StructuredDataContainerIO> {
25  
26    @Inject
27    StructuredDataContainerDAO structuredDataContainerDAO;
28  
29    @Inject
30    StructuredDataService structuredDataService;
31  
32    @Inject
33    PermissionsService permissionsService;
34  
35    @Inject
36    UserService userService;
37  
38    @Inject
39    DateHelper dateHelper;
40  
41    /**
42     * Creates a StructuredDataContainer and stores it in Neo4J
43     *
44     * @param structuredDataContainerIO to be stored
45     * @param username                  of the related user
46     * @return the created StructuredDataContainer
47     */
48    @Override
49    public StructuredDataContainer createContainer(StructuredDataContainerIO structuredDataContainerIO) {
50      User user = userService.getCurrentUser();
51      String mongoId = structuredDataService.createStructuredDataContainer();
52  
53      var toCreate = new StructuredDataContainer();
54      toCreate.setCreatedAt(dateHelper.getDate());
55      toCreate.setCreatedBy(user);
56      toCreate.setMongoId(mongoId);
57      toCreate.setName(structuredDataContainerIO.getName());
58  
59      var created = structuredDataContainerDAO.createOrUpdate(toCreate);
60      permissionsService.createPermissions(created, user, PermissionType.Private);
61      return created;
62    }
63  
64    /**
65     * Searches the StructuredDataContainer in Neo4j
66     *
67     * @param id identifies the searched StructuredDataContainer
68     * @return the StructuredDataContainer with matching id or null
69     */
70    @Override
71    public StructuredDataContainer getContainer(long id) {
72      StructuredDataContainer structuredDataContainer = structuredDataContainerDAO.findByNeo4jId(id);
73      if (structuredDataContainer == null || structuredDataContainer.isDeleted()) {
74        String errorMsg = String.format("ID ERROR - Structured Data Container with id %s is null or deleted", id);
75        Log.error(errorMsg);
76        throw new InvalidPathException(errorMsg);
77      }
78      assertIsAllowedToReadContainer(id);
79      return structuredDataContainer;
80    }
81  
82    /**
83     * Searches the database for all StructuredDataContainers
84     *
85     * @param params   QueryParamsHelper
86     * @param username the name of the user
87     * @return a list of StructuredDataContainers
88     */
89    @Override
90    public List<StructuredDataContainer> getAllContainers(QueryParamHelper params) {
91      User user = userService.getCurrentUser();
92      var containers = structuredDataContainerDAO.findAllStructuredDataContainers(params, user.getUsername());
93      return containers;
94    }
95  
96    /**
97     * Deletes a StructuredDataContainer in Neo4j
98     *
99     * @param structuredDataId identifies the StructuredDataContainer
100    * @param username         identifies the deleting user
101    * @return a boolean to determine if StructuredDataContainer was successfully
102    *         deleted
103    * @throws InvalidRequestException If StructuredDataContainer could not be deleted
104    */
105   @Override
106   public void deleteContainer(long structuredDataId) {
107     User user = userService.getCurrentUser();
108     StructuredDataContainer structuredDataContainer = getContainer(structuredDataId);
109     assertIsAllowedToDeleteContainer(structuredDataId);
110 
111     String mongoId = structuredDataContainer.getMongoId();
112     structuredDataContainer.setDeleted(true);
113     structuredDataContainer.setUpdatedAt(dateHelper.getDate());
114     structuredDataContainer.setUpdatedBy(user);
115     structuredDataContainerDAO.createOrUpdate(structuredDataContainer);
116 
117     structuredDataService.deleteStructuredDataContainer(mongoId);
118   }
119 
120   /**
121    * Upload structured data
122    *
123    * @param structuredDataContainerID identifies the container
124    * @param payload                   the payload to upload
125    * @return StructuredData with the new oid
126    */
127   public StructuredData createStructuredData(long structuredDataContainerID, StructuredDataPayload payload) {
128     StructuredDataContainer structuredDataContainer = getContainer(structuredDataContainerID);
129     assertIsAllowedToEditContainer(structuredDataContainerID);
130 
131     StructuredData result = structuredDataService.createStructuredData(structuredDataContainer.getMongoId(), payload);
132 
133     structuredDataContainer.addStructuredData(result);
134     structuredDataContainerDAO.createOrUpdate(structuredDataContainer);
135     return result;
136   }
137 
138   /**
139    * Get uploaded structured data
140    *
141    * @param structuredDataContainerID identifies the container
142    * @param oid                       identifies the structured data within the
143    *                                  container
144    * @return StructuredDataPayload
145    */
146   public StructuredDataPayload getStructuredData(long structuredDataContainerID, String oid) {
147     StructuredDataContainer structuredDataContainer = getContainer(structuredDataContainerID);
148 
149     return structuredDataService.getPayload(structuredDataContainer.getMongoId(), oid);
150   }
151 
152   /**
153    * Delete one single structured data object
154    *
155    * @param structuredDataContainerID identifies the container
156    * @param oid                       identifies the structured data within the
157    *                                  container
158    */
159   public void deleteStructuredData(long structuredDataContainerID, String oid) {
160     StructuredDataContainer structuredDataContainer = getContainer(structuredDataContainerID);
161     assertIsAllowedToEditContainer(structuredDataContainerID);
162 
163     structuredDataService.deletePayload(structuredDataContainer.getMongoId(), oid);
164 
165     List<StructuredData> newStructuredDatas = structuredDataContainer
166       .getStructuredDatas()
167       .stream()
168       .filter(f -> !f.getOid().equals(oid))
169       .toList();
170     structuredDataContainer.setStructuredDatas(newStructuredDatas);
171     structuredDataContainerDAO.createOrUpdate(structuredDataContainer);
172   }
173 }