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 =
68          "ID ERROR - Timeseries Container with id %s is null or deleted".formatted(timeseriesContainerId);
69        Log.errorf(errorMsg);
70        throw new InvalidPathException(errorMsg);
71      }
72      assertIsAllowedToReadContainer(timeseriesContainerId);
73      return containerOptional.get();
74    }
75  
76    @CacheResult(cacheName = "container-cache")
77    Optional<TimeseriesContainer> getContainerOptional(long timeseriesContainerId) {
78      TimeseriesContainer timeseriesContainer = timeseriesContainerDAO.findByNeo4jId(timeseriesContainerId);
79      if (timeseriesContainer == null || timeseriesContainer.isDeleted()) {
80        return Optional.empty();
81      }
82      return Optional.of(timeseriesContainer);
83    }
84  
85    /**
86     * Creates a TimeseriesContainer and stores it in Neo4J
87     *
88     * @param name name of the container
89     * @param username of the related user
90     * @return the created timeseriesContainer
91     */
92    @Override
93    public TimeseriesContainer createContainer(TimeseriesContainerIO timeseriesContainerIO) {
94      User user = userService.getCurrentUser();
95      var toCreate = new TimeseriesContainer();
96      toCreate.setCreatedAt(dateHelper.getDate());
97      toCreate.setCreatedBy(user);
98      toCreate.setName(timeseriesContainerIO.getName());
99  
100     var created = timeseriesContainerDAO.createOrUpdate(toCreate);
101     permissionsService.createPermissions(created, user, PermissionType.Private);
102     return created;
103   }
104 
105   /**
106    * Deletes a TimeseriesContainer in Neo4j
107    *
108    * @param timeSeriesContainerId identifies the TimeseriesContainer
109    * @param username              of the related user
110    */
111   @Override
112   public void deleteContainer(long timeSeriesContainerId) {
113     User user = userService.getCurrentUser();
114     TimeseriesContainer timeseriesContainer = this.getContainer(timeSeriesContainerId);
115     timeseriesService.deleteTimeseriesByContainerId(timeSeriesContainerId);
116 
117     timeseriesContainer.setDeleted(true);
118     timeseriesContainer.setUpdatedAt(dateHelper.getDate());
119     timeseriesContainer.setUpdatedBy(user);
120     timeseriesContainerDAO.createOrUpdate(timeseriesContainer);
121     cache.invalidate(timeSeriesContainerId).await().indefinitely();
122   }
123 }