Skip to content

Commit 430ad5d

Browse files
Add deleteDataStream, updateDataStream
1 parent 8e5d6ae commit 430ad5d

3 files changed

Lines changed: 141 additions & 29 deletions

File tree

CSAPI-lib/DataModels/DataStreamBuilder.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,50 @@ namespace ConnectedSystemsAPI {
4848

4949
public:
5050
DataStreamBuilder() = default;
51+
DataStreamBuilder(const DataStream& ds) { withDataStream(ds); }
52+
53+
/// <summary>
54+
/// Initialize the builder with values from an existing DataStream instance.
55+
/// Note: This will perform a deep copy of all fields; use before modifying any fields or they will be overwritten.
56+
/// </summary>
57+
/// <param name="ds">The DataStream instance to copy values from.</param>
58+
/// <returns>The builder instance.</returns>
59+
DataStreamBuilder& withDataStream(const DataStream& ds) {
60+
id = ds.getId();
61+
name = ds.getName();
62+
description = ds.getDescription();
63+
validTime = ds.getValidTime();
64+
formats = ds.getFormats();
65+
systemLink = ds.getSystemLink();
66+
outputName = ds.getOutputName();
67+
procedureLink = ds.getProcedureLink();
68+
deploymentLink = ds.getDeploymentLink();
69+
featureOfInterestLink = ds.getFeatureOfInterestLink();
70+
samplingFeatureLink = ds.getSamplingFeatureLink();
71+
observedProperties = ds.getObservedProperties();
72+
phenomenonTime = ds.getPhenomenonTime();
73+
phenomenonTimeInterval = ds.getPhenomenonTimeInterval();
74+
resultTime = ds.getResultTime();
75+
resultTimeInterval = ds.getResultTimeInterval();
76+
dataStreamType = ds.getDataStreamType();
77+
resultType = ds.getResultType();
78+
live = ds.isLive();
79+
links = ds.getLinks();
80+
81+
// ObservationSchema is non-copyable; clone via JSON round-trip (to_json/from_json)
82+
if (ds.getSchema()) {
83+
nlohmann::ordered_json j;
84+
to_json(j, *ds.getSchema());
85+
auto copy = std::make_unique<ObservationSchema>();
86+
from_json(j, *copy);
87+
schema = std::move(copy);
88+
}
89+
else {
90+
schema.reset();
91+
}
92+
93+
return *this;
94+
}
5195

5296
DataStreamBuilder& withId(const std::string& v) { id = v; return *this; }
5397
DataStreamBuilder& withName(const std::string& v) { name = v; return *this; }

CSAPI-lib/DataStreamsAPI.h

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,5 +126,62 @@ namespace ConnectedSystemsAPI {
126126
.execute<void>();
127127
return response;
128128
}
129+
130+
/// <summary>
131+
/// Update an existing data stream by its ID.
132+
/// Note: Data streams with observations cannot be updated.
133+
/// </summary>
134+
/// <param name="dataStreamId">The local identifier of the data stream to update.</param>
135+
/// <param name="dataStream">The updated data stream.</param>
136+
/// <returns>A response object indicating success or failure.</returns>
137+
APIResponse<void> updateDataStream(const std::string& dataStreamId, const DataModels::DataStream& dataStream) {
138+
nlohmann::ordered_json j;
139+
ConnectedSystemsAPI::DataModels::to_json(j, dataStream);
140+
141+
auto response = APIRequest::Builder()
142+
.setApiRoot(apiRoot)
143+
.setMethod("PUT")
144+
.setAuthHeader(authHeader)
145+
.addHeader("Content-Type", "application/json")
146+
.setResourcePath("/datastreams/" + dataStreamId)
147+
.setBody(j.dump())
148+
.build()
149+
.execute<void>();
150+
return response;
151+
}
152+
153+
/// <summary>
154+
/// Delete a data stream by its ID.
155+
/// </summary>
156+
/// <param name="dataStreamId">The local identifier of the data stream to delete.</param>
157+
/// <returns>A response object indicating success or failure.</returns>
158+
APIResponse<void> deleteDataStream(const std::string& dataStreamId) {
159+
auto response = APIRequest::Builder()
160+
.setApiRoot(apiRoot)
161+
.setMethod("DELETE")
162+
.setAuthHeader(authHeader)
163+
.setResourcePath("/datastreams/" + dataStreamId)
164+
.build()
165+
.execute<void>();
166+
return response;
167+
}
168+
169+
/// <summary>
170+
/// Delete a data stream by its ID, with an option to delete all associated observations.
171+
/// </summary>
172+
/// <param name="dataStreamId">The local identifier of the data stream to delete.</param>
173+
/// <param name="cascade">If true, all associated observations will also be deleted.</param>
174+
/// <returns>A response object indicating success or failure.</returns>
175+
APIResponse<void> deleteDataStream(const std::string& dataStreamId, bool cascade) {
176+
std::string queryString = cascade ? "?cascade=true" : "";
177+
auto response = APIRequest::Builder()
178+
.setApiRoot(apiRoot)
179+
.setMethod("DELETE")
180+
.setAuthHeader(authHeader)
181+
.setResourcePath("/datastreams/" + dataStreamId + queryString)
182+
.build()
183+
.execute<void>();
184+
return response;
185+
}
129186
};
130187
}

