1 package de.dlr.shepard.neo4Core.services;
2
3 import java.io.IOException;
4 import java.io.InputStream;
5 import java.util.Arrays;
6 import java.util.Collections;
7 import java.util.List;
8 import java.util.Set;
9
10 import de.dlr.shepard.exceptions.InvalidAuthException;
11 import de.dlr.shepard.exceptions.InvalidBodyException;
12 import de.dlr.shepard.influxDB.FillOption;
13 import de.dlr.shepard.influxDB.InfluxUtil;
14 import de.dlr.shepard.influxDB.SingleValuedUnaryFunction;
15 import de.dlr.shepard.influxDB.TimeseriesPayload;
16 import de.dlr.shepard.influxDB.TimeseriesService;
17 import de.dlr.shepard.neo4Core.dao.DataObjectDAO;
18 import de.dlr.shepard.neo4Core.dao.TimeseriesContainerDAO;
19 import de.dlr.shepard.neo4Core.dao.TimeseriesDAO;
20 import de.dlr.shepard.neo4Core.dao.TimeseriesReferenceDAO;
21 import de.dlr.shepard.neo4Core.dao.UserDAO;
22 import de.dlr.shepard.neo4Core.entities.TimeseriesReference;
23 import de.dlr.shepard.neo4Core.io.TimeseriesReferenceIO;
24 import de.dlr.shepard.security.PermissionsUtil;
25 import de.dlr.shepard.util.AccessType;
26 import de.dlr.shepard.util.DateHelper;
27 import lombok.extern.slf4j.Slf4j;
28
29 @Slf4j
30 public class TimeseriesReferenceService implements IReferenceService<TimeseriesReference, TimeseriesReferenceIO> {
31 private TimeseriesReferenceDAO timeseriesReferenceDAO = new TimeseriesReferenceDAO();
32 private TimeseriesService timeseriesService = new TimeseriesService();
33 private DataObjectDAO dataObjectDAO = new DataObjectDAO();
34 private TimeseriesContainerDAO timeseriesContainerDAO = new TimeseriesContainerDAO();
35 private TimeseriesDAO timeseriesDAO = new TimeseriesDAO();
36 private UserDAO userDAO = new UserDAO();
37 private DateHelper dateHelper = new DateHelper();
38 private PermissionsUtil permissionsUtil = new PermissionsUtil();
39
40 @Override
41 public List<TimeseriesReference> getAllReferencesByDataObjectShepardId(long dataObjectShepardId) {
42 var references = timeseriesReferenceDAO.findByDataObjectShepardId(dataObjectShepardId);
43 return references;
44 }
45
46 @Override
47 public TimeseriesReference getReferenceByShepardId(long shepardId) {
48 var reference = timeseriesReferenceDAO.findByShepardId(shepardId);
49 if (reference == null || reference.isDeleted()) {
50 log.error("Timeseries Reference with id {} is null or deleted", shepardId);
51 return null;
52 }
53 return reference;
54 }
55
56 @Override
57 public TimeseriesReference createReferenceByShepardId(long dataObjectShepardId,
58 TimeseriesReferenceIO timeseriesReference, String username) {
59 var user = userDAO.find(username);
60 var dataObject = dataObjectDAO.findLightByShepardId(dataObjectShepardId);
61 var container = timeseriesContainerDAO.findLightByNeo4jId(timeseriesReference.getTimeseriesContainerId());
62 if (container == null || container.isDeleted()) {
63 throw new InvalidBodyException(String.format("The timeseries container with id %d could not be found.",
64 timeseriesReference.getTimeseriesContainerId()));
65 }
66
67 var errors = Arrays.stream(timeseriesReference.getTimeseries()).map(InfluxUtil::sanitize)
68 .filter(e -> !e.isBlank()).toList();
69 if (!errors.isEmpty())
70 throw new InvalidBodyException(
71 "The timeseries list contains illegal characters: " + String.join(", ", errors));
72 var toCreate = new TimeseriesReference();
73 toCreate.setCreatedAt(dateHelper.getDate());
74 toCreate.setCreatedBy(user);
75 toCreate.setDataObject(dataObject);
76 toCreate.setName(timeseriesReference.getName());
77 toCreate.setStart(timeseriesReference.getStart());
78 toCreate.setEnd(timeseriesReference.getEnd());
79 toCreate.setTimeseriesContainer(container);
80
81 for (var ts : timeseriesReference.getTimeseries()) {
82 var found = timeseriesDAO.find(ts.getMeasurement(), ts.getDevice(), ts.getLocation(), ts.getSymbolicName(),
83 ts.getField());
84 if (found != null) {
85 toCreate.addTimeseries(found);
86 } else {
87 toCreate.addTimeseries(ts);
88 }
89 }
90 TimeseriesReference created = timeseriesReferenceDAO.createOrUpdate(toCreate);
91 created.setShepardId(created.getId());
92 created = timeseriesReferenceDAO.createOrUpdate(created);
93 return created;
94 }
95
96 @Override
97 public boolean deleteReferenceByShepardId(long timeseriesShepardId, String username) {
98 var user = userDAO.find(username);
99
100 var old = timeseriesReferenceDAO.findByShepardId(timeseriesShepardId);
101 old.setDeleted(true);
102 old.setUpdatedAt(dateHelper.getDate());
103 old.setUpdatedBy(user);
104
105 timeseriesReferenceDAO.createOrUpdate(old);
106 return true;
107 }
108
109 public List<TimeseriesPayload> getTimeseriesPayloadByShepardId(long timeseriesShepardId,
110 SingleValuedUnaryFunction function, Long groupBy, FillOption fillOption, Set<String> devicesFilterSet,
111 Set<String> locationsFilterSet, Set<String> symbolicNameFilterSet, String username) {
112 var ref = timeseriesReferenceDAO.findByShepardId(timeseriesShepardId);
113 if (ref.getTimeseriesContainer() == null || ref.getTimeseriesContainer().isDeleted())
114 return Collections.emptyList();
115
116 if (!permissionsUtil.isAllowed(ref.getTimeseriesContainer().getId(), AccessType.Read, username))
117 throw new InvalidAuthException("You are not authorized to access this timeseries");
118
119 var database = ref.getTimeseriesContainer().getDatabase();
120 return timeseriesService.getTimeseriesPayloadList(ref.getStart(), ref.getEnd(), database, ref.getTimeseries(),
121 function, groupBy, fillOption, devicesFilterSet, locationsFilterSet, symbolicNameFilterSet);
122 }
123
124 public InputStream exportTimeseriesPayloadByShepardId(long timeseriesShepardId, SingleValuedUnaryFunction function,
125 Long groupBy, FillOption fillOption, Set<String> devicesFilterSet, Set<String> locationsFilterSet,
126 Set<String> symbolicNameFilterSet, String username) throws IOException {
127 var ref = timeseriesReferenceDAO.findByShepardId(timeseriesShepardId);
128 if (ref.getTimeseriesContainer() == null || ref.getTimeseriesContainer().isDeleted())
129 return null;
130
131 if (!permissionsUtil.isAllowed(ref.getTimeseriesContainer().getId(), AccessType.Read, username))
132 throw new InvalidAuthException("You are not authorized to access this timeseries");
133
134 var database = ref.getTimeseriesContainer().getDatabase();
135 return timeseriesService.exportTimeseriesPayload(ref.getStart(), ref.getEnd(), database, ref.getTimeseries(),
136 function, groupBy, fillOption, devicesFilterSet, locationsFilterSet, symbolicNameFilterSet);
137 }
138
139 public InputStream exportTimeseriesPayloadByShepardId(long timeseriesId, String username) throws IOException {
140 return exportTimeseriesPayloadByShepardId(timeseriesId, null, null, null, Collections.emptySet(),
141 Collections.emptySet(), Collections.emptySet(), username);
142 }
143
144 }