View Javadoc
1   package de.dlr.shepard.data.timeseries.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.InvalidAuthException;
7   import de.dlr.shepard.common.exceptions.InvalidPathException;
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.timeseries.daos.TimeseriesContainerDAO;
13  import de.dlr.shepard.data.timeseries.io.TimeseriesContainerIO;
14  import de.dlr.shepard.data.timeseries.model.TimeseriesContainer;
15  import io.quarkus.logging.Log;
16  import jakarta.enterprise.context.RequestScoped;
17  import jakarta.inject.Inject;
18  import java.util.List;
19  import java.util.Optional;
20  
21  @RequestScoped
22  public class TimeseriesContainerService extends AbstractContainerService<TimeseriesContainer, TimeseriesContainerIO> {
23  
24    @Inject
25    TimeseriesContainerDAO timeseriesContainerDAO;
26  
27    @Inject
28    UserService userService;
29  
30    @Inject
31    DateHelper dateHelper;
32  
33    @Inject
34    PermissionsService permissionsService;
35  
36    @Inject
37    TimeseriesService timeseriesService;
38  
39    public List<TimeseriesContainer> getContainers() {
40      return timeseriesContainerDAO.findAll().stream().filter(c -> c.isDeleted() == false).toList();
41    }
42  
43    @Override
44    public List<TimeseriesContainer> getAllContainers(QueryParamHelper params) {
45      User user = userService.getCurrentUser();
46      var containers = timeseriesContainerDAO.findAllTimeseriesContainers(params, user.getUsername());
47      return containers;
48    }
49  
50    /**
51     * Get Timeseries Container by Id
52     *
53     * @throws InvalidPathException if container is null or deleted
54     * @throws InvalidAuthException if user has no read permissions on container
55     * @return timeseries container
56     */
57    @Override
58    public TimeseriesContainer getContainer(long timeseriesContainerId) {
59      Optional<TimeseriesContainer> containerOptional = getContainerOptional(timeseriesContainerId);
60      if (containerOptional.isEmpty()) {
61        String errorMsg = String.format(
62          "ID ERROR - Timeseries Container with id %s is null or deleted",
63          timeseriesContainerId
64        );
65        Log.errorf(errorMsg);
66        throw new InvalidPathException(errorMsg);
67      }
68      assertIsAllowedToReadContainer(timeseriesContainerId);
69      return containerOptional.get();
70    }
71  
72    /**
73     * Get Timeseries Container by Id
74     *
75     * This function is introduced to fix the issue occurring in ticket: #581.
76     * TODO: This function should only be used for the timeseries migration, and should be deleted in the future!
77     *
78     * @throws InvalidPathException if container is null or deleted
79     * @throws InvalidAuthException if user has no read permissions on container
80     * @return timeseries container
81     */
82    @Deprecated
83    public TimeseriesContainer getContainerNoChecks(long timeseriesContainerId) {
84      Optional<TimeseriesContainer> containerOptional = getContainerOptional(timeseriesContainerId);
85      if (containerOptional.isEmpty()) {
86        String errorMsg = String.format(
87          "ID ERROR - Timeseries Container with id %s is null or deleted",
88          timeseriesContainerId
89        );
90        Log.errorf(errorMsg);
91        throw new InvalidPathException(errorMsg);
92      }
93      return containerOptional.get();
94    }
95  
96    private Optional<TimeseriesContainer> getContainerOptional(long timeseriesContainerId) {
97      TimeseriesContainer timeseriesContainer = timeseriesContainerDAO.findByNeo4jId(timeseriesContainerId);
98      if (timeseriesContainer == null || timeseriesContainer.isDeleted()) {
99        return Optional.empty();
100     }
101     return Optional.of(timeseriesContainer);
102   }
103 
104   /**
105    * Creates a TimeseriesContainer and stores it in Neo4J
106    *
107    * @param name name of the container
108    * @param username of the related user
109    * @return the created timeseriesContainer
110    */
111   @Override
112   public TimeseriesContainer createContainer(TimeseriesContainerIO timeseriesContainerIO) {
113     User user = userService.getCurrentUser();
114     var toCreate = new TimeseriesContainer();
115     toCreate.setCreatedAt(dateHelper.getDate());
116     toCreate.setCreatedBy(user);
117     toCreate.setDatabase(null); // This is not needed anymore after the migration to TSDB
118     toCreate.setName(timeseriesContainerIO.getName());
119 
120     var created = timeseriesContainerDAO.createOrUpdate(toCreate);
121     permissionsService.createPermissions(created, user, PermissionType.Private);
122     return created;
123   }
124 
125   /**
126    * Deletes a TimeseriesContainer in Neo4j
127    *
128    * @param timeSeriesContainerId identifies the TimeseriesContainer
129    * @param username              of the related user
130    */
131   @Override
132   public void deleteContainer(long timeSeriesContainerId) {
133     User user = userService.getCurrentUser();
134     TimeseriesContainer timeseriesContainer = this.getContainer(timeSeriesContainerId);
135     timeseriesService.deleteTimeseriesByContainerId(timeSeriesContainerId);
136 
137     timeseriesContainer.setDeleted(true);
138     timeseriesContainer.setUpdatedAt(dateHelper.getDate());
139     timeseriesContainer.setUpdatedBy(user);
140     timeseriesContainerDAO.createOrUpdate(timeseriesContainer);
141   }
142 }