Skip to content

Commit 5930e24

Browse files
authored
Merge pull request #1 from MichaelElmore1/dev
Support for control streams
2 parents 4074911 + 34b5b81 commit 5930e24

15 files changed

Lines changed: 746 additions & 29 deletions

CSAPI-test/IntegrationTests/ObservationsTest.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ namespace CSAPItest {
3737
}
3838

3939
ConnectedSystemsAPI::DataModels::Observation getTestObservation(const std::string& dataStreamId) {
40-
auto observationsResponse = testHelper.csapi.getObservationsAPI().getObservationsOfDataStream(dataStreamId);
40+
auto observationsResponse = testHelper.csapi.getObservationsAPI().fetchObservationsOfDataStream(dataStreamId);
4141
Assert::IsTrue(observationsResponse.isSuccessful());
4242
Assert::IsFalse(observationsResponse.getItems().empty());
4343
return observationsResponse.getItems().at(0);
@@ -52,14 +52,14 @@ namespace CSAPItest {
5252
}
5353

5454
TEST_METHOD(GetObservations) {
55-
auto response = testHelper.csapi.getObservationsAPI().getObservations();
55+
auto response = testHelper.csapi.getObservationsAPI().fetchObservations();
5656
Assert::IsTrue(response.isSuccessful());
5757
}
5858

5959
TEST_METHOD(GetObservationsOfDataStream) {
6060
auto dataStreamsResponse = testHelper.csapi.getDataStreamsAPI().getDataStreams();
6161
std::string dataStreamId = dataStreamsResponse.getItems().at(0).getId().value_or("");
62-
auto response = testHelper.csapi.getObservationsAPI().getObservationsOfDataStream(dataStreamId);
62+
auto response = testHelper.csapi.getObservationsAPI().fetchObservationsOfDataStream(dataStreamId);
6363
Assert::IsTrue(response.isSuccessful());
6464
}
6565

@@ -112,7 +112,7 @@ namespace CSAPItest {
112112
Assert::IsTrue(observationCreateResponse.isSuccessful());
113113

114114
// Get the observations to verify
115-
auto observationsResponse = testHelper.csapi.getObservationsAPI().getObservationsOfDataStream(dataStreamId);
115+
auto observationsResponse = testHelper.csapi.getObservationsAPI().fetchObservationsOfDataStream(dataStreamId);
116116
Assert::IsTrue(observationsResponse.isSuccessful());
117117
Assert::IsFalse(observationsResponse.getItems().empty());
118118
Assert::AreEqual(dataStreamId, observationsResponse.getItems().at(0).getDataStreamId().value_or(""));
@@ -130,7 +130,7 @@ namespace CSAPItest {
130130
auto observation = pushTestObservation(dataStreamId, dataBlock);
131131
auto observationId = observation.getId().value_or("");
132132

133-
auto getResponse = testHelper.csapi.getObservationsAPI().getObservationById(observationId);
133+
auto getResponse = testHelper.csapi.getObservationsAPI().fetchObservationById(observationId);
134134
Assert::IsTrue(getResponse.isSuccessful());
135135
Assert::AreEqual(observationId, getResponse.getItems().at(0).getId().value_or(""));
136136
}
@@ -145,7 +145,7 @@ namespace CSAPItest {
145145
auto deleteResponse = testHelper.csapi.getObservationsAPI().deleteObservation(observationId);
146146
Assert::IsTrue(deleteResponse.isSuccessful());
147147

148-
auto getResponse = testHelper.csapi.getObservationsAPI().getObservationById(observationId);
148+
auto getResponse = testHelper.csapi.getObservationsAPI().fetchObservationById(observationId);
149149
Assert::IsFalse(getResponse.isSuccessful());
150150
}
151151
};

CSAPI/CSAPI.vcxproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,8 +138,10 @@
138138
<ItemGroup>
139139
<ClInclude Include="APIRequest.h" />
140140
<ClInclude Include="APIResponse.h" />
141+
<ClInclude Include="CommandsAPI.h" />
141142
<ClInclude Include="ConnectedSystemsAPI.h" />
142143
<ClInclude Include="ControlStreamsAPI.h" />
144+
<ClInclude Include="DataModels\Command.h" />
143145
<ClInclude Include="DataModels\CommandSchema.h" />
144146
<ClInclude Include="DataModels\CommandSchemaBuilder.h" />
145147
<ClInclude Include="DataModels\Component\Boolean.h" />
@@ -190,6 +192,10 @@
190192
<ClInclude Include="DataStreamsAPI.h" />
191193
<ClInclude Include="framework.h" />
192194
<ClInclude Include="ObservationsAPI.h" />
195+
<ClInclude Include="Query\CommandsOfControlStreamQuery.h" />
196+
<ClInclude Include="Query\CommandsQuery.h" />
197+
<ClInclude Include="Query\ControlStreamsOfSystemQuery.h" />
198+
<ClInclude Include="Query\ControlStreamsQuery.h" />
193199
<ClInclude Include="Query\DataStreamsOfSystemQuery.h" />
194200
<ClInclude Include="Query\DataStreamsQuery.h" />
195201
<ClInclude Include="Query\ObservationsOfDataStreamQuery.h" />

CSAPI/CSAPI.vcxproj.filters

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,24 @@
225225
<ClInclude Include="Util\Utilities.h">
226226
<Filter>Header Files\Util</Filter>
227227
</ClInclude>
228+
<ClInclude Include="DataModels\Command.h">
229+
<Filter>Header Files\DataModels</Filter>
230+
</ClInclude>
231+
<ClInclude Include="Query\ControlStreamsOfSystemQuery.h">
232+
<Filter>Header Files\Query</Filter>
233+
</ClInclude>
234+
<ClInclude Include="Query\ControlStreamsQuery.h">
235+
<Filter>Header Files\Query</Filter>
236+
</ClInclude>
237+
<ClInclude Include="CommandsAPI.h">
238+
<Filter>Header Files</Filter>
239+
</ClInclude>
240+
<ClInclude Include="Query\CommandsQuery.h">
241+
<Filter>Header Files\Query</Filter>
242+
</ClInclude>
243+
<ClInclude Include="Query\CommandsOfControlStreamQuery.h">
244+
<Filter>Header Files\Query</Filter>
245+
</ClInclude>
228246
</ItemGroup>
229247
<ItemGroup>
230248
<None Include="vcpkg.json" />

CSAPI/CommandsAPI.h

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
#pragma once
2+
3+
#include <string>
4+
5+
#include "APIRequest.h"
6+
#include "APIResponse.h"
7+
#include "DataModels/Command.h"
8+
#include "Query/CommandsQuery.h"
9+
#include "Query/CommandsOfControlStreamQuery.h"
10+
11+
namespace ConnectedSystemsAPI {
12+
/// <summary>
13+
/// API for interacting with commands in the Connected Systems API.
14+
/// </summary>
15+
class CommandsAPI {
16+
private:
17+
std::string apiRoot;
18+
std::string authHeader;
19+
20+
public:
21+
CommandsAPI() = default;
22+
CommandsAPI(const std::string& apiRoot, const std::string& authHeader)
23+
: apiRoot(apiRoot), authHeader(authHeader) {
24+
}
25+
26+
/// <summary>
27+
/// List or search all commands available from this server endpoint.
28+
/// </summary>
29+
/// <param name="query">The query string parameters.</param>
30+
/// <returns>A response object containing a list of commands.</returns>
31+
APIResponse<DataModels::Command> fetchCommands(const Query::CommandsQuery& query) const {
32+
return fetchCommands(query.toString());
33+
}
34+
35+
/// <summary>
36+
/// List or search all commands available from this server endpoint.
37+
/// </summary>
38+
/// <param name="queryString">The query string.</param>
39+
/// <returns>A response object containing a list of commands.</returns>
40+
APIResponse<DataModels::Command> fetchCommands(const std::string& queryString = "") const {
41+
auto response = APIRequest::Builder()
42+
.setApiRoot(apiRoot)
43+
.setMethod("GET")
44+
.setAuthHeader(authHeader)
45+
.setResourcePath("commands")
46+
.setQueryString(queryString)
47+
.build()
48+
.execute<DataModels::Command>();
49+
return response;
50+
}
51+
52+
/// <summary>
53+
/// List or search all commands available from a control stream.
54+
/// </summary>
55+
/// <param name="controlStreamId">The local identifier of the control stream.</param>
56+
/// <param name="query">The query string parameters.</param>
57+
/// <returns>A response object containing a list of commands.</returns>
58+
APIResponse<DataModels::Command> fetchCommandsOfControlStream(const std::string& controlStreamId, const Query::CommandsOfControlStreamQuery& query) const {
59+
return fetchCommandsOfControlStream(controlStreamId, query.toString());
60+
}
61+
62+
/// <summary>
63+
/// List or search all commands available from a control stream.
64+
/// </summary>
65+
/// <param name="controlStreamId">The local identifier of the control stream.</param>
66+
/// <param name="queryString">The query string.</param>
67+
/// <returns>A response object containing a list of commands.</returns>
68+
APIResponse<DataModels::Command> fetchCommandsOfControlStream(const std::string& controlStreamId, const std::string& queryString = "") const {
69+
if (controlStreamId.empty())
70+
return APIResponse<DataModels::Command>(400, "Invalid controlStreamId", "", {});
71+
72+
auto response = APIRequest::Builder()
73+
.setApiRoot(apiRoot)
74+
.setMethod("GET")
75+
.setAuthHeader(authHeader)
76+
.setResourcePath("controlstreams")
77+
.setResourceId(controlStreamId)
78+
.setSubResourcePath("commands")
79+
.setQueryString(queryString)
80+
.build()
81+
.execute<DataModels::Command>();
82+
return response;
83+
}
84+
85+
/// <summary>
86+
/// Get a specific command by its ID.
87+
/// </summary>
88+
/// <param name="commandId">The ID of the command to retrieve.</param>
89+
/// <returns>A response object containing the requested command.</returns>
90+
APIResponse<DataModels::Command> fetchCommandById(const std::string& commandId) const {
91+
if (commandId.empty())
92+
return APIResponse<DataModels::Command>(400, "Invalid commandId", "", {});
93+
94+
auto response = APIRequest::Builder()
95+
.setApiRoot(apiRoot)
96+
.setMethod("GET")
97+
.setAuthHeader(authHeader)
98+
.setResourcePath("commands")
99+
.setResourceId(commandId)
100+
.build()
101+
.execute<DataModels::Command>();
102+
return response;
103+
}
104+
105+
/// <summary>
106+
/// Add a new command to an existing control stream.
107+
/// </summary>
108+
/// <param name="controlStreamId">The local identifier of the control stream.</param>
109+
/// <param name="command">The command to create.</param>
110+
/// <returns>A response object indicating success or failure.</returns>
111+
APIResponse<void> createCommand(const std::string& controlStreamId, const DataModels::Command& command) const {
112+
if (controlStreamId.empty())
113+
return APIResponse<void>(400, "Invalid controlStreamId", "", {});
114+
115+
auto response = APIRequest::Builder()
116+
.setApiRoot(apiRoot)
117+
.setMethod("POST")
118+
.setAuthHeader(authHeader)
119+
.addHeader("Content-Type", "application/json")
120+
.setResourcePath("controlstreams")
121+
.setResourceId(controlStreamId)
122+
.setSubResourcePath("commands")
123+
.setBody(command.toJson().dump())
124+
.build()
125+
.execute<void>();
126+
return response;
127+
}
128+
129+
/// <summary>
130+
/// Update an existing command.
131+
/// </summary>
132+
/// <param name="commandId">The ID of the command to update.</param>
133+
/// <param name="command">The updated command.</param>
134+
/// <returns>A response object indicating success or failure.</returns>
135+
APIResponse<void> updateCommand(const std::string& commandId, const DataModels::Command& command) const {
136+
if (commandId.empty())
137+
return APIResponse<void>(400, "Invalid commandId", "", {});
138+
139+
auto response = APIRequest::Builder()
140+
.setApiRoot(apiRoot)
141+
.setMethod("PUT")
142+
.setAuthHeader(authHeader)
143+
.addHeader("Content-Type", "application/json")
144+
.setResourcePath("commands")
145+
.setResourceId(commandId)
146+
.setBody(command.toJson().dump())
147+
.build()
148+
.execute<void>();
149+
return response;
150+
}
151+
152+
/// <summary>
153+
/// Delete a command by its ID.
154+
/// </summary>
155+
/// <param name="commandId">The ID of the command to delete.</param>
156+
/// <returns>A response object indicating success or failure.</returns>
157+
APIResponse<void> deleteCommand(const std::string& commandId) const {
158+
if (commandId.empty())
159+
return APIResponse<void>(400, "Invalid commandId", "", {});
160+
161+
auto response = APIRequest::Builder()
162+
.setApiRoot(apiRoot)
163+
.setMethod("DELETE")
164+
.setAuthHeader(authHeader)
165+
.setResourcePath("commands")
166+
.setResourceId(commandId)
167+
.build()
168+
.execute<void>();
169+
return response;
170+
}
171+
};
172+
}

CSAPI/ConnectedSystemsAPI.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
#include <string>
44

55
#include "DataStreamsAPI.h"
6+
#include "CommandsAPI.h"
67
#include "ObservationsAPI.h"
78
#include "SystemsAPI.h"
89
#include "ControlStreamsAPI.h"
910
#include "Util/Utilities.h"
11+
#include "RegistryInit.h" // Ensure registry is initialized before any API calls. Do not remove this include.
1012

1113
namespace ConnectedSystemsAPI {
1214
/// <summary>
@@ -20,6 +22,7 @@ namespace ConnectedSystemsAPI {
2022
DataStreamsAPI dataStreamsAPI;
2123
ObservationsAPI observationsAPI;
2224
ControlStreamsAPI controlStreamsAPI;
25+
CommandsAPI commandsAPI;
2326

2427
public:
2528
/// <summary>
@@ -34,7 +37,8 @@ namespace ConnectedSystemsAPI {
3437
systemsAPI(this->apiRoot, authHeader),
3538
dataStreamsAPI(this->apiRoot, authHeader),
3639
observationsAPI(this->apiRoot, authHeader),
37-
controlStreamsAPI(this->apiRoot, authHeader) {
40+
controlStreamsAPI(this->apiRoot, authHeader),
41+
commandsAPI(this->apiRoot, authHeader) {
3842
}
3943

4044
/// <summary>
@@ -64,5 +68,6 @@ namespace ConnectedSystemsAPI {
6468
DataStreamsAPI& getDataStreamsAPI() { return dataStreamsAPI; }
6569
ObservationsAPI& getObservationsAPI() { return observationsAPI; }
6670
ControlStreamsAPI& getControlStreamsAPI() { return controlStreamsAPI; }
71+
CommandsAPI& getCommandsAPI() { return commandsAPI; }
6772
};
6873
}

CSAPI/ControlStreamsAPI.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include "APIResponse.h"
99
#include "DataModels/ControlStream.h"
1010
#include "DataModels/CommandSchema.h"
11+
#include "Query/ControlStreamsOfSystemQuery.h"
12+
#include "Query/ControlStreamsQuery.h"
1113

1214
namespace ConnectedSystemsAPI {
1315
/// <summary>
@@ -41,6 +43,15 @@ namespace ConnectedSystemsAPI {
4143
return response;
4244
}
4345

46+
/// <summary>
47+
/// List all control streams available from this server endpoint.
48+
/// </summary>
49+
/// <param name="query">The query.</param>
50+
/// <returns>A response object containing a list of control streams.</returns>
51+
APIResponse<DataModels::ControlStream> getControlStreams(const Query::ControlStreamsQuery& query) const {
52+
return getControlStreams(query.toString());
53+
}
54+
4455
/// <summary>
4556
/// List all control streams available from the parent system.
4657
/// </summary>
@@ -64,6 +75,16 @@ namespace ConnectedSystemsAPI {
6475
return response;
6576
}
6677

78+
/// <summary>
79+
/// List all control streams available from the parent system.
80+
/// </summary>
81+
/// <param name="systemId">The local identifier of a system.</param>
82+
/// <param name="query">The query.</param>
83+
/// <returns>A response object containing a list of control streams.</returns>
84+
APIResponse<DataModels::ControlStream> getControlStreamsOfSystem(const std::string& systemId, const Query::ControlStreamsOfSystemQuery& query) const {
85+
return getControlStreamsOfSystem(systemId, query.toString());
86+
}
87+
6788
/// <summary>
6889
/// Get a specific control stream by its ID.
6990
/// </summary>

0 commit comments

Comments
 (0)