@twin.org/blob-storage-service 0.0.3-next.1 → 0.0.3-next.10
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/README.md +1 -1
- package/dist/es/blobStorageRoutes.js +36 -31
- package/dist/es/blobStorageRoutes.js.map +1 -1
- package/dist/es/blobStorageService.js +14 -16
- package/dist/es/blobStorageService.js.map +1 -1
- package/dist/es/entities/blobStorageEntry.js +3 -3
- package/dist/es/entities/blobStorageEntry.js.map +1 -1
- package/dist/types/blobStorageService.d.ts +4 -1
- package/dist/types/entities/blobStorageEntry.d.ts +2 -2
- package/docs/changelog.md +229 -52
- package/docs/examples.md +109 -1
- package/docs/open-api/spec.json +504 -102
- package/docs/reference/classes/BlobStorageEntry.md +17 -17
- package/docs/reference/classes/BlobStorageService.md +11 -11
- package/docs/reference/interfaces/IBlobStorageServiceConfig.md +4 -4
- package/docs/reference/interfaces/IBlobStorageServiceConstructorOptions.md +6 -6
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TWIN Blob Storage Service
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
This package exposes service-side components and endpoint definitions for blob upload, retrieval, and management operations. It bridges shared blob models with application service layers so APIs can be published with consistent behaviour.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -4,7 +4,7 @@ import { HttpParameterHelper } from "@twin.org/api-models";
|
|
|
4
4
|
import { BlobStorageCompressionType, BlobStorageContexts, BlobStorageTypes } from "@twin.org/blob-storage-models";
|
|
5
5
|
import { Coerce, ComponentFactory, Converter, Guards, Is, StringHelper } from "@twin.org/core";
|
|
6
6
|
import { SchemaOrgContexts, SchemaOrgTypes } from "@twin.org/standards-schema-org";
|
|
7
|
-
import { HeaderTypes, HttpStatusCode, MimeTypeHelper, MimeTypes } from "@twin.org/web";
|
|
7
|
+
import { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypeHelper, MimeTypes } from "@twin.org/web";
|
|
8
8
|
/**
|
|
9
9
|
* The source used when communicating about these routes.
|
|
10
10
|
*/
|
|
@@ -105,16 +105,16 @@ export function generateRestRoutesBlobStorage(baseRouteName, componentName, opti
|
|
|
105
105
|
response: {
|
|
106
106
|
body: {
|
|
107
107
|
"@context": [
|
|
108
|
-
BlobStorageContexts.
|
|
109
|
-
BlobStorageContexts.
|
|
110
|
-
SchemaOrgContexts.
|
|
108
|
+
BlobStorageContexts.Context,
|
|
109
|
+
BlobStorageContexts.ContextCommon,
|
|
110
|
+
SchemaOrgContexts.Context
|
|
111
111
|
],
|
|
112
112
|
type: BlobStorageTypes.Entry,
|
|
113
113
|
id: "blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70",
|
|
114
114
|
dateCreated: "2024-01-01T00:00:00Z",
|
|
115
115
|
encodingFormat: MimeTypes.Pdf,
|
|
116
116
|
blobSize: 42,
|
|
117
|
-
|
|
117
|
+
integrity: "sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=",
|
|
118
118
|
fileExtension: "pdf",
|
|
119
119
|
metadata: {
|
|
120
120
|
"@context": "https://schema.org",
|
|
@@ -136,16 +136,16 @@ export function generateRestRoutesBlobStorage(baseRouteName, componentName, opti
|
|
|
136
136
|
response: {
|
|
137
137
|
body: {
|
|
138
138
|
"@context": [
|
|
139
|
-
BlobStorageContexts.
|
|
140
|
-
BlobStorageContexts.
|
|
141
|
-
SchemaOrgContexts.
|
|
139
|
+
BlobStorageContexts.Context,
|
|
140
|
+
BlobStorageContexts.ContextCommon,
|
|
141
|
+
SchemaOrgContexts.Context
|
|
142
142
|
],
|
|
143
143
|
type: BlobStorageTypes.Entry,
|
|
144
144
|
id: "blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70",
|
|
145
145
|
dateCreated: "2024-01-01T00:00:00Z",
|
|
146
146
|
encodingFormat: MimeTypes.Pdf,
|
|
147
147
|
blobSize: 42,
|
|
148
|
-
|
|
148
|
+
integrity: "sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=",
|
|
149
149
|
fileExtension: "pdf",
|
|
150
150
|
metadata: {
|
|
151
151
|
"@context": "https://schema.org",
|
|
@@ -293,24 +293,24 @@ export function generateRestRoutesBlobStorage(baseRouteName, componentName, opti
|
|
|
293
293
|
response: {
|
|
294
294
|
body: {
|
|
295
295
|
"@context": [
|
|
296
|
-
SchemaOrgContexts.
|
|
297
|
-
BlobStorageContexts.
|
|
298
|
-
BlobStorageContexts.
|
|
296
|
+
SchemaOrgContexts.Context,
|
|
297
|
+
BlobStorageContexts.Context,
|
|
298
|
+
BlobStorageContexts.ContextCommon
|
|
299
299
|
],
|
|
300
300
|
type: SchemaOrgTypes.ItemList,
|
|
301
301
|
[SchemaOrgTypes.ItemListElement]: [
|
|
302
302
|
{
|
|
303
303
|
"@context": [
|
|
304
|
-
BlobStorageContexts.
|
|
305
|
-
BlobStorageContexts.
|
|
306
|
-
SchemaOrgContexts.
|
|
304
|
+
BlobStorageContexts.Context,
|
|
305
|
+
BlobStorageContexts.ContextCommon,
|
|
306
|
+
SchemaOrgContexts.Context
|
|
307
307
|
],
|
|
308
308
|
type: BlobStorageTypes.Entry,
|
|
309
309
|
id: "blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70",
|
|
310
310
|
dateCreated: "2024-01-01T00:00:00Z",
|
|
311
311
|
encodingFormat: MimeTypes.Pdf,
|
|
312
312
|
blobSize: 42,
|
|
313
|
-
|
|
313
|
+
integrity: "sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=",
|
|
314
314
|
fileExtension: "pdf",
|
|
315
315
|
metadata: {
|
|
316
316
|
"@context": "https://schema.org",
|
|
@@ -334,24 +334,24 @@ export function generateRestRoutesBlobStorage(baseRouteName, componentName, opti
|
|
|
334
334
|
response: {
|
|
335
335
|
body: {
|
|
336
336
|
"@context": [
|
|
337
|
-
SchemaOrgContexts.
|
|
338
|
-
BlobStorageContexts.
|
|
339
|
-
BlobStorageContexts.
|
|
337
|
+
SchemaOrgContexts.Context,
|
|
338
|
+
BlobStorageContexts.Context,
|
|
339
|
+
BlobStorageContexts.ContextCommon
|
|
340
340
|
],
|
|
341
341
|
type: SchemaOrgTypes.ItemList,
|
|
342
342
|
[SchemaOrgTypes.ItemListElement]: [
|
|
343
343
|
{
|
|
344
344
|
"@context": [
|
|
345
|
-
BlobStorageContexts.
|
|
346
|
-
BlobStorageContexts.
|
|
347
|
-
SchemaOrgContexts.
|
|
345
|
+
BlobStorageContexts.Context,
|
|
346
|
+
BlobStorageContexts.ContextCommon,
|
|
347
|
+
SchemaOrgContexts.Context
|
|
348
348
|
],
|
|
349
349
|
type: BlobStorageTypes.Entry,
|
|
350
350
|
id: "blob-memory:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70",
|
|
351
351
|
dateCreated: "2024-01-01T00:00:00Z",
|
|
352
352
|
encodingFormat: MimeTypes.Pdf,
|
|
353
353
|
blobSize: 42,
|
|
354
|
-
|
|
354
|
+
integrity: "sha256-xX2UsIj0xtLLMt7QFIExDHhqoAE0yO4i+EseJUVgKnA=",
|
|
355
355
|
fileExtension: "pdf",
|
|
356
356
|
metadata: {
|
|
357
357
|
"@context": "https://schema.org",
|
|
@@ -400,7 +400,7 @@ export async function blobStorageCreate(httpRequestContext, componentName, reque
|
|
|
400
400
|
return {
|
|
401
401
|
statusCode: HttpStatusCode.created,
|
|
402
402
|
headers: {
|
|
403
|
-
|
|
403
|
+
[HeaderTypes.Location]: id
|
|
404
404
|
}
|
|
405
405
|
};
|
|
406
406
|
}
|
|
@@ -415,7 +415,6 @@ export async function blobStorageGet(httpRequestContext, componentName, request)
|
|
|
415
415
|
Guards.object(ROUTES_SOURCE, "request", request);
|
|
416
416
|
Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
|
|
417
417
|
Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
|
|
418
|
-
const mimeType = request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? "jsonld" : "json";
|
|
419
418
|
const component = ComponentFactory.get(componentName);
|
|
420
419
|
const result = await component.get(request.pathParams.id, {
|
|
421
420
|
includeContent: Coerce.boolean(request.query?.includeContent),
|
|
@@ -424,7 +423,9 @@ export async function blobStorageGet(httpRequestContext, componentName, request)
|
|
|
424
423
|
});
|
|
425
424
|
return {
|
|
426
425
|
headers: {
|
|
427
|
-
[HeaderTypes.ContentType]:
|
|
426
|
+
[HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd
|
|
427
|
+
? MimeTypes.JsonLd
|
|
428
|
+
: MimeTypes.Json
|
|
428
429
|
},
|
|
429
430
|
body: result
|
|
430
431
|
};
|
|
@@ -515,14 +516,18 @@ export async function blobStorageRemove(httpRequestContext, componentName, reque
|
|
|
515
516
|
*/
|
|
516
517
|
export async function blobStorageList(httpRequestContext, componentName, request) {
|
|
517
518
|
Guards.object(ROUTES_SOURCE, "request", request);
|
|
518
|
-
const
|
|
519
|
+
const hostingComponent = ComponentFactory.get(httpRequestContext.hostingComponentType ?? "hosting");
|
|
519
520
|
const component = ComponentFactory.get(componentName);
|
|
520
521
|
const result = await component.query(HttpParameterHelper.objectFromString(request.query?.conditions), request.query?.orderBy, request.query?.orderByDirection, request.query?.cursor, Coerce.number(request.query?.limit));
|
|
522
|
+
const headers = {
|
|
523
|
+
[HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
|
|
524
|
+
};
|
|
525
|
+
if (Is.stringValue(result.cursor)) {
|
|
526
|
+
headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(await hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url), { cursor: result.cursor }, "next");
|
|
527
|
+
}
|
|
521
528
|
return {
|
|
522
|
-
headers
|
|
523
|
-
|
|
524
|
-
},
|
|
525
|
-
body: result
|
|
529
|
+
headers,
|
|
530
|
+
body: result.entries
|
|
526
531
|
};
|
|
527
532
|
}
|
|
528
533
|
//# sourceMappingURL=blobStorageRoutes.js.map
|
|
@@ -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 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 { HeaderTypes, HttpStatusCode, MimeTypeHelper, MimeTypes } 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.ContextRoot,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRootCommon,\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.ContextRoot\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\tblobHash: \"sha256:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\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.ContextRoot,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRootCommon,\n\t\t\t\t\t\t\t\t\tSchemaOrgContexts.ContextRoot\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\tblobHash: \"sha256:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\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.ContextRoot,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRootCommon\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.ContextRoot,\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRootCommon,\n\t\t\t\t\t\t\t\t\t\t\tSchemaOrgContexts.ContextRoot\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\tblobHash:\n\t\t\t\t\t\t\t\t\t\t\t\"sha256:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\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.ContextRoot,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRoot,\n\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRootCommon\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.ContextRoot,\n\t\t\t\t\t\t\t\t\t\t\tBlobStorageContexts.ContextRootCommon,\n\t\t\t\t\t\t\t\t\t\t\tSchemaOrgContexts.ContextRoot\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\tblobHash:\n\t\t\t\t\t\t\t\t\t\t\t\"sha256:c57d94b088f4c6d2cb32ded014813d0c786aa00134c8ee22f84b1e2545602a70\",\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\tlocation: 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 mimeType = request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? \"jsonld\" : \"json\";\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]: mimeType === \"json\" ? MimeTypes.Json : MimeTypes.JsonLd\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 mimeType = request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? \"jsonld\" : \"json\";\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\treturn {\n\t\theaders: {\n\t\t\t[HeaderTypes.ContentType]: mimeType === \"json\" ? MimeTypes.Json : MimeTypes.JsonLd\n\t\t},\n\t\tbody: result\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 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"]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import { BlobStorageConnectorFactory, BlobStorageContexts, BlobStorageTypes } from "@twin.org/blob-storage-models";
|
|
4
4
|
import { ContextIdHelper, ContextIdKeys, ContextIdStore } from "@twin.org/context";
|
|
5
5
|
import { Compression, Converter, GeneralError, Guards, Is, NotFoundError, Urn, Validation } from "@twin.org/core";
|
|
6
|
-
import {
|
|
6
|
+
import { IntegrityAlgorithm, IntegrityHelper } from "@twin.org/crypto";
|
|
7
7
|
import { JsonLdHelper, JsonLdProcessor } from "@twin.org/data-json-ld";
|
|
8
8
|
import { ComparisonOperator, EntitySchemaHelper, LogicalOperator, SortDirection } from "@twin.org/entity";
|
|
9
9
|
import { EntityStorageConnectorFactory } from "@twin.org/entity-storage-models";
|
|
@@ -106,7 +106,7 @@ export class BlobStorageService {
|
|
|
106
106
|
await JsonLdHelper.validate(metadata, validationFailures);
|
|
107
107
|
Validation.asValidationError(BlobStorageService.CLASS_NAME, "metadata", validationFailures);
|
|
108
108
|
}
|
|
109
|
-
const
|
|
109
|
+
const integrity = IntegrityHelper.generate(IntegrityAlgorithm.Sha256, storeBlob);
|
|
110
110
|
if (!Is.empty(options?.compress)) {
|
|
111
111
|
storeBlob = await Compression.compress(storeBlob, options.compress);
|
|
112
112
|
}
|
|
@@ -126,7 +126,7 @@ export class BlobStorageService {
|
|
|
126
126
|
id: blobId,
|
|
127
127
|
dateCreated: new Date(Date.now()).toISOString(),
|
|
128
128
|
blobSize,
|
|
129
|
-
|
|
129
|
+
integrity,
|
|
130
130
|
encodingFormat,
|
|
131
131
|
fileExtension,
|
|
132
132
|
metadata,
|
|
@@ -212,7 +212,7 @@ export class BlobStorageService {
|
|
|
212
212
|
dateCreated: blobEntry.dateCreated,
|
|
213
213
|
dateModified: new Date(Date.now()).toISOString(),
|
|
214
214
|
blobSize: blobEntry.blobSize,
|
|
215
|
-
|
|
215
|
+
integrity: blobEntry.integrity,
|
|
216
216
|
encodingFormat: encodingFormat ?? blobEntry.encodingFormat,
|
|
217
217
|
fileExtension: fileExtension ?? blobEntry.fileExtension,
|
|
218
218
|
metadata: metadata ?? blobEntry.metadata,
|
|
@@ -264,9 +264,9 @@ export class BlobStorageService {
|
|
|
264
264
|
}
|
|
265
265
|
], undefined, cursor, limit);
|
|
266
266
|
let context = [
|
|
267
|
-
SchemaOrgContexts.
|
|
268
|
-
BlobStorageContexts.
|
|
269
|
-
BlobStorageContexts.
|
|
267
|
+
SchemaOrgContexts.Context,
|
|
268
|
+
BlobStorageContexts.Context,
|
|
269
|
+
BlobStorageContexts.ContextCommon
|
|
270
270
|
];
|
|
271
271
|
const entriesJsonLd = [];
|
|
272
272
|
for (const entry of result.entities) {
|
|
@@ -277,10 +277,12 @@ export class BlobStorageService {
|
|
|
277
277
|
const jsonLd = {
|
|
278
278
|
"@context": context,
|
|
279
279
|
type: SchemaOrgTypes.ItemList,
|
|
280
|
-
[SchemaOrgTypes.ItemListElement]: entriesJsonLd
|
|
281
|
-
|
|
280
|
+
[SchemaOrgTypes.ItemListElement]: entriesJsonLd
|
|
281
|
+
};
|
|
282
|
+
return {
|
|
283
|
+
entries: await JsonLdProcessor.compact(jsonLd, jsonLd["@context"]),
|
|
284
|
+
cursor: result.cursor
|
|
282
285
|
};
|
|
283
|
-
return JsonLdProcessor.compact(jsonLd, jsonLd["@context"]);
|
|
284
286
|
}
|
|
285
287
|
/**
|
|
286
288
|
* Get the connector from the uri.
|
|
@@ -335,17 +337,13 @@ export class BlobStorageService {
|
|
|
335
337
|
*/
|
|
336
338
|
entryToJsonLd(entry, blob) {
|
|
337
339
|
const jsonLd = {
|
|
338
|
-
"@context": JsonLdProcessor.combineContexts([
|
|
339
|
-
BlobStorageContexts.ContextRoot,
|
|
340
|
-
BlobStorageContexts.ContextRootCommon,
|
|
341
|
-
SchemaOrgContexts.ContextRoot
|
|
342
|
-
], entry?.metadata?.["@context"]),
|
|
340
|
+
"@context": JsonLdProcessor.combineContexts([BlobStorageContexts.Context, BlobStorageContexts.ContextCommon, SchemaOrgContexts.Context], entry?.metadata?.["@context"]),
|
|
343
341
|
id: entry.id,
|
|
344
342
|
type: BlobStorageTypes.Entry,
|
|
345
343
|
dateCreated: entry.dateCreated,
|
|
346
344
|
dateModified: entry.dateModified,
|
|
347
345
|
blobSize: entry.blobSize,
|
|
348
|
-
|
|
346
|
+
integrity: entry.integrity,
|
|
349
347
|
encodingFormat: entry?.encodingFormat,
|
|
350
348
|
fileExtension: entry?.fileExtension,
|
|
351
349
|
metadata: entry?.metadata,
|
|
@@ -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 { Sha256 } 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 blobHash = `sha256:${Converter.bytesToBase64(Sha256.sum256(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\tblobHash,\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\tblobHash: blobEntry.blobHash,\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<IBlobStorageEntryList> {\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.ContextRoot,\n\t\t\tBlobStorageContexts.ContextRoot,\n\t\t\tBlobStorageContexts.ContextRootCommon\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\t[SchemaOrgTypes.NextItem]: result.cursor\n\t\t};\n\n\t\treturn JsonLdProcessor.compact(jsonLd, jsonLd[\"@context\"]);\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[\n\t\t\t\t\tBlobStorageContexts.ContextRoot,\n\t\t\t\t\tBlobStorageContexts.ContextRootCommon,\n\t\t\t\t\tSchemaOrgContexts.ContextRoot\n\t\t\t\t],\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\tblobHash: entry.blobHash,\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 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"]}
|
|
@@ -20,9 +20,9 @@ let BlobStorageEntry = class BlobStorageEntry {
|
|
|
20
20
|
*/
|
|
21
21
|
blobSize;
|
|
22
22
|
/**
|
|
23
|
-
* The
|
|
23
|
+
* The integrity of the data in the blob.
|
|
24
24
|
*/
|
|
25
|
-
|
|
25
|
+
integrity;
|
|
26
26
|
/**
|
|
27
27
|
* The mime type for the blob.
|
|
28
28
|
*/
|
|
@@ -68,7 +68,7 @@ __decorate([
|
|
|
68
68
|
__decorate([
|
|
69
69
|
property({ type: "string" }),
|
|
70
70
|
__metadata("design:type", String)
|
|
71
|
-
], BlobStorageEntry.prototype, "
|
|
71
|
+
], BlobStorageEntry.prototype, "integrity", void 0);
|
|
72
72
|
__decorate([
|
|
73
73
|
property({ type: "string", optional: true }),
|
|
74
74
|
__metadata("design:type", String)
|