@twin.org/blob-storage-service 0.0.3-next.10 → 0.0.3-next.12
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.
- package/dist/es/blobStorageRoutes.js +37 -0
- package/dist/es/blobStorageRoutes.js.map +1 -1
- package/dist/es/blobStorageService.js +26 -0
- package/dist/es/blobStorageService.js.map +1 -1
- package/dist/types/blobStorageRoutes.d.ts +9 -1
- package/dist/types/blobStorageService.d.ts +5 -0
- package/docs/changelog.md +32 -0
- package/docs/open-api/spec.json +89 -0
- package/docs/reference/classes/BlobStorageService.md +18 -0
- package/docs/reference/functions/blobStorageEmpty.md +31 -0
- package/docs/reference/index.md +1 -0
- package/locales/en.json +1 -0
- package/package.json +2 -2
|
@@ -268,6 +268,28 @@ export function generateRestRoutesBlobStorage(baseRouteName, componentName, opti
|
|
|
268
268
|
}
|
|
269
269
|
]
|
|
270
270
|
};
|
|
271
|
+
const blobStorageEmptyRoute = {
|
|
272
|
+
operationId: `${camelTypeName}Empty`,
|
|
273
|
+
summary: `Remove all entries from ${lowerName}`,
|
|
274
|
+
tag: options?.tagName ?? tagsBlobStorage[0].name,
|
|
275
|
+
method: "DELETE",
|
|
276
|
+
path: `${baseRouteName}/`,
|
|
277
|
+
handler: async (httpRequestContext, request) => blobStorageEmpty(httpRequestContext, componentName, request),
|
|
278
|
+
requestType: {
|
|
279
|
+
type: "IBlobStorageEmptyRequest",
|
|
280
|
+
examples: [
|
|
281
|
+
{
|
|
282
|
+
id: `${camelTypeName}EmptyRequestExample`,
|
|
283
|
+
request: {}
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
},
|
|
287
|
+
responseType: [
|
|
288
|
+
{
|
|
289
|
+
type: "INoContentResponse"
|
|
290
|
+
}
|
|
291
|
+
]
|
|
292
|
+
};
|
|
271
293
|
const blobStorageListRoute = {
|
|
272
294
|
operationId: `${camelTypeName}Query`,
|
|
273
295
|
summary: `Query the items from ${lowerName}`,
|
|
@@ -377,6 +399,7 @@ export function generateRestRoutesBlobStorage(baseRouteName, componentName, opti
|
|
|
377
399
|
blobStorageGetContentRoute,
|
|
378
400
|
blobStorageUpdateRoute,
|
|
379
401
|
blobStorageRemoveRoute,
|
|
402
|
+
blobStorageEmptyRoute,
|
|
380
403
|
blobStorageListRoute
|
|
381
404
|
];
|
|
382
405
|
}
|
|
@@ -507,6 +530,20 @@ export async function blobStorageRemove(httpRequestContext, componentName, reque
|
|
|
507
530
|
statusCode: HttpStatusCode.noContent
|
|
508
531
|
};
|
|
509
532
|
}
|
|
533
|
+
/**
|
|
534
|
+
* Remove all entries from blob storage.
|
|
535
|
+
* @param httpRequestContext The request context for the API.
|
|
536
|
+
* @param componentName The name of the component to use in the routes.
|
|
537
|
+
* @param request The request.
|
|
538
|
+
* @returns The response object with additional http response properties.
|
|
539
|
+
*/
|
|
540
|
+
export async function blobStorageEmpty(httpRequestContext, componentName, request) {
|
|
541
|
+
const component = ComponentFactory.get(componentName);
|
|
542
|
+
await component.empty();
|
|
543
|
+
return {
|
|
544
|
+
statusCode: HttpStatusCode.noContent
|
|
545
|
+
};
|
|
546
|
+
}
|
|
510
547
|
/**
|
|
511
548
|
* List the entries from blob storage.
|
|
512
549
|
* @param httpRequestContext The request context for the API.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobStorageRoutes.js","sourceRoot":"","sources":["../../src/blobStorageRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHttpParameterHelper,\n\ttype IHostingComponent,\n\ttype ICreatedResponse,\n\ttype IHttpRequestContext,\n\ttype INoContentResponse,\n\ttype INotFoundResponse,\n\ttype IRestRoute,\n\ttype IRestRouteResponseOptions,\n\ttype ITag\n} from \"@twin.org/api-models\";\nimport {\n\tBlobStorageCompressionType,\n\tBlobStorageContexts,\n\tBlobStorageTypes,\n\ttype IBlobStorageComponent,\n\ttype IBlobStorageCreateRequest,\n\ttype IBlobStorageGetContentRequest,\n\ttype IBlobStorageGetContentResponse,\n\ttype IBlobStorageGetRequest,\n\ttype IBlobStorageGetResponse,\n\ttype IBlobStorageListRequest,\n\ttype IBlobStorageListResponse,\n\ttype IBlobStorageRemoveRequest,\n\ttype IBlobStorageUpdateRequest\n} from \"@twin.org/blob-storage-models\";\nimport { Coerce, ComponentFactory, Converter, Guards, Is, StringHelper } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { SchemaOrgContexts, SchemaOrgTypes } from \"@twin.org/standards-schema-org\";\nimport {\n\tHeaderHelper,\n\tHeaderTypes,\n\tHttpStatusCode,\n\tMimeTypeHelper,\n\tMimeTypes\n} from \"@twin.org/web\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"blobStorageRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsBlobStorage: ITag[] = [\n\t{\n\t\tname: \"Blob Storage\",\n\t\tdescription: \"Endpoints which are modelled to access a blob storage contract.\"\n\t}\n];\n\n/**\n * The REST routes for blob storage.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @param options Additional options for the routes.\n * @param options.typeName Optional type name to use in the routes, defaults to Blob Storage.\n * @param options.tagName Optional name to use in OpenAPI spec for tag.\n * @returns The generated routes.\n */\nexport function generateRestRoutesBlobStorage(\n\tbaseRouteName: string,\n\tcomponentName: string,\n\toptions?: {\n\t\ttypeName?: string;\n\t\ttagName?: string;\n\t}\n): IRestRoute[] {\n\tconst typeName = options?.typeName ?? \"Blob Storage\";\n\tconst lowerName = typeName.toLowerCase();\n\tconst camelTypeName = StringHelper.camelCase(typeName);\n\n\tconst blobStorageCreateRoute: IRestRoute<IBlobStorageCreateRequest, ICreatedResponse> = {\n\t\toperationId: `${camelTypeName}Create`,\n\t\tsummary: `Create an entry in ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageCreate(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageCreateRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}CreateRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\",\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICreatedResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}CreateResponseExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.created,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Location]:\n\t\t\t\t\t\t\t\t\t\"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageGetRoute: IRestRoute<IBlobStorageGetRequest, IBlobStorageGetResponse> = {\n\t\toperationId: `${camelTypeName}Get`,\n\t\tsummary: `Get the metadata for an item from ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageGet(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageGetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}GetRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\tincludeContent: \"true\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageGetResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}GetResponseExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageGetResponse>(),\n\t\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}GetResponseJsonLdExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageGetContentRoute: IRestRoute<\n\t\tIBlobStorageGetContentRequest,\n\t\tIBlobStorageGetContentResponse & IRestRouteResponseOptions\n\t> = {\n\t\toperationId: `${camelTypeName}GetContent`,\n\t\tsummary: `Get the content for an item in ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/:id/content`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageGetContent(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageGetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}GetContentRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\tdownload: \"true\",\n\t\t\t\t\t\t\tfilename: \"my-file.pdf\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<Uint8Array>(),\n\t\t\t\tmimeType: MimeTypes.OctetStream,\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}GetContentResponseExample`,\n\t\t\t\t\t\tdescription: `The content of the blob, which will be a specific mime type if one can be detected from the content (or set as encodingFormat in the entry), or defaults to ${MimeTypes.OctetStream}.`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: new Uint8Array()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageUpdateRoute: IRestRoute<IBlobStorageUpdateRequest, INoContentResponse> = {\n\t\toperationId: `${camelTypeName}Update`,\n\t\tsummary: `Update the metadata for an item in ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"PUT\",\n\t\tpath: `${baseRouteName}/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageUpdate(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageUpdateRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}UpdateRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageRemoveRoute: IRestRoute<IBlobStorageRemoveRequest, INoContentResponse> = {\n\t\toperationId: `${camelTypeName}Remove`,\n\t\tsummary: `Remove an item from ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"DELETE\",\n\t\tpath: `${baseRouteName}/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageRemove(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageRemoveRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}RemoveRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageListRoute: IRestRoute<IBlobStorageListRequest, IBlobStorageListResponse> = {\n\t\toperationId: `${camelTypeName}Query`,\n\t\tsummary: `Query the items from ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageList(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageListRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}ListRequestExample`,\n\t\t\t\t\trequest: {}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageListResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}ListResponseExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t\t\t\t\t\t[SchemaOrgTypes.ItemListElement]: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageListResponse>(),\n\t\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}ListResponseJsonLdExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t\t\t\t\t\t[SchemaOrgTypes.ItemListElement]: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\treturn [\n\t\tblobStorageCreateRoute,\n\t\tblobStorageGetRoute,\n\t\tblobStorageGetContentRoute,\n\t\tblobStorageUpdateRoute,\n\t\tblobStorageRemoveRoute,\n\t\tblobStorageListRoute\n\t];\n}\n\n/**\n * Create a blob in storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageCreate(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageCreateRequest\n): Promise<ICreatedResponse> {\n\tGuards.object<IBlobStorageCreateRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageCreateRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\tGuards.stringBase64(ROUTES_SOURCE, nameof(request.body.blob), request.body.blob);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\tconst id = await component.create(\n\t\trequest.body.blob,\n\t\trequest.body.encodingFormat,\n\t\trequest.body.fileExtension,\n\t\trequest.body.metadata,\n\t\t{\n\t\t\tdisableEncryption: request.body.disableEncryption,\n\t\t\toverrideVaultKeyId: request.body.overrideVaultKeyId,\n\t\t\tnamespace: request.body.namespace\n\t\t}\n\t);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.created,\n\t\theaders: {\n\t\t\t[HeaderTypes.Location]: id\n\t\t}\n\t};\n}\n\n/**\n * Get the blob from storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageGet(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageGetRequest\n): Promise<IBlobStorageGetResponse> {\n\tGuards.object<IBlobStorageGetRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageGetRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tconst result = await component.get(request.pathParams.id, {\n\t\tincludeContent: Coerce.boolean(request.query?.includeContent),\n\t\tdecompress: Coerce.boolean(request.query?.decompress),\n\t\toverrideVaultKeyId: request.query?.overrideVaultKeyId\n\t});\n\n\treturn {\n\t\theaders: {\n\t\t\t[HeaderTypes.ContentType]:\n\t\t\t\trequest.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd\n\t\t\t\t\t? MimeTypes.JsonLd\n\t\t\t\t\t: MimeTypes.Json\n\t\t},\n\t\tbody: result\n\t};\n}\n\n/**\n * Get the blob from storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageGetContent(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageGetContentRequest\n): Promise<IBlobStorageGetContentResponse & IRestRouteResponseOptions> {\n\tGuards.object<IBlobStorageGetContentRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageGetContentRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tconst decompress = Coerce.boolean(request.query?.decompress);\n\tconst download = Coerce.boolean(request.query?.download) ?? false;\n\n\tconst result = await component.get(request.pathParams.id, {\n\t\tincludeContent: true,\n\t\tdecompress,\n\t\toverrideVaultKeyId: request.query?.overrideVaultKeyId\n\t});\n\n\tconst encodingFormat = result?.encodingFormat ?? MimeTypes.OctetStream;\n\tlet compressedEncodingFormat: MimeTypes | undefined;\n\tlet compressedExtension: string = \"\";\n\n\t// If the entry is compressed and we are not decompressing\n\t// we need to override the encoding format to the compressed type\n\t// and append an additional extension to the filename.\n\tif (result.compression && !decompress) {\n\t\tcompressedEncodingFormat =\n\t\t\tresult.compression === BlobStorageCompressionType.Gzip ? MimeTypes.Gzip : MimeTypes.Zlib;\n\t\tcompressedExtension = `.${MimeTypeHelper.defaultExtension(compressedEncodingFormat)}`;\n\t}\n\n\tlet filename = request.query?.filename;\n\tif (!Is.stringValue(filename)) {\n\t\tfilename = `file.${result.fileExtension ?? MimeTypeHelper.defaultExtension(encodingFormat)}${compressedExtension}`;\n\t}\n\n\treturn {\n\t\tbody: Is.stringBase64(result.blob) ? Converter.base64ToBytes(result.blob) : new Uint8Array(),\n\t\tattachment: {\n\t\t\tmimeType: compressedEncodingFormat ?? encodingFormat,\n\t\t\tfilename,\n\t\t\tinline: !download\n\t\t}\n\t};\n}\n\n/**\n * Update the blob storage metadata.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageUpdate(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageUpdateRequest\n): Promise<INoContentResponse> {\n\tGuards.object<IBlobStorageUpdateRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageUpdateRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tawait component.update(\n\t\trequest.pathParams.id,\n\t\trequest.body.encodingFormat,\n\t\trequest.body.fileExtension,\n\t\trequest.body.metadata\n\t);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * Remove the blob from storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageRemove(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageRemoveRequest\n): Promise<INoContentResponse> {\n\tGuards.object<IBlobStorageRemoveRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageGetRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tawait component.remove(request.pathParams.id);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * List the entries from blob storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageList(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageListRequest\n): Promise<IBlobStorageListResponse> {\n\tGuards.object<IBlobStorageListRequest>(ROUTES_SOURCE, nameof(request), request);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tconst result = await component.query(\n\t\tHttpParameterHelper.objectFromString(request.query?.conditions),\n\t\trequest.query?.orderBy,\n\t\trequest.query?.orderByDirection,\n\t\trequest.query?.cursor,\n\t\tCoerce.number(request.query?.limit)\n\t);\n\n\tconst headers: IBlobStorageListResponse[\"headers\"] = {\n\t\t[HeaderTypes.ContentType]:\n\t\t\trequest.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json\n\t};\n\n\tif (Is.stringValue(result.cursor)) {\n\t\theaders[HeaderTypes.Link] = HeaderHelper.createLinkHeader(\n\t\t\tawait hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url),\n\t\t\t{ cursor: result.cursor },\n\t\t\t\"next\"\n\t\t);\n\t}\n\n\treturn {\n\t\theaders,\n\t\tbody: result.entries\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"blobStorageRoutes.js","sourceRoot":"","sources":["../../src/blobStorageRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tHttpParameterHelper,\n\ttype IHostingComponent,\n\ttype ICreatedResponse,\n\ttype IHttpRequestContext,\n\ttype INoContentResponse,\n\ttype INotFoundResponse,\n\ttype IRestRoute,\n\ttype IRestRouteResponseOptions,\n\ttype ITag\n} from \"@twin.org/api-models\";\nimport {\n\tBlobStorageCompressionType,\n\tBlobStorageContexts,\n\tBlobStorageTypes,\n\ttype IBlobStorageComponent,\n\ttype IBlobStorageCreateRequest,\n\ttype IBlobStorageGetContentRequest,\n\ttype IBlobStorageGetContentResponse,\n\ttype IBlobStorageGetRequest,\n\ttype IBlobStorageGetResponse,\n\ttype IBlobStorageEmptyRequest,\n\ttype IBlobStorageListRequest,\n\ttype IBlobStorageListResponse,\n\ttype IBlobStorageRemoveRequest,\n\ttype IBlobStorageUpdateRequest\n} from \"@twin.org/blob-storage-models\";\nimport { Coerce, ComponentFactory, Converter, Guards, Is, StringHelper } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport { SchemaOrgContexts, SchemaOrgTypes } from \"@twin.org/standards-schema-org\";\nimport {\n\tHeaderHelper,\n\tHeaderTypes,\n\tHttpStatusCode,\n\tMimeTypeHelper,\n\tMimeTypes\n} from \"@twin.org/web\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"blobStorageRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsBlobStorage: ITag[] = [\n\t{\n\t\tname: \"Blob Storage\",\n\t\tdescription: \"Endpoints which are modelled to access a blob storage contract.\"\n\t}\n];\n\n/**\n * The REST routes for blob storage.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @param options Additional options for the routes.\n * @param options.typeName Optional type name to use in the routes, defaults to Blob Storage.\n * @param options.tagName Optional name to use in OpenAPI spec for tag.\n * @returns The generated routes.\n */\nexport function generateRestRoutesBlobStorage(\n\tbaseRouteName: string,\n\tcomponentName: string,\n\toptions?: {\n\t\ttypeName?: string;\n\t\ttagName?: string;\n\t}\n): IRestRoute[] {\n\tconst typeName = options?.typeName ?? \"Blob Storage\";\n\tconst lowerName = typeName.toLowerCase();\n\tconst camelTypeName = StringHelper.camelCase(typeName);\n\n\tconst blobStorageCreateRoute: IRestRoute<IBlobStorageCreateRequest, ICreatedResponse> = {\n\t\toperationId: `${camelTypeName}Create`,\n\t\tsummary: `Create an entry in ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageCreate(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageCreateRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}CreateRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\",\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICreatedResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}CreateResponseExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.created,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Location]:\n\t\t\t\t\t\t\t\t\t\"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageGetRoute: IRestRoute<IBlobStorageGetRequest, IBlobStorageGetResponse> = {\n\t\toperationId: `${camelTypeName}Get`,\n\t\tsummary: `Get the metadata for an item from ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageGet(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageGetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}GetRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\tincludeContent: \"true\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageGetResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}GetResponseExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageGetResponse>(),\n\t\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}GetResponseJsonLdExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageGetContentRoute: IRestRoute<\n\t\tIBlobStorageGetContentRequest,\n\t\tIBlobStorageGetContentResponse & IRestRouteResponseOptions\n\t> = {\n\t\toperationId: `${camelTypeName}GetContent`,\n\t\tsummary: `Get the content for an item in ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/:id/content`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageGetContent(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageGetRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}GetContentRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\tdownload: \"true\",\n\t\t\t\t\t\t\tfilename: \"my-file.pdf\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<Uint8Array>(),\n\t\t\t\tmimeType: MimeTypes.OctetStream,\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}GetContentResponseExample`,\n\t\t\t\t\t\tdescription: `The content of the blob, which will be a specific mime type if one can be detected from the content (or set as encodingFormat in the entry), or defaults to ${MimeTypes.OctetStream}.`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: new Uint8Array()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageUpdateRoute: IRestRoute<IBlobStorageUpdateRequest, INoContentResponse> = {\n\t\toperationId: `${camelTypeName}Update`,\n\t\tsummary: `Update the metadata for an item in ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"PUT\",\n\t\tpath: `${baseRouteName}/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageUpdate(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageUpdateRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}UpdateRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageRemoveRoute: IRestRoute<IBlobStorageRemoveRequest, INoContentResponse> = {\n\t\toperationId: `${camelTypeName}Remove`,\n\t\tsummary: `Remove an item from ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"DELETE\",\n\t\tpath: `${baseRouteName}/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageRemove(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageRemoveRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}RemoveRequestExample`,\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageEmptyRoute: IRestRoute<IBlobStorageEmptyRequest, INoContentResponse> = {\n\t\toperationId: `${camelTypeName}Empty`,\n\t\tsummary: `Remove all entries from ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"DELETE\",\n\t\tpath: `${baseRouteName}/`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageEmpty(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageEmptyRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}EmptyRequestExample`,\n\t\t\t\t\trequest: {}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst blobStorageListRoute: IRestRoute<IBlobStorageListRequest, IBlobStorageListResponse> = {\n\t\toperationId: `${camelTypeName}Query`,\n\t\tsummary: `Query the items from ${lowerName}`,\n\t\ttag: options?.tagName ?? tagsBlobStorage[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\tblobStorageList(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<IBlobStorageListRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: `${camelTypeName}ListRequestExample`,\n\t\t\t\t\trequest: {}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageListResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}ListResponseExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t\t\t\t\t\t[SchemaOrgTypes.ItemListElement]: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<IBlobStorageListResponse>(),\n\t\t\t\tmimeType: MimeTypes.JsonLd,\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: `${camelTypeName}ListResponseJsonLdExample`,\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t\t\t\t\t\t[SchemaOrgTypes.ItemListElement]: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\"@context\": [\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.Context,\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextCommon,\n\t\t\t\t\t\t\t\t\t\t\tSchemaOrgContexts.Context\n\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\t\t\t\t\t\t\t\tid: \"blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\n\t\t\t\t\t\t\t\t\t\tdateCreated: \"2024-01-01T00:00:00Z\",\n\t\t\t\t\t\t\t\t\t\tencodingFormat: MimeTypes.Pdf,\n\t\t\t\t\t\t\t\t\t\tblobSize: 42,\n\t\t\t\t\t\t\t\t\t\tintegrity: \"sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=\",\n\t\t\t\t\t\t\t\t\t\tfileExtension: \"pdf\",\n\t\t\t\t\t\t\t\t\t\tmetadata: {\n\t\t\t\t\t\t\t\t\t\t\t\"@context\": \"https://schema.org\",\n\t\t\t\t\t\t\t\t\t\t\t\"@type\": \"DigitalDocument\",\n\t\t\t\t\t\t\t\t\t\t\tname: \"myfile.pdf\"\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tblob: \"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t},\n\t\t\t{\n\t\t\t\ttype: nameof<INotFoundResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\treturn [\n\t\tblobStorageCreateRoute,\n\t\tblobStorageGetRoute,\n\t\tblobStorageGetContentRoute,\n\t\tblobStorageUpdateRoute,\n\t\tblobStorageRemoveRoute,\n\t\tblobStorageEmptyRoute,\n\t\tblobStorageListRoute\n\t];\n}\n\n/**\n * Create a blob in storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageCreate(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageCreateRequest\n): Promise<ICreatedResponse> {\n\tGuards.object<IBlobStorageCreateRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageCreateRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\tGuards.stringBase64(ROUTES_SOURCE, nameof(request.body.blob), request.body.blob);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\tconst id = await component.create(\n\t\trequest.body.blob,\n\t\trequest.body.encodingFormat,\n\t\trequest.body.fileExtension,\n\t\trequest.body.metadata,\n\t\t{\n\t\t\tdisableEncryption: request.body.disableEncryption,\n\t\t\toverrideVaultKeyId: request.body.overrideVaultKeyId,\n\t\t\tnamespace: request.body.namespace\n\t\t}\n\t);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.created,\n\t\theaders: {\n\t\t\t[HeaderTypes.Location]: id\n\t\t}\n\t};\n}\n\n/**\n * Get the blob from storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageGet(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageGetRequest\n): Promise<IBlobStorageGetResponse> {\n\tGuards.object<IBlobStorageGetRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageGetRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tconst result = await component.get(request.pathParams.id, {\n\t\tincludeContent: Coerce.boolean(request.query?.includeContent),\n\t\tdecompress: Coerce.boolean(request.query?.decompress),\n\t\toverrideVaultKeyId: request.query?.overrideVaultKeyId\n\t});\n\n\treturn {\n\t\theaders: {\n\t\t\t[HeaderTypes.ContentType]:\n\t\t\t\trequest.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd\n\t\t\t\t\t? MimeTypes.JsonLd\n\t\t\t\t\t: MimeTypes.Json\n\t\t},\n\t\tbody: result\n\t};\n}\n\n/**\n * Get the blob from storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageGetContent(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageGetContentRequest\n): Promise<IBlobStorageGetContentResponse & IRestRouteResponseOptions> {\n\tGuards.object<IBlobStorageGetContentRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageGetContentRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tconst decompress = Coerce.boolean(request.query?.decompress);\n\tconst download = Coerce.boolean(request.query?.download) ?? false;\n\n\tconst result = await component.get(request.pathParams.id, {\n\t\tincludeContent: true,\n\t\tdecompress,\n\t\toverrideVaultKeyId: request.query?.overrideVaultKeyId\n\t});\n\n\tconst encodingFormat = result?.encodingFormat ?? MimeTypes.OctetStream;\n\tlet compressedEncodingFormat: MimeTypes | undefined;\n\tlet compressedExtension: string = \"\";\n\n\t// If the entry is compressed and we are not decompressing\n\t// we need to override the encoding format to the compressed type\n\t// and append an additional extension to the filename.\n\tif (result.compression && !decompress) {\n\t\tcompressedEncodingFormat =\n\t\t\tresult.compression === BlobStorageCompressionType.Gzip ? MimeTypes.Gzip : MimeTypes.Zlib;\n\t\tcompressedExtension = `.${MimeTypeHelper.defaultExtension(compressedEncodingFormat)}`;\n\t}\n\n\tlet filename = request.query?.filename;\n\tif (!Is.stringValue(filename)) {\n\t\tfilename = `file.${result.fileExtension ?? MimeTypeHelper.defaultExtension(encodingFormat)}${compressedExtension}`;\n\t}\n\n\treturn {\n\t\tbody: Is.stringBase64(result.blob) ? Converter.base64ToBytes(result.blob) : new Uint8Array(),\n\t\tattachment: {\n\t\t\tmimeType: compressedEncodingFormat ?? encodingFormat,\n\t\t\tfilename,\n\t\t\tinline: !download\n\t\t}\n\t};\n}\n\n/**\n * Update the blob storage metadata.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageUpdate(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageUpdateRequest\n): Promise<INoContentResponse> {\n\tGuards.object<IBlobStorageUpdateRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageUpdateRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tawait component.update(\n\t\trequest.pathParams.id,\n\t\trequest.body.encodingFormat,\n\t\trequest.body.fileExtension,\n\t\trequest.body.metadata\n\t);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * Remove the blob from storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageRemove(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageRemoveRequest\n): Promise<INoContentResponse> {\n\tGuards.object<IBlobStorageRemoveRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<IBlobStorageGetRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tawait component.remove(request.pathParams.id);\n\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * Remove all entries from blob storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageEmpty(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageEmptyRequest\n): Promise<INoContentResponse> {\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\tawait component.empty();\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * List the entries from blob storage.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function blobStorageList(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: IBlobStorageListRequest\n): Promise<IBlobStorageListResponse> {\n\tGuards.object<IBlobStorageListRequest>(ROUTES_SOURCE, nameof(request), request);\n\n\tconst hostingComponent = ComponentFactory.get<IHostingComponent>(\n\t\thttpRequestContext.hostingComponentType ?? \"hosting\"\n\t);\n\n\tconst component = ComponentFactory.get<IBlobStorageComponent>(componentName);\n\n\tconst result = await component.query(\n\t\tHttpParameterHelper.objectFromString(request.query?.conditions),\n\t\trequest.query?.orderBy,\n\t\trequest.query?.orderByDirection,\n\t\trequest.query?.cursor,\n\t\tCoerce.number(request.query?.limit)\n\t);\n\n\tconst headers: IBlobStorageListResponse[\"headers\"] = {\n\t\t[HeaderTypes.ContentType]:\n\t\t\trequest.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json\n\t};\n\n\tif (Is.stringValue(result.cursor)) {\n\t\theaders[HeaderTypes.Link] = HeaderHelper.createLinkHeader(\n\t\t\tawait hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url),\n\t\t\t{ cursor: result.cursor },\n\t\t\t\"next\"\n\t\t);\n\t}\n\n\treturn {\n\t\theaders,\n\t\tbody: result.entries\n\t};\n}\n"]}
|
|
@@ -225,6 +225,32 @@ export class BlobStorageService {
|
|
|
225
225
|
throw new GeneralError(BlobStorageService.CLASS_NAME, "updateFailed", undefined, error);
|
|
226
226
|
}
|
|
227
227
|
}
|
|
228
|
+
/**
|
|
229
|
+
* Remove all blobs from the storage.
|
|
230
|
+
* @returns Nothing.
|
|
231
|
+
*/
|
|
232
|
+
async empty() {
|
|
233
|
+
try {
|
|
234
|
+
let moreData = true;
|
|
235
|
+
while (moreData) {
|
|
236
|
+
const result = await this._entryEntityStorage.query(undefined, undefined, undefined, undefined, 100);
|
|
237
|
+
if (result.entities.length === 0) {
|
|
238
|
+
moreData = false;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
for (const entity of result.entities) {
|
|
242
|
+
const entry = entity;
|
|
243
|
+
const blobStorageConnector = this.getConnector(entry.id);
|
|
244
|
+
await blobStorageConnector.remove(entry.id);
|
|
245
|
+
await this._entryEntityStorage.remove(entry.id);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
throw new GeneralError(BlobStorageService.CLASS_NAME, "emptyFailed", undefined, error);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
228
254
|
/**
|
|
229
255
|
* Remove the blob.
|
|
230
256
|
* @param id The id of the blob to remove in urn format.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blobStorageService.js","sourceRoot":"","sources":["../../src/blobStorageService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tBlobStorageConnectorFactory,\n\tBlobStorageContexts,\n\tBlobStorageTypes,\n\ttype BlobStorageCompressionType,\n\ttype IBlobStorageComponent,\n\ttype IBlobStorageConnector,\n\ttype IBlobStorageEntry,\n\ttype IBlobStorageEntryList\n} from \"@twin.org/blob-storage-models\";\nimport { ContextIdHelper, ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tCompression,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tUrn,\n\tValidation,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { IntegrityAlgorithm, IntegrityHelper } from \"@twin.org/crypto\";\nimport { JsonLdHelper, JsonLdProcessor, type IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport {\n\tComparisonOperator,\n\tEntitySchemaHelper,\n\tLogicalOperator,\n\tSortDirection,\n\ttype EntityCondition\n} from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport {\n\tVaultConnectorFactory,\n\tVaultEncryptionType,\n\ttype IVaultConnector\n} from \"@twin.org/vault-models\";\nimport { MimeTypeHelper } from \"@twin.org/web\";\nimport type { BlobStorageEntry } from \"./entities/blobStorageEntry.js\";\nimport type { IBlobStorageServiceConstructorOptions } from \"./models/IBlobStorageServiceConstructorOptions.js\";\n\n/**\n * Service for performing blob storage operations to a connector.\n */\nexport class BlobStorageService implements IBlobStorageComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<BlobStorageService>();\n\n\t/**\n\t * The namespace supported by the blob storage service.\n\t * @internal\n\t */\n\tprivate static readonly _NAMESPACE: string = \"blob\";\n\n\t/**\n\t * The namespace of the default storage connector to use.\n\t * Defaults to the first entry in the factory if not provided.\n\t * @internal\n\t */\n\tprivate readonly _defaultNamespace: string;\n\n\t/**\n\t * The storage connector for the metadata.\n\t * @internal\n\t */\n\tprivate readonly _entryEntityStorage: IEntityStorageConnector<BlobStorageEntry>;\n\n\t/**\n\t * The vault connector for the encryption, can be undefined if no encryption required.\n\t * @internal\n\t */\n\tprivate readonly _vaultConnector?: IVaultConnector;\n\n\t/**\n\t * The id of the vault key to use for encryption if the service has a vault connector configured.\n\t * @internal\n\t */\n\tprivate readonly _vaultKeyId: string | undefined;\n\n\t/**\n\t * Create a new instance of BlobStorageService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IBlobStorageServiceConstructorOptions) {\n\t\tconst names = BlobStorageConnectorFactory.names();\n\t\tif (names.length === 0) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"noConnectors\");\n\t\t}\n\n\t\tthis._entryEntityStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.entryEntityStorageType ?? \"blob-storage-entry\"\n\t\t);\n\t\tif (Is.stringValue(options?.vaultConnectorType)) {\n\t\t\tthis._vaultConnector = VaultConnectorFactory.get(options.vaultConnectorType);\n\t\t}\n\n\t\tthis._defaultNamespace = options?.config?.defaultNamespace ?? names[0];\n\t\tthis._vaultKeyId = options?.config?.vaultKeyId;\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn BlobStorageService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Create the blob with some metadata.\n\t * @param blob The data for the blob in base64 format.\n\t * @param encodingFormat Mime type for the blob, will be detected if left undefined.\n\t * @param fileExtension Extension for the blob, will be detected if left undefined.\n\t * @param metadata Data for the custom metadata as JSON-LD.\n\t * @param options Optional options for the creation of the blob.\n\t * @param options.disableEncryption Disables encryption if enabled by default.\n\t * @param options.overrideVaultKeyId Use a different vault key id for encryption, if not provided the default vault key id will be used.\n\t * @param options.compress Optional compression type to use for the blob, defaults to no compression.\n\t * @param options.namespace The namespace to use for storing, defaults to component configured namespace.\n\t * @returns The id of the stored blob in urn format.\n\t */\n\tpublic async create(\n\t\tblob: string,\n\t\tencodingFormat?: string,\n\t\tfileExtension?: string,\n\t\tmetadata?: IJsonLdNodeObject,\n\t\toptions?: {\n\t\t\tdisableEncryption?: boolean;\n\t\t\toverrideVaultKeyId?: string;\n\t\t\tcompress?: BlobStorageCompressionType;\n\t\t\tnamespace?: string;\n\t\t}\n\t): Promise<string> {\n\t\tGuards.stringBase64(BlobStorageService.CLASS_NAME, nameof(blob), blob);\n\n\t\tconst disableEncryption = options?.disableEncryption ?? false;\n\t\tconst vaultKeyId = options?.overrideVaultKeyId ?? this._vaultKeyId;\n\t\tconst encryptionEnabled = !disableEncryption && Is.stringValue(vaultKeyId);\n\n\t\ttry {\n\t\t\tconst connectorNamespace = options?.namespace ?? this._defaultNamespace;\n\n\t\t\tconst blobStorageConnector =\n\t\t\t\tBlobStorageConnectorFactory.get<IBlobStorageConnector>(connectorNamespace);\n\n\t\t\t// Convert the base64 data into bytes\n\t\t\tlet storeBlob = Converter.base64ToBytes(blob);\n\t\t\tconst blobSize = storeBlob.length;\n\n\t\t\t// See if we can detect the mime type and default extension for the data.\n\t\t\t// If not already supplied by the caller. We have to perform this operation\n\t\t\t// on the unencrypted data.\n\t\t\tif (!Is.stringValue(encodingFormat)) {\n\t\t\t\tencodingFormat = await MimeTypeHelper.detect(storeBlob);\n\t\t\t}\n\n\t\t\tif (!Is.stringValue(fileExtension) && Is.stringValue(encodingFormat)) {\n\t\t\t\tfileExtension = MimeTypeHelper.defaultExtension(encodingFormat);\n\t\t\t}\n\n\t\t\tif (Is.object(metadata)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(metadata, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tBlobStorageService.CLASS_NAME,\n\t\t\t\t\tnameof(metadata),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst integrity = IntegrityHelper.generate(IntegrityAlgorithm.Sha256, storeBlob);\n\n\t\t\tif (!Is.empty(options?.compress)) {\n\t\t\t\tstoreBlob = await Compression.compress(storeBlob, options.compress);\n\t\t\t}\n\n\t\t\t// If we have a vault connector then encrypt the data.\n\t\t\tif (encryptionEnabled) {\n\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\t\t\tContextIdHelper.guard(contextIds, ContextIdKeys.Organization);\n\n\t\t\t\tif (Is.empty(this._vaultConnector)) {\n\t\t\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"vaultConnectorNotConfigured\");\n\t\t\t\t}\n\t\t\t\tstoreBlob = await this._vaultConnector.encrypt(\n\t\t\t\t\t`${contextIds[ContextIdKeys.Organization]}/${vaultKeyId}`,\n\t\t\t\t\tVaultEncryptionType.ChaCha20Poly1305,\n\t\t\t\t\tstoreBlob\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Set the blob in the storage connector, which may now be encrypted\n\t\t\tconst blobId = await blobStorageConnector.set(storeBlob);\n\n\t\t\t// Now store the entry in entity storage\n\t\t\tconst blobEntry: BlobStorageEntry = {\n\t\t\t\tid: blobId,\n\t\t\t\tdateCreated: new Date(Date.now()).toISOString(),\n\t\t\t\tblobSize,\n\t\t\t\tintegrity,\n\t\t\t\tencodingFormat,\n\t\t\t\tfileExtension,\n\t\t\t\tmetadata,\n\t\t\t\tisEncrypted: encryptionEnabled,\n\t\t\t\tcompression: options?.compress\n\t\t\t};\n\n\t\t\tawait this._entryEntityStorage.set(blobEntry);\n\n\t\t\treturn blobId;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"createFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get the blob entry.\n\t * @param id The id of the blob to get in urn format.\n\t * @param options Optional options for the retrieval of the blob.\n\t * @param options.includeContent Include the content, or just get the metadata.\n\t * @param options.overrideVaultKeyId Use a different vault key id for decryption, if not provided the default vault key id will be used.\n\t * @param options.decompress If the content should be decompressed, if it was compressed when stored, defaults to true.\n\t * @returns The entry and data for the blob if it can be found.\n\t * @throws Not found error if the blob cannot be found.\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tincludeContent?: boolean;\n\t\t\tdecompress?: boolean;\n\t\t\toverrideVaultKeyId?: string;\n\t\t}\n\t): Promise<IBlobStorageEntry> {\n\t\tUrn.guard(BlobStorageService.CLASS_NAME, nameof(id), id);\n\n\t\tconst includeContent = options?.includeContent ?? false;\n\t\tconst vaultKeyId = options?.overrideVaultKeyId ?? this._vaultKeyId;\n\n\t\ttry {\n\t\t\tconst blobEntry = await this.internalGet(id);\n\n\t\t\tlet returnBlob: Uint8Array | undefined;\n\t\t\tif (includeContent) {\n\t\t\t\tconst blobStorageConnector = this.getConnector(id);\n\t\t\t\treturnBlob = await blobStorageConnector.get(id);\n\t\t\t\tif (Is.undefined(returnBlob)) {\n\t\t\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"blobNotFound\", id);\n\t\t\t\t}\n\n\t\t\t\t// If the data is encrypted then decrypt it.\n\t\t\t\tconst decryptionEnabled = blobEntry.isEncrypted && Is.stringValue(vaultKeyId);\n\t\t\t\tif (decryptionEnabled) {\n\t\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\t\t\t\tContextIdHelper.guard(contextIds, ContextIdKeys.Organization);\n\n\t\t\t\t\tif (Is.empty(this._vaultConnector)) {\n\t\t\t\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"vaultConnectorNotConfigured\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturnBlob = await this._vaultConnector.decrypt(\n\t\t\t\t\t\t`${contextIds[ContextIdKeys.Organization]}/${vaultKeyId}`,\n\t\t\t\t\t\tVaultEncryptionType.ChaCha20Poly1305,\n\t\t\t\t\t\treturnBlob\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!Is.empty(blobEntry.compression) && (options?.decompress ?? true)) {\n\t\t\t\t\treturnBlob = await Compression.decompress(returnBlob, blobEntry.compression);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst jsonLd = this.entryToJsonLd(blobEntry, returnBlob);\n\t\t\tconst result = await JsonLdProcessor.compact(jsonLd, jsonLd[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Update the blob with metadata.\n\t * @param id The id of the blob entry to update.\n\t * @param encodingFormat Mime type for the blob, will be detected if left undefined.\n\t * @param fileExtension Extension for the blob, will be detected if left undefined.\n\t * @param metadata Data for the custom metadata as JSON-LD.\n\t * @returns Nothing.\n\t * @throws Not found error if the blob cannot be found.\n\t */\n\tpublic async update(\n\t\tid: string,\n\t\tencodingFormat?: string,\n\t\tfileExtension?: string,\n\t\tmetadata?: IJsonLdNodeObject\n\t): Promise<void> {\n\t\tUrn.guard(BlobStorageService.CLASS_NAME, nameof(id), id);\n\n\t\ttry {\n\t\t\tconst blobEntry = await this._entryEntityStorage.get(id);\n\n\t\t\tif (Is.undefined(blobEntry)) {\n\t\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"blobNotFound\", id);\n\t\t\t}\n\n\t\t\tif (Is.object(metadata)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(metadata, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tBlobStorageService.CLASS_NAME,\n\t\t\t\t\tnameof(metadata),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Now store the entry in entity storage\n\t\t\tconst updatedBlobEntry: BlobStorageEntry = {\n\t\t\t\tid: blobEntry.id,\n\t\t\t\tdateCreated: blobEntry.dateCreated,\n\t\t\t\tdateModified: new Date(Date.now()).toISOString(),\n\t\t\t\tblobSize: blobEntry.blobSize,\n\t\t\t\tintegrity: blobEntry.integrity,\n\t\t\t\tencodingFormat: encodingFormat ?? blobEntry.encodingFormat,\n\t\t\t\tfileExtension: fileExtension ?? blobEntry.fileExtension,\n\t\t\t\tmetadata: metadata ?? blobEntry.metadata,\n\t\t\t\tisEncrypted: blobEntry.isEncrypted,\n\t\t\t\tcompression: blobEntry.compression\n\t\t\t};\n\n\t\t\tawait this._entryEntityStorage.set(updatedBlobEntry);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"updateFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the blob.\n\t * @param id The id of the blob to remove in urn format.\n\t * @returns Nothing.\n\t */\n\tpublic async remove(id: string): Promise<void> {\n\t\tUrn.guard(BlobStorageService.CLASS_NAME, nameof(id), id);\n\n\t\ttry {\n\t\t\tconst blobStorageConnector = this.getConnector(id);\n\n\t\t\tawait this._entryEntityStorage.remove(id);\n\n\t\t\tconst removed = await blobStorageConnector.remove(id);\n\n\t\t\tif (!removed) {\n\t\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"blobNotFound\", id);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"removeFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Query all the blob storage entries which match the conditions.\n\t * @param conditions The conditions to match for the entries.\n\t * @param orderBy The order for the results, defaults to created.\n\t * @param orderByDirection The direction for the order, defaults to descending.\n\t * @param cursor The cursor to request the next page of entries.\n\t * @param limit The suggested number of entries to return in each chunk, in some scenarios can return a different amount.\n\t * @returns All the entries for the storage matching the conditions,\n\t * and a cursor which can be used to request more entities.\n\t */\n\tpublic async query(\n\t\tconditions?: EntityCondition<IBlobStorageEntry>,\n\t\torderBy?: keyof Pick<IBlobStorageEntry, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IBlobStorageEntryList;\n\t\tcursor?: string;\n\t}> {\n\t\tconst orderProperty = orderBy ?? \"dateCreated\";\n\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\n\t\tconst result = await this._entryEntityStorage.query(\n\t\t\tconditions,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: orderProperty,\n\t\t\t\t\tsortDirection: orderDirection\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tlet context: IBlobStorageEntryList[\"@context\"] = [\n\t\t\tSchemaOrgContexts.Context,\n\t\t\tBlobStorageContexts.Context,\n\t\t\tBlobStorageContexts.ContextCommon\n\t\t];\n\t\tconst entriesJsonLd = [];\n\n\t\tfor (const entry of result.entities) {\n\t\t\t// The entries are never Partial as we don't allow custom property requests.\n\t\t\tentriesJsonLd.push(this.entryToJsonLd(entry as BlobStorageEntry));\n\t\t\tcontext = JsonLdProcessor.combineContexts(\n\t\t\t\tcontext,\n\t\t\t\tentry.metadata?.[\"@context\"]\n\t\t\t) as IBlobStorageEntryList[\"@context\"];\n\t\t}\n\n\t\tconst jsonLd: IBlobStorageEntryList = {\n\t\t\t\"@context\": context,\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t[SchemaOrgTypes.ItemListElement]: entriesJsonLd\n\t\t};\n\n\t\treturn {\n\t\t\tentries: await JsonLdProcessor.compact(jsonLd, jsonLd[\"@context\"]),\n\t\t\tcursor: result.cursor\n\t\t};\n\t}\n\n\t/**\n\t * Get the connector from the uri.\n\t * @param id The id of the blob storage item in urn format.\n\t * @returns The connector.\n\t * @internal\n\t */\n\tprivate getConnector(id: string): IBlobStorageConnector {\n\t\tconst idUri = Urn.fromValidString(id);\n\n\t\tif (idUri.namespaceIdentifier() !== BlobStorageService._NAMESPACE) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: BlobStorageService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\treturn BlobStorageConnectorFactory.get<IBlobStorageConnector>(idUri.namespaceMethod());\n\t}\n\n\t/**\n\t * Get an entity.\n\t * @param id The id of the entity to get, or the index value if secondaryIndex is set.\n\t * @param secondaryIndex Get the item using a secondary index.\n\t * @param partitionKey The optional partition key to use.\n\t * @returns The object if it can be found or throws.\n\t * @internal\n\t */\n\tprivate async internalGet(id: string): Promise<BlobStorageEntry> {\n\t\tconst schema = this._entryEntityStorage.getSchema();\n\t\tconst primaryKey = EntitySchemaHelper.getPrimaryKey(schema);\n\n\t\tconst conditions: EntityCondition<BlobStorageEntry>[] = [\n\t\t\t{\n\t\t\t\tproperty: primaryKey.property,\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: id\n\t\t\t}\n\t\t];\n\n\t\tconst results = await this._entryEntityStorage.query(\n\t\t\t{\n\t\t\t\tconditions,\n\t\t\t\tlogicalOperator: LogicalOperator.And\n\t\t\t},\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t1\n\t\t);\n\n\t\tconst entity = results.entities[0] as BlobStorageEntry;\n\n\t\tif (Is.empty(entity)) {\n\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"entityNotFound\", id);\n\t\t}\n\n\t\treturn entity;\n\t}\n\n\t/**\n\t * Convert the entry to JSON-LD.\n\t * @param entry The entry to convert.\n\t * @param blob The optional blob to return.\n\t * @returns The JSON-LD representation of the entry.\n\t * @internal\n\t */\n\tprivate entryToJsonLd(entry: BlobStorageEntry, blob?: Uint8Array): IBlobStorageEntry {\n\t\tconst jsonLd: IBlobStorageEntry = {\n\t\t\t\"@context\": JsonLdProcessor.combineContexts(\n\t\t\t\t[BlobStorageContexts.Context, BlobStorageContexts.ContextCommon, SchemaOrgContexts.Context],\n\t\t\t\tentry?.metadata?.[\"@context\"]\n\t\t\t) as IBlobStorageEntry[\"@context\"],\n\t\t\tid: entry.id,\n\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\tdateCreated: entry.dateCreated,\n\t\t\tdateModified: entry.dateModified,\n\t\t\tblobSize: entry.blobSize,\n\t\t\tintegrity: entry.integrity,\n\t\t\tencodingFormat: entry?.encodingFormat,\n\t\t\tfileExtension: entry?.fileExtension,\n\t\t\tmetadata: entry?.metadata,\n\t\t\tblob: Is.uint8Array(blob) ? Converter.bytesToBase64(blob) : undefined,\n\t\t\tisEncrypted: entry.isEncrypted,\n\t\t\tcompression: entry.compression\n\t\t};\n\n\t\treturn jsonLd;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"blobStorageService.js","sourceRoot":"","sources":["../../src/blobStorageService.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport {\n\tBlobStorageConnectorFactory,\n\tBlobStorageContexts,\n\tBlobStorageTypes,\n\ttype BlobStorageCompressionType,\n\ttype IBlobStorageComponent,\n\ttype IBlobStorageConnector,\n\ttype IBlobStorageEntry,\n\ttype IBlobStorageEntryList\n} from \"@twin.org/blob-storage-models\";\nimport { ContextIdHelper, ContextIdKeys, ContextIdStore } from \"@twin.org/context\";\nimport {\n\tCompression,\n\tConverter,\n\tGeneralError,\n\tGuards,\n\tIs,\n\tNotFoundError,\n\tUrn,\n\tValidation,\n\ttype IValidationFailure\n} from \"@twin.org/core\";\nimport { IntegrityAlgorithm, IntegrityHelper } from \"@twin.org/crypto\";\nimport { JsonLdHelper, JsonLdProcessor, type IJsonLdNodeObject } from \"@twin.org/data-json-ld\";\nimport {\n\tComparisonOperator,\n\tEntitySchemaHelper,\n\tLogicalOperator,\n\tSortDirection,\n\ttype EntityCondition\n} from \"@twin.org/entity\";\nimport {\n\tEntityStorageConnectorFactory,\n\ttype IEntityStorageConnector\n} from \"@twin.org/entity-storage-models\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tSchemaOrgContexts,\n\tSchemaOrgDataTypes,\n\tSchemaOrgTypes\n} from \"@twin.org/standards-schema-org\";\nimport {\n\tVaultConnectorFactory,\n\tVaultEncryptionType,\n\ttype IVaultConnector\n} from \"@twin.org/vault-models\";\nimport { MimeTypeHelper } from \"@twin.org/web\";\nimport type { BlobStorageEntry } from \"./entities/blobStorageEntry.js\";\nimport type { IBlobStorageServiceConstructorOptions } from \"./models/IBlobStorageServiceConstructorOptions.js\";\n\n/**\n * Service for performing blob storage operations to a connector.\n */\nexport class BlobStorageService implements IBlobStorageComponent {\n\t/**\n\t * Runtime name for the class.\n\t */\n\tpublic static readonly CLASS_NAME: string = nameof<BlobStorageService>();\n\n\t/**\n\t * The namespace supported by the blob storage service.\n\t * @internal\n\t */\n\tprivate static readonly _NAMESPACE: string = \"blob\";\n\n\t/**\n\t * The namespace of the default storage connector to use.\n\t * Defaults to the first entry in the factory if not provided.\n\t * @internal\n\t */\n\tprivate readonly _defaultNamespace: string;\n\n\t/**\n\t * The storage connector for the metadata.\n\t * @internal\n\t */\n\tprivate readonly _entryEntityStorage: IEntityStorageConnector<BlobStorageEntry>;\n\n\t/**\n\t * The vault connector for the encryption, can be undefined if no encryption required.\n\t * @internal\n\t */\n\tprivate readonly _vaultConnector?: IVaultConnector;\n\n\t/**\n\t * The id of the vault key to use for encryption if the service has a vault connector configured.\n\t * @internal\n\t */\n\tprivate readonly _vaultKeyId: string | undefined;\n\n\t/**\n\t * Create a new instance of BlobStorageService.\n\t * @param options The options for the service.\n\t */\n\tconstructor(options?: IBlobStorageServiceConstructorOptions) {\n\t\tconst names = BlobStorageConnectorFactory.names();\n\t\tif (names.length === 0) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"noConnectors\");\n\t\t}\n\n\t\tthis._entryEntityStorage = EntityStorageConnectorFactory.get(\n\t\t\toptions?.entryEntityStorageType ?? \"blob-storage-entry\"\n\t\t);\n\t\tif (Is.stringValue(options?.vaultConnectorType)) {\n\t\t\tthis._vaultConnector = VaultConnectorFactory.get(options.vaultConnectorType);\n\t\t}\n\n\t\tthis._defaultNamespace = options?.config?.defaultNamespace ?? names[0];\n\t\tthis._vaultKeyId = options?.config?.vaultKeyId;\n\n\t\tSchemaOrgDataTypes.registerRedirects();\n\t}\n\n\t/**\n\t * Returns the class name of the component.\n\t * @returns The class name of the component.\n\t */\n\tpublic className(): string {\n\t\treturn BlobStorageService.CLASS_NAME;\n\t}\n\n\t/**\n\t * Create the blob with some metadata.\n\t * @param blob The data for the blob in base64 format.\n\t * @param encodingFormat Mime type for the blob, will be detected if left undefined.\n\t * @param fileExtension Extension for the blob, will be detected if left undefined.\n\t * @param metadata Data for the custom metadata as JSON-LD.\n\t * @param options Optional options for the creation of the blob.\n\t * @param options.disableEncryption Disables encryption if enabled by default.\n\t * @param options.overrideVaultKeyId Use a different vault key id for encryption, if not provided the default vault key id will be used.\n\t * @param options.compress Optional compression type to use for the blob, defaults to no compression.\n\t * @param options.namespace The namespace to use for storing, defaults to component configured namespace.\n\t * @returns The id of the stored blob in urn format.\n\t */\n\tpublic async create(\n\t\tblob: string,\n\t\tencodingFormat?: string,\n\t\tfileExtension?: string,\n\t\tmetadata?: IJsonLdNodeObject,\n\t\toptions?: {\n\t\t\tdisableEncryption?: boolean;\n\t\t\toverrideVaultKeyId?: string;\n\t\t\tcompress?: BlobStorageCompressionType;\n\t\t\tnamespace?: string;\n\t\t}\n\t): Promise<string> {\n\t\tGuards.stringBase64(BlobStorageService.CLASS_NAME, nameof(blob), blob);\n\n\t\tconst disableEncryption = options?.disableEncryption ?? false;\n\t\tconst vaultKeyId = options?.overrideVaultKeyId ?? this._vaultKeyId;\n\t\tconst encryptionEnabled = !disableEncryption && Is.stringValue(vaultKeyId);\n\n\t\ttry {\n\t\t\tconst connectorNamespace = options?.namespace ?? this._defaultNamespace;\n\n\t\t\tconst blobStorageConnector =\n\t\t\t\tBlobStorageConnectorFactory.get<IBlobStorageConnector>(connectorNamespace);\n\n\t\t\t// Convert the base64 data into bytes\n\t\t\tlet storeBlob = Converter.base64ToBytes(blob);\n\t\t\tconst blobSize = storeBlob.length;\n\n\t\t\t// See if we can detect the mime type and default extension for the data.\n\t\t\t// If not already supplied by the caller. We have to perform this operation\n\t\t\t// on the unencrypted data.\n\t\t\tif (!Is.stringValue(encodingFormat)) {\n\t\t\t\tencodingFormat = await MimeTypeHelper.detect(storeBlob);\n\t\t\t}\n\n\t\t\tif (!Is.stringValue(fileExtension) && Is.stringValue(encodingFormat)) {\n\t\t\t\tfileExtension = MimeTypeHelper.defaultExtension(encodingFormat);\n\t\t\t}\n\n\t\t\tif (Is.object(metadata)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(metadata, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tBlobStorageService.CLASS_NAME,\n\t\t\t\t\tnameof(metadata),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst integrity = IntegrityHelper.generate(IntegrityAlgorithm.Sha256, storeBlob);\n\n\t\t\tif (!Is.empty(options?.compress)) {\n\t\t\t\tstoreBlob = await Compression.compress(storeBlob, options.compress);\n\t\t\t}\n\n\t\t\t// If we have a vault connector then encrypt the data.\n\t\t\tif (encryptionEnabled) {\n\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\t\t\tContextIdHelper.guard(contextIds, ContextIdKeys.Organization);\n\n\t\t\t\tif (Is.empty(this._vaultConnector)) {\n\t\t\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"vaultConnectorNotConfigured\");\n\t\t\t\t}\n\t\t\t\tstoreBlob = await this._vaultConnector.encrypt(\n\t\t\t\t\t`${contextIds[ContextIdKeys.Organization]}/${vaultKeyId}`,\n\t\t\t\t\tVaultEncryptionType.ChaCha20Poly1305,\n\t\t\t\t\tstoreBlob\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Set the blob in the storage connector, which may now be encrypted\n\t\t\tconst blobId = await blobStorageConnector.set(storeBlob);\n\n\t\t\t// Now store the entry in entity storage\n\t\t\tconst blobEntry: BlobStorageEntry = {\n\t\t\t\tid: blobId,\n\t\t\t\tdateCreated: new Date(Date.now()).toISOString(),\n\t\t\t\tblobSize,\n\t\t\t\tintegrity,\n\t\t\t\tencodingFormat,\n\t\t\t\tfileExtension,\n\t\t\t\tmetadata,\n\t\t\t\tisEncrypted: encryptionEnabled,\n\t\t\t\tcompression: options?.compress\n\t\t\t};\n\n\t\t\tawait this._entryEntityStorage.set(blobEntry);\n\n\t\t\treturn blobId;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"createFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Get the blob entry.\n\t * @param id The id of the blob to get in urn format.\n\t * @param options Optional options for the retrieval of the blob.\n\t * @param options.includeContent Include the content, or just get the metadata.\n\t * @param options.overrideVaultKeyId Use a different vault key id for decryption, if not provided the default vault key id will be used.\n\t * @param options.decompress If the content should be decompressed, if it was compressed when stored, defaults to true.\n\t * @returns The entry and data for the blob if it can be found.\n\t * @throws Not found error if the blob cannot be found.\n\t */\n\tpublic async get(\n\t\tid: string,\n\t\toptions?: {\n\t\t\tincludeContent?: boolean;\n\t\t\tdecompress?: boolean;\n\t\t\toverrideVaultKeyId?: string;\n\t\t}\n\t): Promise<IBlobStorageEntry> {\n\t\tUrn.guard(BlobStorageService.CLASS_NAME, nameof(id), id);\n\n\t\tconst includeContent = options?.includeContent ?? false;\n\t\tconst vaultKeyId = options?.overrideVaultKeyId ?? this._vaultKeyId;\n\n\t\ttry {\n\t\t\tconst blobEntry = await this.internalGet(id);\n\n\t\t\tlet returnBlob: Uint8Array | undefined;\n\t\t\tif (includeContent) {\n\t\t\t\tconst blobStorageConnector = this.getConnector(id);\n\t\t\t\treturnBlob = await blobStorageConnector.get(id);\n\t\t\t\tif (Is.undefined(returnBlob)) {\n\t\t\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"blobNotFound\", id);\n\t\t\t\t}\n\n\t\t\t\t// If the data is encrypted then decrypt it.\n\t\t\t\tconst decryptionEnabled = blobEntry.isEncrypted && Is.stringValue(vaultKeyId);\n\t\t\t\tif (decryptionEnabled) {\n\t\t\t\t\tconst contextIds = await ContextIdStore.getContextIds();\n\t\t\t\t\tContextIdHelper.guard(contextIds, ContextIdKeys.Organization);\n\n\t\t\t\t\tif (Is.empty(this._vaultConnector)) {\n\t\t\t\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"vaultConnectorNotConfigured\");\n\t\t\t\t\t}\n\n\t\t\t\t\treturnBlob = await this._vaultConnector.decrypt(\n\t\t\t\t\t\t`${contextIds[ContextIdKeys.Organization]}/${vaultKeyId}`,\n\t\t\t\t\t\tVaultEncryptionType.ChaCha20Poly1305,\n\t\t\t\t\t\treturnBlob\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (!Is.empty(blobEntry.compression) && (options?.decompress ?? true)) {\n\t\t\t\t\treturnBlob = await Compression.decompress(returnBlob, blobEntry.compression);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst jsonLd = this.entryToJsonLd(blobEntry, returnBlob);\n\t\t\tconst result = await JsonLdProcessor.compact(jsonLd, jsonLd[\"@context\"]);\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"getFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Update the blob with metadata.\n\t * @param id The id of the blob entry to update.\n\t * @param encodingFormat Mime type for the blob, will be detected if left undefined.\n\t * @param fileExtension Extension for the blob, will be detected if left undefined.\n\t * @param metadata Data for the custom metadata as JSON-LD.\n\t * @returns Nothing.\n\t * @throws Not found error if the blob cannot be found.\n\t */\n\tpublic async update(\n\t\tid: string,\n\t\tencodingFormat?: string,\n\t\tfileExtension?: string,\n\t\tmetadata?: IJsonLdNodeObject\n\t): Promise<void> {\n\t\tUrn.guard(BlobStorageService.CLASS_NAME, nameof(id), id);\n\n\t\ttry {\n\t\t\tconst blobEntry = await this._entryEntityStorage.get(id);\n\n\t\t\tif (Is.undefined(blobEntry)) {\n\t\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"blobNotFound\", id);\n\t\t\t}\n\n\t\t\tif (Is.object(metadata)) {\n\t\t\t\tconst validationFailures: IValidationFailure[] = [];\n\t\t\t\tawait JsonLdHelper.validate(metadata, validationFailures);\n\t\t\t\tValidation.asValidationError(\n\t\t\t\t\tBlobStorageService.CLASS_NAME,\n\t\t\t\t\tnameof(metadata),\n\t\t\t\t\tvalidationFailures\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Now store the entry in entity storage\n\t\t\tconst updatedBlobEntry: BlobStorageEntry = {\n\t\t\t\tid: blobEntry.id,\n\t\t\t\tdateCreated: blobEntry.dateCreated,\n\t\t\t\tdateModified: new Date(Date.now()).toISOString(),\n\t\t\t\tblobSize: blobEntry.blobSize,\n\t\t\t\tintegrity: blobEntry.integrity,\n\t\t\t\tencodingFormat: encodingFormat ?? blobEntry.encodingFormat,\n\t\t\t\tfileExtension: fileExtension ?? blobEntry.fileExtension,\n\t\t\t\tmetadata: metadata ?? blobEntry.metadata,\n\t\t\t\tisEncrypted: blobEntry.isEncrypted,\n\t\t\t\tcompression: blobEntry.compression\n\t\t\t};\n\n\t\t\tawait this._entryEntityStorage.set(updatedBlobEntry);\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"updateFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Remove all blobs from the storage.\n\t * @returns Nothing.\n\t */\n\tpublic async empty(): Promise<void> {\n\t\ttry {\n\t\t\tlet moreData = true;\n\t\t\twhile (moreData) {\n\t\t\t\tconst result = await this._entryEntityStorage.query(\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\t100\n\t\t\t\t);\n\n\t\t\t\tif (result.entities.length === 0) {\n\t\t\t\t\tmoreData = false;\n\t\t\t\t} else {\n\t\t\t\t\tfor (const entity of result.entities) {\n\t\t\t\t\t\tconst entry = entity as BlobStorageEntry;\n\t\t\t\t\t\tconst blobStorageConnector = this.getConnector(entry.id);\n\t\t\t\t\t\tawait blobStorageConnector.remove(entry.id);\n\t\t\t\t\t\tawait this._entryEntityStorage.remove(entry.id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"emptyFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Remove the blob.\n\t * @param id The id of the blob to remove in urn format.\n\t * @returns Nothing.\n\t */\n\tpublic async remove(id: string): Promise<void> {\n\t\tUrn.guard(BlobStorageService.CLASS_NAME, nameof(id), id);\n\n\t\ttry {\n\t\t\tconst blobStorageConnector = this.getConnector(id);\n\n\t\t\tawait this._entryEntityStorage.remove(id);\n\n\t\t\tconst removed = await blobStorageConnector.remove(id);\n\n\t\t\tif (!removed) {\n\t\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"blobNotFound\", id);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"removeFailed\", undefined, error);\n\t\t}\n\t}\n\n\t/**\n\t * Query all the blob storage entries which match the conditions.\n\t * @param conditions The conditions to match for the entries.\n\t * @param orderBy The order for the results, defaults to created.\n\t * @param orderByDirection The direction for the order, defaults to descending.\n\t * @param cursor The cursor to request the next page of entries.\n\t * @param limit The suggested number of entries to return in each chunk, in some scenarios can return a different amount.\n\t * @returns All the entries for the storage matching the conditions,\n\t * and a cursor which can be used to request more entities.\n\t */\n\tpublic async query(\n\t\tconditions?: EntityCondition<IBlobStorageEntry>,\n\t\torderBy?: keyof Pick<IBlobStorageEntry, \"dateCreated\" | \"dateModified\">,\n\t\torderByDirection?: SortDirection,\n\t\tcursor?: string,\n\t\tlimit?: number\n\t): Promise<{\n\t\tentries: IBlobStorageEntryList;\n\t\tcursor?: string;\n\t}> {\n\t\tconst orderProperty = orderBy ?? \"dateCreated\";\n\t\tconst orderDirection = orderByDirection ?? SortDirection.Descending;\n\n\t\tconst result = await this._entryEntityStorage.query(\n\t\t\tconditions,\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tproperty: orderProperty,\n\t\t\t\t\tsortDirection: orderDirection\n\t\t\t\t}\n\t\t\t],\n\t\t\tundefined,\n\t\t\tcursor,\n\t\t\tlimit\n\t\t);\n\n\t\tlet context: IBlobStorageEntryList[\"@context\"] = [\n\t\t\tSchemaOrgContexts.Context,\n\t\t\tBlobStorageContexts.Context,\n\t\t\tBlobStorageContexts.ContextCommon\n\t\t];\n\t\tconst entriesJsonLd = [];\n\n\t\tfor (const entry of result.entities) {\n\t\t\t// The entries are never Partial as we don't allow custom property requests.\n\t\t\tentriesJsonLd.push(this.entryToJsonLd(entry as BlobStorageEntry));\n\t\t\tcontext = JsonLdProcessor.combineContexts(\n\t\t\t\tcontext,\n\t\t\t\tentry.metadata?.[\"@context\"]\n\t\t\t) as IBlobStorageEntryList[\"@context\"];\n\t\t}\n\n\t\tconst jsonLd: IBlobStorageEntryList = {\n\t\t\t\"@context\": context,\n\t\t\ttype: SchemaOrgTypes.ItemList,\n\t\t\t[SchemaOrgTypes.ItemListElement]: entriesJsonLd\n\t\t};\n\n\t\treturn {\n\t\t\tentries: await JsonLdProcessor.compact(jsonLd, jsonLd[\"@context\"]),\n\t\t\tcursor: result.cursor\n\t\t};\n\t}\n\n\t/**\n\t * Get the connector from the uri.\n\t * @param id The id of the blob storage item in urn format.\n\t * @returns The connector.\n\t * @internal\n\t */\n\tprivate getConnector(id: string): IBlobStorageConnector {\n\t\tconst idUri = Urn.fromValidString(id);\n\n\t\tif (idUri.namespaceIdentifier() !== BlobStorageService._NAMESPACE) {\n\t\t\tthrow new GeneralError(BlobStorageService.CLASS_NAME, \"namespaceMismatch\", {\n\t\t\t\tnamespace: BlobStorageService._NAMESPACE,\n\t\t\t\tid\n\t\t\t});\n\t\t}\n\n\t\treturn BlobStorageConnectorFactory.get<IBlobStorageConnector>(idUri.namespaceMethod());\n\t}\n\n\t/**\n\t * Get an entity.\n\t * @param id The id of the entity to get, or the index value if secondaryIndex is set.\n\t * @param secondaryIndex Get the item using a secondary index.\n\t * @param partitionKey The optional partition key to use.\n\t * @returns The object if it can be found or throws.\n\t * @internal\n\t */\n\tprivate async internalGet(id: string): Promise<BlobStorageEntry> {\n\t\tconst schema = this._entryEntityStorage.getSchema();\n\t\tconst primaryKey = EntitySchemaHelper.getPrimaryKey(schema);\n\n\t\tconst conditions: EntityCondition<BlobStorageEntry>[] = [\n\t\t\t{\n\t\t\t\tproperty: primaryKey.property,\n\t\t\t\tcomparison: ComparisonOperator.Equals,\n\t\t\t\tvalue: id\n\t\t\t}\n\t\t];\n\n\t\tconst results = await this._entryEntityStorage.query(\n\t\t\t{\n\t\t\t\tconditions,\n\t\t\t\tlogicalOperator: LogicalOperator.And\n\t\t\t},\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\t1\n\t\t);\n\n\t\tconst entity = results.entities[0] as BlobStorageEntry;\n\n\t\tif (Is.empty(entity)) {\n\t\t\tthrow new NotFoundError(BlobStorageService.CLASS_NAME, \"entityNotFound\", id);\n\t\t}\n\n\t\treturn entity;\n\t}\n\n\t/**\n\t * Convert the entry to JSON-LD.\n\t * @param entry The entry to convert.\n\t * @param blob The optional blob to return.\n\t * @returns The JSON-LD representation of the entry.\n\t * @internal\n\t */\n\tprivate entryToJsonLd(entry: BlobStorageEntry, blob?: Uint8Array): IBlobStorageEntry {\n\t\tconst jsonLd: IBlobStorageEntry = {\n\t\t\t\"@context\": JsonLdProcessor.combineContexts(\n\t\t\t\t[BlobStorageContexts.Context, BlobStorageContexts.ContextCommon, SchemaOrgContexts.Context],\n\t\t\t\tentry?.metadata?.[\"@context\"]\n\t\t\t) as IBlobStorageEntry[\"@context\"],\n\t\t\tid: entry.id,\n\t\t\ttype: BlobStorageTypes.Entry,\n\t\t\tdateCreated: entry.dateCreated,\n\t\t\tdateModified: entry.dateModified,\n\t\t\tblobSize: entry.blobSize,\n\t\t\tintegrity: entry.integrity,\n\t\t\tencodingFormat: entry?.encodingFormat,\n\t\t\tfileExtension: entry?.fileExtension,\n\t\t\tmetadata: entry?.metadata,\n\t\t\tblob: Is.uint8Array(blob) ? Converter.bytesToBase64(blob) : undefined,\n\t\t\tisEncrypted: entry.isEncrypted,\n\t\t\tcompression: entry.compression\n\t\t};\n\n\t\treturn jsonLd;\n\t}\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type ICreatedResponse, type IHttpRequestContext, type INoContentResponse, type IRestRoute, type IRestRouteResponseOptions, type ITag } from "@twin.org/api-models";
|
|
2
|
-
import { type IBlobStorageCreateRequest, type IBlobStorageGetContentRequest, type IBlobStorageGetContentResponse, type IBlobStorageGetRequest, type IBlobStorageGetResponse, type IBlobStorageListRequest, type IBlobStorageListResponse, type IBlobStorageRemoveRequest, type IBlobStorageUpdateRequest } from "@twin.org/blob-storage-models";
|
|
2
|
+
import { type IBlobStorageCreateRequest, type IBlobStorageGetContentRequest, type IBlobStorageGetContentResponse, type IBlobStorageGetRequest, type IBlobStorageGetResponse, type IBlobStorageEmptyRequest, type IBlobStorageListRequest, type IBlobStorageListResponse, type IBlobStorageRemoveRequest, type IBlobStorageUpdateRequest } from "@twin.org/blob-storage-models";
|
|
3
3
|
/**
|
|
4
4
|
* The tag to associate with the routes.
|
|
5
5
|
*/
|
|
@@ -57,6 +57,14 @@ export declare function blobStorageUpdate(httpRequestContext: IHttpRequestContex
|
|
|
57
57
|
* @returns The response object with additional http response properties.
|
|
58
58
|
*/
|
|
59
59
|
export declare function blobStorageRemove(httpRequestContext: IHttpRequestContext, componentName: string, request: IBlobStorageRemoveRequest): Promise<INoContentResponse>;
|
|
60
|
+
/**
|
|
61
|
+
* Remove all entries from blob storage.
|
|
62
|
+
* @param httpRequestContext The request context for the API.
|
|
63
|
+
* @param componentName The name of the component to use in the routes.
|
|
64
|
+
* @param request The request.
|
|
65
|
+
* @returns The response object with additional http response properties.
|
|
66
|
+
*/
|
|
67
|
+
export declare function blobStorageEmpty(httpRequestContext: IHttpRequestContext, componentName: string, request: IBlobStorageEmptyRequest): Promise<INoContentResponse>;
|
|
60
68
|
/**
|
|
61
69
|
* List the entries from blob storage.
|
|
62
70
|
* @param httpRequestContext The request context for the API.
|
|
@@ -64,6 +64,11 @@ export declare class BlobStorageService implements IBlobStorageComponent {
|
|
|
64
64
|
* @throws Not found error if the blob cannot be found.
|
|
65
65
|
*/
|
|
66
66
|
update(id: string, encodingFormat?: string, fileExtension?: string, metadata?: IJsonLdNodeObject): Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Remove all blobs from the storage.
|
|
69
|
+
* @returns Nothing.
|
|
70
|
+
*/
|
|
71
|
+
empty(): Promise<void>;
|
|
67
72
|
/**
|
|
68
73
|
* Remove the blob.
|
|
69
74
|
* @param id The id of the blob to remove in urn format.
|
package/docs/changelog.md
CHANGED
|
@@ -1,5 +1,37 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.0.3-next.12](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-service-v0.0.3-next.11...blob-storage-service-v0.0.3-next.12) (2026-05-11)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Features
|
|
7
|
+
|
|
8
|
+
* typescript 6 update ([4eed54f](https://github.com/iotaledger/twin-blob-storage/commit/4eed54f5ce2dc697c06597269c97ad4cad108be5))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Dependencies
|
|
12
|
+
|
|
13
|
+
* The following workspace dependencies were updated
|
|
14
|
+
* dependencies
|
|
15
|
+
* @twin.org/blob-storage-models bumped from 0.0.3-next.11 to 0.0.3-next.12
|
|
16
|
+
* devDependencies
|
|
17
|
+
* @twin.org/blob-storage-connector-memory bumped from 0.0.3-next.11 to 0.0.3-next.12
|
|
18
|
+
|
|
19
|
+
## [0.0.3-next.11](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-service-v0.0.3-next.10...blob-storage-service-v0.0.3-next.11) (2026-05-08)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
### Features
|
|
23
|
+
|
|
24
|
+
* add empty and teardown methods ([#49](https://github.com/iotaledger/twin-blob-storage/issues/49)) ([cec6248](https://github.com/iotaledger/twin-blob-storage/commit/cec624809ffd2f2baa4b7b8cbf72a7247b8703ed))
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
### Dependencies
|
|
28
|
+
|
|
29
|
+
* The following workspace dependencies were updated
|
|
30
|
+
* dependencies
|
|
31
|
+
* @twin.org/blob-storage-models bumped from 0.0.3-next.10 to 0.0.3-next.11
|
|
32
|
+
* devDependencies
|
|
33
|
+
* @twin.org/blob-storage-connector-memory bumped from 0.0.3-next.10 to 0.0.3-next.11
|
|
34
|
+
|
|
3
35
|
## [0.0.3-next.10](https://github.com/iotaledger/twin-blob-storage/compare/blob-storage-service-v0.0.3-next.9...blob-storage-service-v0.0.3-next.10) (2026-05-07)
|
|
4
36
|
|
|
5
37
|
|
package/docs/open-api/spec.json
CHANGED
|
@@ -127,6 +127,91 @@
|
|
|
127
127
|
}
|
|
128
128
|
}
|
|
129
129
|
},
|
|
130
|
+
"delete": {
|
|
131
|
+
"operationId": "blobStorageEmpty",
|
|
132
|
+
"summary": "Remove all entries from blob storage",
|
|
133
|
+
"tags": [
|
|
134
|
+
"Blob Storage"
|
|
135
|
+
],
|
|
136
|
+
"security": [
|
|
137
|
+
{
|
|
138
|
+
"jwtBearerAuthScheme": []
|
|
139
|
+
}
|
|
140
|
+
],
|
|
141
|
+
"requestBody": {
|
|
142
|
+
"description": "Request to remove all entries from blob storage.",
|
|
143
|
+
"required": true,
|
|
144
|
+
"content": {
|
|
145
|
+
"text/plain": {
|
|
146
|
+
"schema": {
|
|
147
|
+
"$ref": "#/components/schemas/BlobStorageEmptyRequest"
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
"responses": {
|
|
153
|
+
"204": {
|
|
154
|
+
"description": "The rest request ended in success with no data."
|
|
155
|
+
},
|
|
156
|
+
"400": {
|
|
157
|
+
"description": "The server cannot process the request, see the content for more details.",
|
|
158
|
+
"content": {
|
|
159
|
+
"application/json": {
|
|
160
|
+
"schema": {
|
|
161
|
+
"$ref": "#/components/schemas/Error"
|
|
162
|
+
},
|
|
163
|
+
"examples": {
|
|
164
|
+
"exampleResponse": {
|
|
165
|
+
"value": {
|
|
166
|
+
"name": "GeneralError",
|
|
167
|
+
"message": "errorMessage",
|
|
168
|
+
"properties": {
|
|
169
|
+
"foo": "bar"
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
},
|
|
177
|
+
"401": {
|
|
178
|
+
"description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
|
|
179
|
+
"content": {
|
|
180
|
+
"application/json": {
|
|
181
|
+
"schema": {
|
|
182
|
+
"$ref": "#/components/schemas/Error"
|
|
183
|
+
},
|
|
184
|
+
"examples": {
|
|
185
|
+
"exampleResponse": {
|
|
186
|
+
"value": {
|
|
187
|
+
"name": "UnauthorizedError",
|
|
188
|
+
"message": "errorMessage"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
"500": {
|
|
196
|
+
"description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
|
|
197
|
+
"content": {
|
|
198
|
+
"application/json": {
|
|
199
|
+
"schema": {
|
|
200
|
+
"$ref": "#/components/schemas/Error"
|
|
201
|
+
},
|
|
202
|
+
"examples": {
|
|
203
|
+
"exampleResponse": {
|
|
204
|
+
"value": {
|
|
205
|
+
"name": "InternalServerError",
|
|
206
|
+
"message": "errorMessage"
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
},
|
|
130
215
|
"get": {
|
|
131
216
|
"operationId": "blobStorageQuery",
|
|
132
217
|
"summary": "Query the items from blob storage",
|
|
@@ -967,6 +1052,10 @@
|
|
|
967
1052
|
],
|
|
968
1053
|
"description": "The body parameters."
|
|
969
1054
|
},
|
|
1055
|
+
"BlobStorageEmptyRequest": {
|
|
1056
|
+
"description": "Request to remove all entries from blob storage.",
|
|
1057
|
+
"type": "object"
|
|
1058
|
+
},
|
|
970
1059
|
"BlobStorageEntry": {
|
|
971
1060
|
"description": "Interface describing a blob storage entry.",
|
|
972
1061
|
"type": "object",
|
|
@@ -226,6 +226,24 @@ Not found error if the blob cannot be found.
|
|
|
226
226
|
|
|
227
227
|
***
|
|
228
228
|
|
|
229
|
+
### empty() {#empty}
|
|
230
|
+
|
|
231
|
+
> **empty**(): `Promise`\<`void`\>
|
|
232
|
+
|
|
233
|
+
Remove all blobs from the storage.
|
|
234
|
+
|
|
235
|
+
#### Returns
|
|
236
|
+
|
|
237
|
+
`Promise`\<`void`\>
|
|
238
|
+
|
|
239
|
+
Nothing.
|
|
240
|
+
|
|
241
|
+
#### Implementation of
|
|
242
|
+
|
|
243
|
+
`IBlobStorageComponent.empty`
|
|
244
|
+
|
|
245
|
+
***
|
|
246
|
+
|
|
229
247
|
### remove() {#remove}
|
|
230
248
|
|
|
231
249
|
> **remove**(`id`): `Promise`\<`void`\>
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Function: blobStorageEmpty()
|
|
2
|
+
|
|
3
|
+
> **blobStorageEmpty**(`httpRequestContext`, `componentName`, `request`): `Promise`\<`INoContentResponse`\>
|
|
4
|
+
|
|
5
|
+
Remove all entries from blob storage.
|
|
6
|
+
|
|
7
|
+
## Parameters
|
|
8
|
+
|
|
9
|
+
### httpRequestContext
|
|
10
|
+
|
|
11
|
+
`IHttpRequestContext`
|
|
12
|
+
|
|
13
|
+
The request context for the API.
|
|
14
|
+
|
|
15
|
+
### componentName
|
|
16
|
+
|
|
17
|
+
`string`
|
|
18
|
+
|
|
19
|
+
The name of the component to use in the routes.
|
|
20
|
+
|
|
21
|
+
### request
|
|
22
|
+
|
|
23
|
+
`IBlobStorageEmptyRequest`
|
|
24
|
+
|
|
25
|
+
The request.
|
|
26
|
+
|
|
27
|
+
## Returns
|
|
28
|
+
|
|
29
|
+
`Promise`\<`INoContentResponse`\>
|
|
30
|
+
|
|
31
|
+
The response object with additional http response properties.
|
package/docs/reference/index.md
CHANGED
|
@@ -23,5 +23,6 @@
|
|
|
23
23
|
- [blobStorageGetContent](functions/blobStorageGetContent.md)
|
|
24
24
|
- [blobStorageUpdate](functions/blobStorageUpdate.md)
|
|
25
25
|
- [blobStorageRemove](functions/blobStorageRemove.md)
|
|
26
|
+
- [blobStorageEmpty](functions/blobStorageEmpty.md)
|
|
26
27
|
- [blobStorageList](functions/blobStorageList.md)
|
|
27
28
|
- [initSchema](functions/initSchema.md)
|
package/locales/en.json
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"getFailed": "There was a problem getting the blob",
|
|
7
7
|
"updateFailed": "There was a problem updating the blob",
|
|
8
8
|
"removeFailed": "There was a problem removing the blob",
|
|
9
|
+
"emptyFailed": "There was a problem emptying the blob storage",
|
|
9
10
|
"namespaceMismatch": "The namespace in the urn \"{id}\" does not match the namespace of the blob storage service \"{namespace}\"",
|
|
10
11
|
"vaultConnectorNotConfigured": "The vault connector is not configured, but encryption/decryption was requested.",
|
|
11
12
|
"blobNotFound": "The blob with id \"{notFoundId}\" was not found",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@twin.org/blob-storage-service",
|
|
3
|
-
"version": "0.0.3-next.
|
|
3
|
+
"version": "0.0.3-next.12",
|
|
4
4
|
"description": "Exposes blob operations through service components and HTTP route definitions.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@twin.org/api-models": "next",
|
|
18
|
-
"@twin.org/blob-storage-models": "0.0.3-next.
|
|
18
|
+
"@twin.org/blob-storage-models": "0.0.3-next.12",
|
|
19
19
|
"@twin.org/context": "next",
|
|
20
20
|
"@twin.org/core": "next",
|
|
21
21
|
"@twin.org/crypto": "next",
|