@nestjs-cms/core 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +3 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/resource/resource.registry.js +5 -1
- package/dist/src/resource/resource.registry.js.map +1 -1
- package/dist/src/resource/resource.service.js +1 -1
- package/dist/src/resource/resource.service.js.map +1 -1
- package/dist/src/storage/attachment.service.d.ts +13 -1
- package/dist/src/storage/attachment.service.js +90 -24
- package/dist/src/storage/attachment.service.js.map +1 -1
- package/dist/src/storage/mime-type.d.ts +2 -0
- package/dist/src/storage/mime-type.js +16 -0
- package/dist/src/storage/mime-type.js.map +1 -0
- package/docs/api.md +4 -1
- package/docs/resources.md +1 -1
- package/package.json +1 -1
package/dist/src/index.d.ts
CHANGED
|
@@ -10,3 +10,4 @@ export { loadResources } from "./resource/resource.loader";
|
|
|
10
10
|
export { createCmsDataSource } from "./database/create-data-source";
|
|
11
11
|
export { AttachmentService } from "./storage/attachment.service";
|
|
12
12
|
export { configureCmsApp } from "./setup";
|
|
13
|
+
export { matchesMimeType } from "./storage/mime-type";
|
package/dist/src/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.configureCmsApp = exports.AttachmentService = exports.createCmsDataSource = exports.loadResources = exports.defineResource = exports.ResourceRegistry = exports.ResourceService = exports.ResourceModule = exports.z = void 0;
|
|
3
|
+
exports.matchesMimeType = exports.configureCmsApp = exports.AttachmentService = exports.createCmsDataSource = exports.loadResources = exports.defineResource = exports.ResourceRegistry = exports.ResourceService = exports.ResourceModule = exports.z = void 0;
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
var zod_1 = require("zod");
|
|
6
6
|
Object.defineProperty(exports, "z", { enumerable: true, get: function () { return zod_1.z; } });
|
|
@@ -20,4 +20,6 @@ var attachment_service_1 = require("./storage/attachment.service");
|
|
|
20
20
|
Object.defineProperty(exports, "AttachmentService", { enumerable: true, get: function () { return attachment_service_1.AttachmentService; } });
|
|
21
21
|
var setup_1 = require("./setup");
|
|
22
22
|
Object.defineProperty(exports, "configureCmsApp", { enumerable: true, get: function () { return setup_1.configureCmsApp; } });
|
|
23
|
+
var mime_type_1 = require("./storage/mime-type");
|
|
24
|
+
Object.defineProperty(exports, "matchesMimeType", { enumerable: true, get: function () { return mime_type_1.matchesMimeType; } });
|
|
23
25
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,2BAAwB;AAAf,wFAAA,CAAC,OAAA;AACV,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AAEvB,gEAA8D;AAArD,mHAAA,eAAe,OAAA;AACxB,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,4DAA2D;AAAlD,gHAAA,cAAc,OAAA;AAUvB,8DAA2D;AAAlD,gHAAA,aAAa,OAAA;AACtB,oEAAoE;AAA3D,yHAAA,mBAAmB,OAAA;AAC5B,mEAAiE;AAAxD,uHAAA,iBAAiB,OAAA;AAC1B,iCAA0C;AAAjC,wGAAA,eAAe,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;AAAA,4BAA0B;AAC1B,2BAAwB;AAAf,wFAAA,CAAC,OAAA;AACV,8DAA4D;AAAnD,iHAAA,cAAc,OAAA;AAEvB,gEAA8D;AAArD,mHAAA,eAAe,OAAA;AACxB,kEAAgE;AAAvD,qHAAA,gBAAgB,OAAA;AACzB,4DAA2D;AAAlD,gHAAA,cAAc,OAAA;AAUvB,8DAA2D;AAAlD,gHAAA,aAAa,OAAA;AACtB,oEAAoE;AAA3D,yHAAA,mBAAmB,OAAA;AAC5B,mEAAiE;AAAxD,uHAAA,iBAAiB,OAAA;AAC1B,iCAA0C;AAAjC,wGAAA,eAAe,OAAA;AAExB,iDAAsD;AAA7C,4GAAA,eAAe,OAAA"}
|
|
@@ -44,7 +44,11 @@ let ResourceRegistry = class ResourceRegistry {
|
|
|
44
44
|
}
|
|
45
45
|
const fields = def.attachments ?? [];
|
|
46
46
|
if (new Set(fields.map((f) => f.field)).size !== fields.length ||
|
|
47
|
-
fields.some((f) => !/^[a-zA-Z][a-zA-Z0-9_]*$/.test(f.field) ||
|
|
47
|
+
fields.some((f) => !/^[a-zA-Z][a-zA-Z0-9_]*$/.test(f.field) ||
|
|
48
|
+
!f.mimeTypes.length ||
|
|
49
|
+
reserved.includes(f.field) ||
|
|
50
|
+
Object.hasOwn(def.columns, f.field) ||
|
|
51
|
+
Object.hasOwn(def.schema.shape, f.field)))
|
|
48
52
|
throw new Error("Invalid attachment definition");
|
|
49
53
|
this.definitions.set(def.name, def);
|
|
50
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.registry.js","sourceRoot":"","sources":["../../../src/resource/resource.registry.ts"],"names":[],"mappings":";;;;;;;;;;;;AAIA,oCAYC;AAhBD,2CAA+D;AAC/D,qCAAuC;AACvC,6BAAwB;AAExB,SAAgB,YAAY,CAAC,GAAuB;IAClD,OAAO,IAAI,sBAAY,CAAC;QACtB,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,SAAS,EAAE,GAAG,CAAC,IAAI;QACnB,WAAW,EAAE,GAAG,CAAC,WAAW;QAC5B,OAAO,EAAE;YACP,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;YAC/C,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC3C,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC3C,GAAG,GAAG,CAAC,OAAO;SACf;KACF,CAAC,CAAC;AACL,CAAC;AAEM,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IACV,WAAW,GAAG,IAAI,GAAG,EAA8B,CAAC;IACrE,YAAY,SAA+B;QACzC,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBACvE,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;YACjE,IACE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAC1D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;gBAE/D,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;YACnD,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBACvE,IACE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;oBAChC,CAAC,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAE/C,MAAM,IAAI,KAAK,CAAC,uBAAuB,GAAG,EAAE,CAAC,CAAC;YAClD,CAAC;YACD,MAAM,MAAM,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;YACrC,IACE,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,MAAM;gBAC1D,MAAM,CAAC,IAAI,CACT,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"resource.registry.js","sourceRoot":"","sources":["../../../src/resource/resource.registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -56,7 +56,7 @@ let ResourceService = class ResourceService {
|
|
|
56
56
|
const def = this.registry.get(name);
|
|
57
57
|
return rows.map((row) => ({
|
|
58
58
|
...row,
|
|
59
|
-
|
|
59
|
+
...Object.fromEntries((def.attachments ?? []).map((f) => {
|
|
60
60
|
const matches = files
|
|
61
61
|
.filter((a) => a.recordId === row.id && a.field === f.field)
|
|
62
62
|
.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime() ||
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resource.service.js","sourceRoot":"","sources":["../../../src/resource/resource.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,qCAAwD;AACxD,6CAAyC;AACzC,2DAAuD;AAEvD,6CAAqC;AACrC,mCAAqC;AACrC,mEAA8D;AAC9D,sEAAkE;AAElE,oEAGsC;AAE/B,IAAM,eAAe,GAArB,MAAM,eAAe;IAEP;IACA;IACA;IACA;IAJnB,YACmB,EAAc,EACd,QAA0B,EAC1B,OAA4B,EAC5B,WAA8B;QAH9B,OAAE,GAAF,EAAE,CAAY;QACd,aAAQ,GAAR,QAAQ,CAAkB;QAC1B,YAAO,GAAP,OAAO,CAAqB;QAC5B,gBAAW,GAAX,WAAW,CAAmB;IAC9C,CAAC;IACJ,KAAK,CAAC,IAAI,CAAC,OAAsB,EAAE,IAAY,EAAE,EAAU,EAAE,IAAI,GAAG,KAAK;QACvE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,gBAAgB,CACd,IAAY,EACZ,EAAU,EACV,KAAa,EACb,IAAyB;QAEzB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,cAAc,CACZ,IAAY,EACZ,EAAU,EACV,KAAa,EACb,YAAoB;QAEpB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAC9D,CAAC;IACD,kBAAkB,CAChB,IAAY,EACZ,EAAU,EACV,KAAa,EACb,YAAoB;QAEpB,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAClE,CAAC;IACD,gBAAgB,CACd,IAAY,EACZ,EAAU,EACV,KAAa,EACb,YAAoB;QAEpB,OAAO,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;IAChE,CAAC;IACO,KAAK,CAAC,OAAO,CACnB,OAAsB,EACtB,IAAY,EACZ,IAAkB;QAElB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,oCAAgB,CAAC,CAAC,MAAM,CAAC;YACjE,QAAQ,EAAE,IAAI;YACd,QAAQ,EAAE,IAAA,YAAE,EAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC3C,MAAM,EAAE,OAAO;SAChB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,GAAG,GAAG;YACN,
|
|
1
|
+
{"version":3,"file":"resource.service.js","sourceRoot":"","sources":["../../../src/resource/resource.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DataSource } from "typeorm";
|
|
1
|
+
import { DataSource, EntityManager } from "typeorm";
|
|
2
2
|
import { ResourceRegistry } from "../resource/resource.registry";
|
|
3
3
|
import { ResourceRecordStore } from "../resource/resource-record.store";
|
|
4
4
|
import type { UploadedAttachment } from "./attachment.types";
|
|
@@ -17,6 +17,18 @@ export declare class AttachmentService {
|
|
|
17
17
|
size: number;
|
|
18
18
|
createdAt: Date;
|
|
19
19
|
}>;
|
|
20
|
+
private validateFile;
|
|
21
|
+
/** Standalone import runner; close it after use to release the storage client. */
|
|
22
|
+
static forImport(db: DataSource, registry: ResourceRegistry): {
|
|
23
|
+
service: AttachmentService;
|
|
24
|
+
close: () => void;
|
|
25
|
+
};
|
|
26
|
+
importMaxBytes(resource: string, field: string): number;
|
|
27
|
+
hasImported(id: string, resource: string, recordId: string, field: string): Promise<boolean>;
|
|
28
|
+
/** Persist pending metadata outside the row transaction so failed imports remain cleanable. */
|
|
29
|
+
stageImport(resource: string, recordId: string, field: string, file: UploadedAttachment): Promise<`${string}-${string}-${string}-${string}-${string}`>;
|
|
30
|
+
/** Publish staged metadata atomically with imported rows, using a stable source identity. */
|
|
31
|
+
commitImport(manager: EntityManager, pendingId: string, id: string): Promise<void>;
|
|
20
32
|
private findRecord;
|
|
21
33
|
find(resource: string, id: string, field: string, attachmentId: string): Promise<{
|
|
22
34
|
id: string;
|
|
@@ -8,8 +8,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
8
8
|
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
|
+
var AttachmentService_1;
|
|
11
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
13
|
exports.AttachmentService = void 0;
|
|
14
|
+
const mime_type_1 = require("./mime-type");
|
|
13
15
|
const common_1 = require("@nestjs/common");
|
|
14
16
|
const typeorm_1 = require("typeorm");
|
|
15
17
|
const node_crypto_1 = require("node:crypto");
|
|
@@ -20,7 +22,7 @@ const resource_record_store_1 = require("../resource/resource-record.store");
|
|
|
20
22
|
const validation_1 = require("../resource/validation");
|
|
21
23
|
const attachment_entity_1 = require("./attachment.entity");
|
|
22
24
|
const s3_service_1 = require("./s3.service");
|
|
23
|
-
let AttachmentService = class AttachmentService {
|
|
25
|
+
let AttachmentService = AttachmentService_1 = class AttachmentService {
|
|
24
26
|
db;
|
|
25
27
|
registry;
|
|
26
28
|
records;
|
|
@@ -40,29 +42,8 @@ let AttachmentService = class AttachmentService {
|
|
|
40
42
|
return definition;
|
|
41
43
|
}
|
|
42
44
|
async upload(resource, id, field, file) {
|
|
45
|
+
const input = this.validateFile(resource, field, file);
|
|
43
46
|
const definition = this.field(resource, field);
|
|
44
|
-
if (!file?.buffer)
|
|
45
|
-
throw new common_1.BadRequestException("A multipart file field is required");
|
|
46
|
-
const maxBytes = Math.min(definition.maxBytes ?? config_1.config.ATTACHMENT_MAX_BYTES, config_1.config.ATTACHMENT_MAX_BYTES);
|
|
47
|
-
if (file.buffer.length > maxBytes)
|
|
48
|
-
throw new common_1.PayloadTooLargeException("Attachment exceeds field size limit");
|
|
49
|
-
const input = (0, validation_1.parse)(zod_1.z.object({
|
|
50
|
-
name: zod_1.z
|
|
51
|
-
.string()
|
|
52
|
-
.trim()
|
|
53
|
-
.min(1)
|
|
54
|
-
.max(255)
|
|
55
|
-
.refine((v) => !/[\x00-\x1f\x7f/\\]/.test(v), "Invalid filename"),
|
|
56
|
-
mimeType: zod_1.z
|
|
57
|
-
.string()
|
|
58
|
-
.max(120)
|
|
59
|
-
.refine((v) => definition.mimeTypes.includes(v), "Unsupported MIME type"),
|
|
60
|
-
size: zod_1.z.number().int().min(1),
|
|
61
|
-
}), {
|
|
62
|
-
name: file.originalname,
|
|
63
|
-
mimeType: file.mimetype,
|
|
64
|
-
size: file.buffer.length,
|
|
65
|
-
});
|
|
66
47
|
const attachmentId = (0, node_crypto_1.randomUUID)();
|
|
67
48
|
const key = `attachments/${resource}/${id}/${field}/${attachmentId}`;
|
|
68
49
|
// Retain the existing storage schema so previously stored attachments remain readable.
|
|
@@ -100,6 +81,91 @@ let AttachmentService = class AttachmentService {
|
|
|
100
81
|
return (0, attachment_entity_1.attachmentMetadata)(current);
|
|
101
82
|
});
|
|
102
83
|
}
|
|
84
|
+
validateFile(resource, field, file) {
|
|
85
|
+
const definition = this.field(resource, field);
|
|
86
|
+
if (!file?.buffer)
|
|
87
|
+
throw new common_1.BadRequestException("A multipart file field is required");
|
|
88
|
+
const maxBytes = Math.min(definition.maxBytes ?? config_1.config.ATTACHMENT_MAX_BYTES, config_1.config.ATTACHMENT_MAX_BYTES);
|
|
89
|
+
if (file.buffer.length > maxBytes)
|
|
90
|
+
throw new common_1.PayloadTooLargeException("Attachment exceeds field size limit");
|
|
91
|
+
const input = (0, validation_1.parse)(zod_1.z.object({
|
|
92
|
+
name: zod_1.z
|
|
93
|
+
.string()
|
|
94
|
+
.trim()
|
|
95
|
+
.min(1)
|
|
96
|
+
.max(255)
|
|
97
|
+
.refine((v) => !/[\x00-\x1f\x7f/\\]/.test(v), "Invalid filename"),
|
|
98
|
+
mimeType: zod_1.z
|
|
99
|
+
.string()
|
|
100
|
+
.max(120)
|
|
101
|
+
.refine((v) => (0, mime_type_1.matchesMimeType)(v, definition.mimeTypes), "Unsupported MIME type"),
|
|
102
|
+
size: zod_1.z.number().int().min(1),
|
|
103
|
+
}), {
|
|
104
|
+
name: file.originalname,
|
|
105
|
+
mimeType: file.mimetype,
|
|
106
|
+
size: file.buffer.length,
|
|
107
|
+
});
|
|
108
|
+
return input;
|
|
109
|
+
}
|
|
110
|
+
/** Standalone import runner; close it after use to release the storage client. */
|
|
111
|
+
static forImport(db, registry) {
|
|
112
|
+
const storage = new s3_service_1.S3Service();
|
|
113
|
+
return {
|
|
114
|
+
service: new AttachmentService_1(db, registry, new resource_record_store_1.ResourceRecordStore(registry), storage),
|
|
115
|
+
close: () => storage.onModuleDestroy(),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
importMaxBytes(resource, field) {
|
|
119
|
+
return Math.min(this.field(resource, field).maxBytes ?? config_1.config.ATTACHMENT_MAX_BYTES, config_1.config.ATTACHMENT_MAX_BYTES);
|
|
120
|
+
}
|
|
121
|
+
async hasImported(id, resource, recordId, field) {
|
|
122
|
+
return this.db
|
|
123
|
+
.getRepository(attachment_entity_1.AttachmentEntity)
|
|
124
|
+
.existsBy({ id, resource, recordId, field, status: "ready" });
|
|
125
|
+
}
|
|
126
|
+
/** Persist pending metadata outside the row transaction so failed imports remain cleanable. */
|
|
127
|
+
async stageImport(resource, recordId, field, file) {
|
|
128
|
+
const input = this.validateFile(resource, field, file);
|
|
129
|
+
const id = (0, node_crypto_1.randomUUID)();
|
|
130
|
+
const pending = await this.db.getRepository(attachment_entity_1.AttachmentEntity).save({
|
|
131
|
+
id,
|
|
132
|
+
resource,
|
|
133
|
+
recordId,
|
|
134
|
+
field,
|
|
135
|
+
...input,
|
|
136
|
+
key: `attachments/${resource}/${recordId}/${field}/${id}`,
|
|
137
|
+
stagingKey: "",
|
|
138
|
+
expiresAt: new Date(),
|
|
139
|
+
status: "pending",
|
|
140
|
+
});
|
|
141
|
+
await this.s3.upload(pending.key, file.buffer, input.mimeType);
|
|
142
|
+
return pending.id;
|
|
143
|
+
}
|
|
144
|
+
/** Publish staged metadata atomically with imported rows, using a stable source identity. */
|
|
145
|
+
async commitImport(manager, pendingId, id) {
|
|
146
|
+
const repo = manager.getRepository(attachment_entity_1.AttachmentEntity);
|
|
147
|
+
const pending = await repo.findOneByOrFail({
|
|
148
|
+
id: pendingId,
|
|
149
|
+
status: "pending",
|
|
150
|
+
});
|
|
151
|
+
const definition = this.field(pending.resource, pending.field);
|
|
152
|
+
const existing = await repo.findOneBy({ id });
|
|
153
|
+
if (existing?.status === "ready") {
|
|
154
|
+
await repo.update({ id: pendingId }, { status: "deleted" });
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
if (!definition.multiple)
|
|
158
|
+
await repo.update({
|
|
159
|
+
resource: pending.resource,
|
|
160
|
+
recordId: pending.recordId,
|
|
161
|
+
field: pending.field,
|
|
162
|
+
status: "ready",
|
|
163
|
+
}, { status: "deleted" });
|
|
164
|
+
if (existing)
|
|
165
|
+
await repo.save({ ...existing, id: (0, node_crypto_1.randomUUID)(), status: "deleted" });
|
|
166
|
+
await repo.save({ ...pending, id, status: "ready" });
|
|
167
|
+
await repo.delete({ id: pendingId });
|
|
168
|
+
}
|
|
103
169
|
async findRecord(resource, id, field, attachmentId) {
|
|
104
170
|
this.field(resource, field);
|
|
105
171
|
(0, validation_1.recordId)(attachmentId);
|
|
@@ -180,7 +246,7 @@ let AttachmentService = class AttachmentService {
|
|
|
180
246
|
}
|
|
181
247
|
};
|
|
182
248
|
exports.AttachmentService = AttachmentService;
|
|
183
|
-
exports.AttachmentService = AttachmentService = __decorate([
|
|
249
|
+
exports.AttachmentService = AttachmentService = AttachmentService_1 = __decorate([
|
|
184
250
|
(0, common_1.Injectable)(),
|
|
185
251
|
__metadata("design:paramtypes", [typeorm_1.DataSource,
|
|
186
252
|
resource_registry_1.ResourceRegistry,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachment.service.js","sourceRoot":"","sources":["../../../src/storage/attachment.service.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"attachment.service.js","sourceRoot":"","sources":["../../../src/storage/attachment.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.matchesMimeType = matchesMimeType;
|
|
4
|
+
/** Match exact MIME types or a top-level wildcard such as image/*. */
|
|
5
|
+
function matchesMimeType(mimeType, allowed) {
|
|
6
|
+
const value = mimeType.trim().toLowerCase();
|
|
7
|
+
if (!/^[a-z0-9!#$&^_.+-]+\/[a-z0-9!#$&^_.+-]+$/.test(value))
|
|
8
|
+
return false;
|
|
9
|
+
return allowed.some((entry) => {
|
|
10
|
+
const pattern = entry.trim().toLowerCase();
|
|
11
|
+
return pattern === value ||
|
|
12
|
+
(/^[a-z0-9!#$&^_.+-]+\/\*$/.test(pattern) &&
|
|
13
|
+
value.startsWith(pattern.slice(0, -1)));
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=mime-type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mime-type.js","sourceRoot":"","sources":["../../../src/storage/mime-type.ts"],"names":[],"mappings":";;AACA,0CASC;AAVD,sEAAsE;AACtE,SAAgB,eAAe,CAAC,QAAgB,EAAE,OAA0B;IAC1E,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC5C,IAAI,CAAC,0CAA0C,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1E,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAC3C,OAAO,OAAO,KAAK,KAAK;YACtB,CAAC,0BAA0B,CAAC,IAAI,CAAC,OAAO,CAAC;gBACvC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
package/docs/api.md
CHANGED
|
@@ -25,7 +25,8 @@ Create/get/update return the record itself:
|
|
|
25
25
|
"categoryId": null,
|
|
26
26
|
"createdAt": "2026-10-21T10:00:00.000Z",
|
|
27
27
|
"updatedAt": "2026-10-21T10:00:00.000Z",
|
|
28
|
-
"
|
|
28
|
+
"cover": null,
|
|
29
|
+
"files": []
|
|
29
30
|
}
|
|
30
31
|
```
|
|
31
32
|
|
|
@@ -164,3 +165,5 @@ The former `/uploads` and `/:attachmentId/complete` endpoints were removed in fa
|
|
|
164
165
|
- 503: S3 upload/download unavailable, or metadata points to missing object content.
|
|
165
166
|
|
|
166
167
|
Zod errors return `{ "message": "Validation failed", "issues": [...] }`. Other HTTP errors typically return `{ "statusCode": 400, "message": "...", "error": "Bad Request" }`. Clients should use the HTTP status to determine failure.
|
|
168
|
+
|
|
169
|
+
Attachment metadata appears directly on list, detail, create, and update records: `cover` is an object or `null`, and `files` is an array. The former `attachments` response wrapper is removed; clients must read `record[field]`. Storage and attachment operation URLs are unchanged.
|
package/docs/resources.md
CHANGED
|
@@ -51,7 +51,7 @@ Resource names start with a lowercase letter and may contain lowercase letters,
|
|
|
51
51
|
|
|
52
52
|
Normal payload fields should correspond to columns. Use `type: "json"` for nested objects and arrays. For compatibility with both databases, choose shared column types rather than database-specific types such as PostgreSQL `jsonb` or native arrays. UUIDs are stored as `varchar(36)`.
|
|
53
53
|
|
|
54
|
-
Single attachment fields use `{ field, mimeTypes }`; add `multiple: true` for collections. Do not put attachment fields in the Zod schema or database columns: their metadata is stored separately. Responses expose
|
|
54
|
+
Single attachment fields use `{ field, mimeTypes }`; add `multiple: true` for collections. Do not put attachment fields in the Zod schema or database columns: their metadata is stored separately. Responses expose each attachment field directly on the record (for example, `record.cover` and `record.files`) as an object/null or an array. Attachment field names cannot collide with system fields, schema fields, or database columns. Resource write payloads do not accept attachment metadata, object keys, or bucket names.
|
|
55
55
|
|
|
56
56
|
Use `foreignKeys` for relationships between resources; see `resources/articles.ts`. Relations are not automatically expanded. The article hook checks `categoryId` before writing, and the database foreign key enforces referential integrity under concurrency. Categories referenced by articles cannot be deleted.
|
|
57
57
|
|