@twin.org/auditable-item-stream-service 0.9.1-next.1 → 0.9.1-next.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,11 @@
1
1
  // Copyright 2024 IOTA Stiftung.
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
- import { HttpContextIdKeys, HttpParameterHelper, HttpUrlHelper } from "@twin.org/api-models";
3
+ import { HttpContextIdKeys, HttpHeaderHelper, HttpParameterHelper, HttpUrlHelper } from "@twin.org/api-models";
4
4
  import { AuditableItemStreamContexts, AuditableItemStreamTypes } from "@twin.org/auditable-item-stream-models";
5
5
  import { ContextIdStore } from "@twin.org/context";
6
- import { Coerce, ComponentFactory, Guards, Is } from "@twin.org/core";
6
+ import { Coerce, ComponentFactory, Guards } from "@twin.org/core";
7
7
  import { SchemaOrgContexts, SchemaOrgTypes } from "@twin.org/standards-schema-org";
8
- import { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from "@twin.org/web";
8
+ import { HeaderTypes, HttpStatusCode, MimeTypes } from "@twin.org/web";
9
9
  /**
10
10
  * The source identifier used when communicating errors from these routes.
11
11
  */
@@ -32,7 +32,7 @@ export function generateRestRoutesAuditableItemStream(baseRouteName, componentNa
32
32
  tag: tagsAuditableItemStream[0].name,
33
33
  method: "POST",
34
34
  path: `${baseRouteName}/`,
35
- handler: async (httpRequestContext, request) => auditableItemStreamCreate(httpRequestContext, componentName, request),
35
+ handler: async (httpRequestContext, request) => auditableItemStreamCreate(httpRequestContext, componentName, request, baseRouteName),
36
36
  requestType: {
37
37
  type: "IAuditableItemStreamCreateRequest",
38
38
  examples: [
@@ -437,7 +437,7 @@ export function generateRestRoutesAuditableItemStream(baseRouteName, componentNa
437
437
  tag: tagsAuditableItemStream[0].name,
438
438
  method: "POST",
439
439
  path: `${baseRouteName}/:id/entries`,
440
- handler: async (httpRequestContext, request) => auditableItemStreamCreateEntry(httpRequestContext, componentName, request),
440
+ handler: async (httpRequestContext, request) => auditableItemStreamCreateEntry(httpRequestContext, componentName, request, baseRouteName),
441
441
  requestType: {
442
442
  type: "IAuditableItemStreamCreateEntryRequest",
443
443
  examples: [
@@ -1029,18 +1029,21 @@ export function generateRestRoutesAuditableItemStream(baseRouteName, componentNa
1029
1029
  * @param httpRequestContext The request context for the API.
1030
1030
  * @param componentName The name of the component to use in the routes.
1031
1031
  * @param request The request.
1032
+ * @param baseRouteName The base route name for the API.
1032
1033
  * @returns The response object with additional http response properties.
1033
1034
  */
1034
- export async function auditableItemStreamCreate(httpRequestContext, componentName, request) {
1035
+ export async function auditableItemStreamCreate(httpRequestContext, componentName, request, baseRouteName) {
1035
1036
  Guards.object(ROUTES_SOURCE, "request", request);
1036
1037
  Guards.object(ROUTES_SOURCE, "request.body", request.body);
1037
1038
  const component = ComponentFactory.get(componentName);
1038
1039
  const id = await component.create(request.body);
1040
+ const contextIds = await ContextIdStore.getContextIds();
1041
+ const publicOrigin = contextIds?.[HttpContextIdKeys.PublicOrigin];
1042
+ const headers = {};
1043
+ HttpHeaderHelper.buildId(headers, id, HttpUrlHelper.combineOriginPath(publicOrigin, `${baseRouteName}/:id`));
1039
1044
  return {
1040
1045
  statusCode: HttpStatusCode.created,
1041
- headers: {
1042
- [HeaderTypes.Location]: id
1043
- }
1046
+ headers
1044
1047
  };
1045
1048
  }
1046
1049
  /**
@@ -1061,13 +1064,10 @@ export async function auditableItemStreamGet(httpRequestContext, componentName,
1061
1064
  verifyStream: Coerce.boolean(request.query?.verifyStream),
1062
1065
  verifyEntries: Coerce.boolean(request.query?.verifyEntries)
1063
1066
  });
1064
- const headers = {
1065
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
1066
- };
1067
- if (Is.stringValue(result.cursor)) {
1068
- const contextIds = await ContextIdStore.getContextIds();
1069
- headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(HttpUrlHelper.replaceOrigin(httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin]), { cursor: result.cursor }, "next");
1070
- }
1067
+ const headers = {};
1068
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1069
+ const contextIds = await ContextIdStore.getContextIds();
1070
+ HttpHeaderHelper.buildCursor(headers, httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin], result.cursor);
1071
1071
  return {
1072
1072
  headers,
1073
1073
  body: result.stream
@@ -1140,13 +1140,10 @@ export async function auditableItemStreamList(httpRequestContext, componentName,
1140
1140
  Guards.object(ROUTES_SOURCE, "request.query", request.query);
1141
1141
  const component = ComponentFactory.get(componentName);
1142
1142
  const result = await component.query(HttpParameterHelper.objectFromString(request.query?.conditions), request.query?.orderBy, request.query?.orderByDirection, HttpParameterHelper.arrayFromString(request.query?.properties), request.query?.cursor, Coerce.integer(request.query?.limit));
1143
- const headers = {
1144
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
1145
- };
1146
- if (Is.stringValue(result.cursor)) {
1147
- const contextIds = await ContextIdStore.getContextIds();
1148
- headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(HttpUrlHelper.replaceOrigin(httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin]), { cursor: result.cursor }, "next");
1149
- }
1143
+ const headers = {};
1144
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1145
+ const contextIds = await ContextIdStore.getContextIds();
1146
+ HttpHeaderHelper.buildCursor(headers, httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin], result.cursor);
1150
1147
  return {
1151
1148
  headers,
1152
1149
  body: result.entries
@@ -1157,9 +1154,10 @@ export async function auditableItemStreamList(httpRequestContext, componentName,
1157
1154
  * @param httpRequestContext The request context for the API.
1158
1155
  * @param componentName The name of the component to use in the routes.
1159
1156
  * @param request The request.
1157
+ * @param baseRouteName The base route name for the API.
1160
1158
  * @returns The response object with additional http response properties.
1161
1159
  */
1162
- export async function auditableItemStreamCreateEntry(httpRequestContext, componentName, request) {
1160
+ export async function auditableItemStreamCreateEntry(httpRequestContext, componentName, request, baseRouteName) {
1163
1161
  Guards.object(ROUTES_SOURCE, "request", request);
1164
1162
  Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
1165
1163
  Guards.object(ROUTES_SOURCE, "request.body", request.body);
@@ -1167,11 +1165,13 @@ export async function auditableItemStreamCreateEntry(httpRequestContext, compone
1167
1165
  Guards.objectValue(ROUTES_SOURCE, "request.body.entryObject", request.body.entryObject);
1168
1166
  const component = ComponentFactory.get(componentName);
1169
1167
  const id = await component.createEntry(request.pathParams.id, request.body.entryObject);
1168
+ const contextIds = await ContextIdStore.getContextIds();
1169
+ const publicOrigin = contextIds?.[HttpContextIdKeys.PublicOrigin];
1170
+ const headers = {};
1171
+ HttpHeaderHelper.buildId(headers, id, HttpUrlHelper.combineOriginPath(publicOrigin, `${baseRouteName}/:streamId/entries/:id`));
1170
1172
  return {
1171
1173
  statusCode: HttpStatusCode.created,
1172
- headers: {
1173
- [HeaderTypes.Location]: id
1174
- }
1174
+ headers
1175
1175
  };
1176
1176
  }
1177
1177
  /**
@@ -1228,12 +1228,10 @@ export async function auditableItemStreamGetEntry(httpRequestContext, componentN
1228
1228
  const result = await component.getEntry(request.pathParams.id, request.pathParams.entryId, {
1229
1229
  verifyEntry: Coerce.boolean(request.query?.verifyEntry)
1230
1230
  });
1231
+ const headers = {};
1232
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1231
1233
  return {
1232
- headers: {
1233
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd
1234
- ? MimeTypes.JsonLd
1235
- : MimeTypes.Json
1236
- },
1234
+ headers,
1237
1235
  body: result
1238
1236
  };
1239
1237
  }
@@ -1251,12 +1249,10 @@ export async function auditableItemStreamGetEntryObject(httpRequestContext, comp
1251
1249
  Guards.stringValue(ROUTES_SOURCE, "request.pathParams.entryId", request.pathParams.entryId);
1252
1250
  const component = ComponentFactory.get(componentName);
1253
1251
  const result = await component.getEntryObject(request.pathParams.id, request.pathParams.entryId);
1252
+ const headers = {};
1253
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1254
1254
  return {
1255
- headers: {
1256
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd
1257
- ? MimeTypes.JsonLd
1258
- : MimeTypes.Json
1259
- },
1255
+ headers,
1260
1256
  body: result
1261
1257
  };
1262
1258
  }
@@ -1280,13 +1276,10 @@ export async function auditableItemStreamListEntries(httpRequestContext, compone
1280
1276
  limit: Coerce.integer(request.query?.limit),
1281
1277
  cursor: request.query?.cursor
1282
1278
  });
1283
- const headers = {
1284
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
1285
- };
1286
- if (Is.stringValue(result.cursor)) {
1287
- const contextIds = await ContextIdStore.getContextIds();
1288
- headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(HttpUrlHelper.replaceOrigin(httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin]), { cursor: result.cursor }, "next");
1289
- }
1279
+ const headers = {};
1280
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1281
+ const contextIds = await ContextIdStore.getContextIds();
1282
+ HttpHeaderHelper.buildCursor(headers, httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin], result.cursor);
1290
1283
  return {
1291
1284
  headers,
1292
1285
  body: result.entries
@@ -1310,13 +1303,10 @@ export async function auditableItemStreamListEntriesNoStream(httpRequestContext,
1310
1303
  limit: Coerce.integer(request.query?.limit),
1311
1304
  cursor: request.query?.cursor
1312
1305
  });
1313
- const headers = {
1314
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
1315
- };
1316
- if (Is.stringValue(result.cursor)) {
1317
- const contextIds = await ContextIdStore.getContextIds();
1318
- headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(HttpUrlHelper.replaceOrigin(httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin]), { cursor: result.cursor }, "next");
1319
- }
1306
+ const headers = {};
1307
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1308
+ const contextIds = await ContextIdStore.getContextIds();
1309
+ HttpHeaderHelper.buildCursor(headers, httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin], result.cursor);
1320
1310
  return {
1321
1311
  headers,
1322
1312
  body: result.entries
@@ -1341,13 +1331,10 @@ export async function auditableItemStreamListEntryObjects(httpRequestContext, co
1341
1331
  limit: Coerce.integer(request.query?.limit),
1342
1332
  cursor: request.query?.cursor
1343
1333
  });
1344
- const headers = {
1345
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
1346
- };
1347
- if (Is.stringValue(result.cursor)) {
1348
- const contextIds = await ContextIdStore.getContextIds();
1349
- headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(HttpUrlHelper.replaceOrigin(httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin]), { cursor: result.cursor }, "next");
1350
- }
1334
+ const headers = {};
1335
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1336
+ const contextIds = await ContextIdStore.getContextIds();
1337
+ HttpHeaderHelper.buildCursor(headers, httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin], result.cursor);
1351
1338
  return {
1352
1339
  headers,
1353
1340
  body: result.entries
@@ -1370,13 +1357,10 @@ export async function auditableItemStreamListEntryObjectsNoStream(httpRequestCon
1370
1357
  limit: Coerce.integer(request.query?.limit),
1371
1358
  cursor: request.query?.cursor
1372
1359
  });
1373
- const headers = {
1374
- [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
1375
- };
1376
- if (Is.stringValue(result.cursor)) {
1377
- const contextIds = await ContextIdStore.getContextIds();
1378
- headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(HttpUrlHelper.replaceOrigin(httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin]), { cursor: result.cursor }, "next");
1379
- }
1360
+ const headers = {};
1361
+ HttpHeaderHelper.buildJsonContentType(headers, request.headers);
1362
+ const contextIds = await ContextIdStore.getContextIds();
1363
+ HttpHeaderHelper.buildCursor(headers, httpRequestContext.serverRequest.url, contextIds?.[HttpContextIdKeys.PublicOrigin], result.cursor);
1380
1364
  return {
1381
1365
  headers,
1382
1366
  body: result.entries