CSAPI-test/CSAPI-test.cpp

Lines changed: 40 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,37 @@ namespace CSAPItest {
9090
}
9191
}
9292

93+
ConnectedSystemsAPI::DataModels::DataStream createDataStream() {
94+
auto booleanField = ConnectedSystemsAPI::DataModels::Component::BooleanBuilder()
95+
.withType("Boolean"s)
96+
.withName("Test Boolean Field"s)
97+
.withDescription("This is a test boolean field"s)
98+
.build();
99+
100+
auto resultSchemaPtr = std::make_unique<ConnectedSystemsAPI::DataModels::Component::DataRecord>(
101+
ConnectedSystemsAPI::DataModels::Component::DataRecordBuilder()
102+
.withType("DataRecord")
103+
.addField(std::make_unique<ConnectedSystemsAPI::DataModels::Component::Boolean>(booleanField))
104+
.build()
105+
);
106+
107+
auto observationSchemaPtr = std::make_unique<ConnectedSystemsAPI::DataModels::ObservationSchema>(
108+
ConnectedSystemsAPI::DataModels::ObservationSchemaBuilder()
109+
.withObservationFormat("application/om+json"s)
110+
.withResultSchema(std::move(resultSchemaPtr))
111+
.build()
112+
);
113+
114+
auto dataStream = ConnectedSystemsAPI::DataModels::DataStreamBuilder()
115+
.withName("Test DataStream 001"s)
116+
.withOutputName("test_output_001"s)
117+
.withDescription("This is a test data stream created by CSAPI-test"s)
118+
.withSchema(std::move(observationSchemaPtr))
119+
.build();
120+
121+
return dataStream;
122+
}
123+
93124
//Debug stuff
94125
template<typename T>
95126
void printResponse(const ConnectedSystemsAPI::APIResponse<T>& response) {
@@ -223,37 +254,17 @@ namespace CSAPItest {
223254
TEST_METHOD(CreateDataStream) {
224255
createTestSystem();
225256
std::string systemId = getTestSystemId();
226-
227-
auto booleanField = ConnectedSystemsAPI::DataModels::Component::BooleanBuilder()
228-
.withType("Boolean"s)
229-
.withName("Test Boolean Field"s)
230-
.withDescription("This is a test boolean field"s)
231-
.build();
232-
233-
auto resultSchemaPtr = std::make_unique<ConnectedSystemsAPI::DataModels::Component::DataRecord>(
234-
ConnectedSystemsAPI::DataModels::Component::DataRecordBuilder()
235-
.withType("DataRecord")
236-
.addField(std::make_unique<ConnectedSystemsAPI::DataModels::Component::Boolean>(booleanField))
237-
.build()
238-
);
239-
240-
auto observationSchemaPtr = std::make_unique<ConnectedSystemsAPI::DataModels::ObservationSchema>(
241-
ConnectedSystemsAPI::DataModels::ObservationSchemaBuilder()
242-
.withObservationFormat("application/om+json"s)
243-
.withResultSchema(std::move(resultSchemaPtr))
244-
.build()
245-
);
246-
247-
auto dataStream = ConnectedSystemsAPI::DataModels::DataStreamBuilder()
248-
.withName("Test DataStream 001"s)
249-
.withOutputName("test_output_001"s)
250-
.withDescription("This is a test data stream created by CSAPI-test"s)
251-
.withSchema(std::move(observationSchemaPtr))
252-
.build();
253-
254-
257+
auto dataStream = createDataStream();
255258
auto response = csapi.getDataStreamsAPI().createDataStream(systemId, dataStream);
256259
Assert::IsTrue(response.isSuccessful());
257260
}
261+
262+
TEST_METHOD(DeleteDataStream) {
263+
createTestSystem();
264+
std::string systemId = getTestSystemId();
265+
auto dataStream = createDataStream();
266+
auto dsId = dataStream.getId().value_or("");
267+
csapi.getDataStreamsAPI().deleteDataStream(dsId, true);
268+
}
258269
};
259270
}

0 commit comments

Comments
 (0)