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.cache.Cache;
16  import io.quarkus.cache.CacheName;
17  import io.quarkus.cache.CacheResult;
18  import io.quarkus.logging.Log;
19  import jakarta.enterprise.context.RequestScoped;
20  import jakarta.inject.Inject;
21  import java.util.List;
22  import java.util.Optional;
23  
24  @RequestScoped
25  public class TimeseriesContainerService extends AbstractContainerService<TimeseriesContainer, TimeseriesContainerIO> {
26  
27    @Inject
28    TimeseriesContainerDAO timeseriesContainerDAO;
29  
30    @Inject
31    UserService userService;
32  
33    @Inject
34    DateHelper dateHelper;
35  
36    @Inject
37    @CacheName("container-cache")
38    Cache cache;
39  
40    @Inject
41    PermissionsService permissionsService;
42  
43    @Inject
44    TimeseriesService timeseriesService;
45  
46    public List<TimeseriesContainer> getContainers() {
47      return timeseriesContainerDAO.findAll().stream().filter(c -> !c.isDeleted()).toList();
48    }
49  
50    @Override
51    public List<TimeseriesContainer> getAllContainers(QueryParamHelper params) {
52      User user = userService.getCurrentUser();
53      return timeseriesContainerDAO.findAllTimeseriesContainers(params, user.getUsername());
54    }
55  
56    /**
57     * Get Timeseries Container by Id
58     *
59     * @throws InvalidPathException if container is null or deleted
60     * @throws InvalidAuthException if user has no read permissions on container
61     * @return timeseries container
62     */
63    @Override
64    public TimeseriesContainer getContainer(long timeseriesContainerId) {
65      Optional<TimeseriesContainer> containerOptional = getContainerOptional(timeseriesContainerId);
66      if (containerOptional.isEmpty()) {
67        String errorMsg = String.format(
68          "ID ERROR - Timeseries Container with id %s is null or deleted",
69          timeseriesContainerId
70        );
71        Log.errorf(errorMsg);
72        throw new InvalidPathException(errorMsg);
73      }
74      assertIsAllowedToReadContainer(timeseriesContainerId);
75      return containerOptional.get();
76    }
77  
78    @CacheResult(cacheName = "container-cache")
79    Optional<TimeseriesContainer> getContainerOptional(long timeseriesContainerId) {
80      TimeseriesContainer timeseriesContainer = timeseriesContainerDAO.findByNeo4jId(timeseriesContainerId);
81      if (timeseriesContainer == null || timeseriesContainer.isDeleted()) {
82        return Optional.empty();
83      }
84      return Optional.of(timeseriesContainer);
85    }
86  
87    /**
88     * Creates a TimeseriesContainer and stores it in Neo4J
89     *
90     * @param name name of the container
91     * @param username of the related user
92     * @return the created timeseriesContainer
93     */
94    @Override
95    public TimeseriesContainer createContainer(TimeseriesContainerIO timeseriesContainerIO) {
96      User user = userService.getCurrentUser();
97      var toCreate = new TimeseriesContainer();
98      toCreate.setCreatedAt(dateHelper.getDate());
99      toCreate.setCreatedBy(user);
100     toCreate.setName(timeseriesContainerIO.getName());
101 
102     var created = timeseriesContainerDAO.createOrUpdate(toCreate);
103     permissionsService.createPermissions(created, user, PermissionType.Private);
104     return created;
105   }
106 
107   /**
108    * Deletes a TimeseriesContainer in Neo4j
109    *
110    * @param timeSeriesContainerId identifies the TimeseriesContainer
111    * @param username              of the related user
112    */
113   @Override
114   public void deleteContainer(long timeSeriesContainerId) {
115     User user = userService.getCurrentUser();
116     TimeseriesContainer timeseriesContainer = this.getContainer(timeSeriesContainerId);
117     timeseriesService.deleteTimeseriesByContainerId(timeSeriesContainerId);
118 
119     timeseriesContainer.setDeleted(true);
120     timeseriesContainer.setUpdatedAt(dateHelper.getDate());
121     timeseriesContainer.setUpdatedBy(user);
122     timeseriesContainerDAO.createOrUpdate(timeseriesContainer);
123     cache.invalidate(timeSeriesContainerId).await().indefinitely();
124   }
125 }