Skip to content

Commit cf97b7f

Browse files
committed
Add webresource vocabulary
Change-type: minor
1 parent c783091 commit cf97b7f

File tree

5 files changed

+136
-1
lines changed

5 files changed

+136
-1
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
"test:compose": "trap 'docker compose -f docker-compose.npm-test.yml down ; echo Stopped ; exit 0' INT; docker compose -f docker-compose.npm-test.yml up -d && sleep 2 && DATABASE_URL=postgres://docker:docker@localhost:5431/postgres PINEJS_WEBRESOURCE_MAXFILESIZE=1000000000 S3_ENDPOINT=http://localhost:43680 S3_ACCESS_KEY=USERNAME S3_SECRET_KEY=PASSWORD S3_STORAGE_ADAPTER_BUCKET=balena-pine-web-resources S3_REGION=us-east-1 PINEJS_QUEUE_CONCURRENCY=1 TZ=UTC npx mocha",
2424
"test:generated-types": "npm run generate-types && git diff --exit-code ./src/sbvr-api/user.ts ./src/migrator/migrations.ts ./src/sbvr-api/dev.ts",
2525
"lint-fix": "balena-lint -t tsconfig.dev.json -e js -e ts --fix src test build typings Gruntfile.cts",
26-
"generate-types": "node ./bin/sbvr-compiler.js generate-types ./src/sbvr-api/user.sbvr ./src/sbvr-api/user.ts && node ./bin/sbvr-compiler.js generate-types ./src/migrator/migrations.sbvr ./src/migrator/migrations.ts && node ./bin/sbvr-compiler.js generate-types ./src/sbvr-api/dev.sbvr ./src/sbvr-api/dev.ts && node ./bin/sbvr-compiler.js generate-types ./src/tasks/tasks.sbvr ./src/tasks/tasks.ts && balena-lint -t tsconfig.dev.json --fix ./src/sbvr-api/user.ts ./src/migrator/migrations.ts ./src/sbvr-api/dev.ts"
26+
"generate-types": "node ./bin/sbvr-compiler.js generate-types ./src/sbvr-api/user.sbvr ./src/sbvr-api/user.ts && node ./bin/sbvr-compiler.js generate-types ./src/migrator/migrations.sbvr ./src/migrator/migrations.ts && node ./bin/sbvr-compiler.js generate-types ./src/sbvr-api/dev.sbvr ./src/sbvr-api/dev.ts && node ./bin/sbvr-compiler.js generate-types ./src/tasks/tasks.sbvr ./src/tasks/tasks.ts && node ./bin/sbvr-compiler.js generate-types ./src/webresource-handler/webresource.sbvr ./src/webresource-handler/webresource.ts && balena-lint -t tsconfig.dev.json --fix ./src/sbvr-api/user.ts ./src/migrator/migrations.ts ./src/sbvr-api/dev.ts"
2727
},
2828
"dependencies": {
2929
"@balena/abstract-sql-compiler": "^10.2.3",

src/server-glue/module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import * as configLoader from '../config-loader/config-loader.js';
77
import * as migrator from '../migrator/sync.js';
88
import type * as migratorUtils from '../migrator/utils.js';
99
import * as tasks from '../tasks/index.js';
10+
import * as webresource from '../webresource-handler/index.js';
1011

1112
import * as sbvrUtils from '../sbvr-api/sbvr-utils.js';
1213
import { PINEJS_ADVISORY_LOCK } from '../config-loader/env.js';
@@ -66,6 +67,7 @@ export const init = async <T extends string>(
6667
const cfgLoader = configLoader.setup(app);
6768
await cfgLoader.loadConfig(migrator.config);
6869
await cfgLoader.loadConfig(tasks.config);
70+
await cfgLoader.loadConfig(webresource.config);
6971

7072
if (!process.env.CONFIG_LOADER_DISABLED) {
7173
await cfgLoader.loadApplicationConfig(config);

src/webresource-handler/index.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,13 @@ import {
1111
odataNameToSqlName,
1212
sqlNameToODataName,
1313
} from '@balena/odata-to-abstract-sql';
14+
import type { ConfigLoader } from '../server-glue/module.js';
1415
import { errors, permissions } from '../server-glue/module.js';
1516
import type { WebResourceType as WebResource } from '@balena/sbvr-types';
1617
import { TypedError } from 'typed-error';
1718
import type { Resolvable } from '../sbvr-api/common-types.js';
19+
import type WebresourceModel from './webresource.js';
20+
import { importSBVR } from '../server-glue/sbvr-loader.js';
1821

1922
export * from './handlers/index.js';
2023

@@ -526,3 +529,27 @@ export const setupUploadHooks = (
526529
getCreateWebResourceHooks(handler),
527530
);
528531
};
532+
533+
const initSql = `
534+
CREATE INDEX IF NOT EXISTS idx_multipart_upload_uuid ON "multipart upload" (uuid);
535+
CREATE INDEX IF NOT EXISTS idx_multipart_upload_status ON "multipart upload" (status);
536+
`;
537+
538+
const modelText = await importSBVR('./webresource.sbvr', import.meta);
539+
540+
declare module '../sbvr-api/sbvr-utils.js' {
541+
export interface API {
542+
webresource: PinejsClient<WebresourceModel>;
543+
}
544+
}
545+
546+
export const config: ConfigLoader.Config = {
547+
models: [
548+
{
549+
modelName: 'webresource',
550+
apiRoot: 'webresource',
551+
modelText,
552+
initSql,
553+
},
554+
],
555+
};
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
Vocabulary: webresource
2+
3+
Term: actor
4+
Concept Type: Integer (Type)
5+
Term: expiry date
6+
Concept Type: Date Time (Type)
7+
Term: uuid
8+
Concept Type: Short Text (Type)
9+
Term: resource name
10+
Concept Type: Short Text (Type)
11+
Term: field name
12+
Concept Type: Short Text (Type)
13+
Term: resource id
14+
Concept Type: Integer (Type)
15+
Term: upload id
16+
Concept Type: Short Text (Type)
17+
Term: file key
18+
Concept Type: Short Text (Type)
19+
Term: status
20+
Concept Type: Short Text (Type)
21+
Term: filename
22+
Concept Type: Short Text (Type)
23+
Term: content type
24+
Concept Type: Short Text (Type)
25+
Term: size
26+
Concept Type: Integer (Type)
27+
Term: chunk size
28+
Concept Type: Integer (Type)
29+
Term: valid until date
30+
Concept Type: Date Time (Type)
31+
32+
Term: multipart upload
33+
Fact type: multipart upload has uuid
34+
Necessity: each multipart upload has exactly one uuid
35+
Necessity: each uuid is of exactly one multipart upload
36+
Fact type: multipart upload has resource name
37+
Necessity: each multipart upload has exactly one resource name
38+
Fact type: multipart upload has field name
39+
Necessity: each multipart upload has exactly one field name
40+
Fact type: multipart upload has resource id
41+
Necessity: each multipart upload has exactly one resource id
42+
Fact type: multipart upload has upload id
43+
Necessity: each multipart upload has exactly one upload id
44+
Fact type: multipart upload has file key
45+
Necessity: each multipart upload has exactly one file key
46+
Fact type: multipart upload has status
47+
Necessity: each multipart upload has exactly one status
48+
Definition: "pending" or "completed" or "cancelled"
49+
Fact type: multipart upload has filename
50+
Necessity: each multipart upload has exactly one filename
51+
Fact type: multipart upload has content type
52+
Necessity: each multipart upload has exactly one content type
53+
Fact type: multipart upload has size
54+
Necessity: each multipart upload has exactly one size
55+
Fact type: multipart upload has chunk size
56+
Necessity: each multipart upload has exactly one chunk size
57+
Fact type: multipart upload has expiry date
58+
Necessity: each multipart upload has exactly one expiry date
59+
Fact type: multipart upload is created by actor
60+
Necessity: each multipart upload is created by at most one actor
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
// These types were generated by @balena/abstract-sql-to-typescript v5.1.0
2+
3+
import type { Types } from '@balena/abstract-sql-to-typescript';
4+
5+
export interface MultipartUpload {
6+
Read: {
7+
created_at: Types['Date Time']['Read'];
8+
modified_at: Types['Date Time']['Read'];
9+
id: Types['Serial']['Read'];
10+
uuid: Types['Short Text']['Read'];
11+
resource_name: Types['Short Text']['Read'];
12+
field_name: Types['Short Text']['Read'];
13+
resource_id: Types['Integer']['Read'];
14+
upload_id: Types['Short Text']['Read'];
15+
file_key: Types['Short Text']['Read'];
16+
status: 'pending' | 'completed' | 'cancelled';
17+
filename: Types['Short Text']['Read'];
18+
content_type: Types['Short Text']['Read'];
19+
size: Types['Integer']['Read'];
20+
chunk_size: Types['Integer']['Read'];
21+
expiry_date: Types['Date Time']['Read'];
22+
is_created_by__actor: Types['Integer']['Read'] | null;
23+
};
24+
Write: {
25+
created_at: Types['Date Time']['Write'];
26+
modified_at: Types['Date Time']['Write'];
27+
id: Types['Serial']['Write'];
28+
uuid: Types['Short Text']['Write'];
29+
resource_name: Types['Short Text']['Write'];
30+
field_name: Types['Short Text']['Write'];
31+
resource_id: Types['Integer']['Write'];
32+
upload_id: Types['Short Text']['Write'];
33+
file_key: Types['Short Text']['Write'];
34+
status: 'pending' | 'completed' | 'cancelled';
35+
filename: Types['Short Text']['Write'];
36+
content_type: Types['Short Text']['Write'];
37+
size: Types['Integer']['Write'];
38+
chunk_size: Types['Integer']['Write'];
39+
expiry_date: Types['Date Time']['Write'];
40+
is_created_by__actor: Types['Integer']['Write'] | null;
41+
};
42+
}
43+
44+
export default interface $Model {
45+
multipart_upload: MultipartUpload;
46+
}

0 commit comments

Comments
 (0)