@antelopejs/dms 0.5.2 → 0.5.4
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/CHANGELOG.md +37 -0
- package/dist/attachments/access.d.ts +1 -0
- package/dist/attachments/access.js +7 -3
- package/dist/attachments/access.js.map +1 -1
- package/dist/attachments/constraints.d.ts +4 -0
- package/dist/attachments/constraints.js +28 -0
- package/dist/attachments/constraints.js.map +1 -0
- package/dist/attachments/save.js +23 -12
- package/dist/attachments/save.js.map +1 -1
- package/dist/attachments/uploads.js +2 -0
- package/dist/attachments/uploads.js.map +1 -1
- package/dist/implementations/dms-base/search-route.js +3 -4
- package/dist/implementations/dms-base/search-route.js.map +1 -1
- package/dist/pages/settings/users/invite-email-outcome.d.ts +6 -0
- package/dist/pages/settings/users/invite-email-outcome.js +9 -0
- package/dist/pages/settings/users/invite-email-outcome.js.map +1 -0
- package/dist/pages/settings/users/invites.d.ts +4 -1
- package/dist/pages/settings/users/invites.js +33 -28
- package/dist/pages/settings/users/invites.js.map +1 -1
- package/dist/pages/settings/users/members.d.ts +8 -3
- package/dist/pages/settings/users/members.js +16 -4
- package/dist/pages/settings/users/members.js.map +1 -1
- package/dist/test/attachment-host/native.d.ts +25 -0
- package/dist/test/attachment-host/native.js +54 -1
- package/dist/test/attachment-host/native.js.map +1 -1
- package/dist/test/helpers/attachments.d.ts +1 -1
- package/dist/test/helpers/attachments.js +2 -2
- package/dist/test/helpers/attachments.js.map +1 -1
- package/dist/test/integration/files/field-constraints.test.d.ts +1 -0
- package/dist/test/integration/files/field-constraints.test.js +100 -0
- package/dist/test/integration/files/field-constraints.test.js.map +1 -0
- package/dist/test/integration/files/page-mode-form-files.test.d.ts +1 -0
- package/dist/test/integration/files/page-mode-form-files.test.js +114 -0
- package/dist/test/integration/files/page-mode-form-files.test.js.map +1 -0
- package/dist/test/integration/files/resource-form-files.test.d.ts +1 -0
- package/dist/test/integration/files/resource-form-files.test.js +121 -0
- package/dist/test/integration/files/resource-form-files.test.js.map +1 -0
- package/dist/test/integration/files/shared-controller-files.test.d.ts +1 -0
- package/dist/test/integration/files/shared-controller-files.test.js +136 -0
- package/dist/test/integration/files/shared-controller-files.test.js.map +1 -0
- package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.d.ts +1 -0
- package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js +113 -0
- package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js.map +1 -0
- package/dist/test/unit/interfaces/dms-base/resource-form.test.js +19 -0
- package/dist/test/unit/interfaces/dms-base/resource-form.test.js.map +1 -1
- package/dist/test/unit/interfaces/dms-base/table-view-tenant-gate.test.js +2 -2
- package/dist/test/unit/interfaces/dms-base/table-view-tenant-gate.test.js.map +1 -1
- package/dist/test/unit/pages/settings/invite-email-delivery.test.d.ts +1 -0
- package/dist/test/unit/pages/settings/invite-email-delivery.test.js +141 -0
- package/dist/test/unit/pages/settings/invite-email-delivery.test.js.map +1 -0
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-en-GB.json +2 -0
- package/frontend-vue/layers/dms-layout/i18n/locales/layout-fr-FR.json +2 -0
- package/frontend-vue/layers/dms-ui/app/build/composables/table-view/useTableViewRowActions.ts +9 -5
- package/frontend-vue/layers/dms-ui/app/components/form/components/File.vue +50 -21
- package/frontend-vue/layers/dms-ui/app/components/form/components/Image.vue +54 -21
- package/frontend-vue/layers/dms-ui/app/components/form/components/Relation.vue +4 -3
- package/frontend-vue/layers/dms-ui/app/composables/form/types/api.ts +2 -1
- package/frontend-vue/layers/dms-ui/app/composables/form/useForm.ts +15 -8
- package/frontend-vue/layers/dms-ui/app/composables/form/useUploadWithProgress.ts +44 -3
- package/frontend-vue/layers/dms-ui/app/utils/metadataRetry.ts +47 -0
- package/frontend-vue/layers/dms-ui/app/utils/responseWarning.ts +46 -0
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +4 -1
- package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +4 -1
- package/frontend-vue/tests/file-unavailable.test.ts +107 -0
- package/frontend-vue/tests/image-hydration-ids.test.ts +87 -0
- package/frontend-vue/tests/image-reference-preservation.test.ts +12 -2
- package/frontend-vue/tests/metadata-retry.test.ts +187 -0
- package/frontend-vue/tests/response-warning-toast.test.ts +57 -0
- package/frontend-vue/tests/upload-forbidden-headers.test.ts +52 -0
- package/package.json +2 -2
|
@@ -12,7 +12,7 @@ var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
|
12
12
|
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
13
|
};
|
|
14
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
-
exports.NativeAttachmentFormController = exports.NativeFilePage = void 0;
|
|
15
|
+
exports.NativeAttachmentFormController = exports.NativeFileEditFormPage = exports.NativeFileNewFormPage = exports.NativeFileSecondaryPage = exports.NativeFilePage = void 0;
|
|
16
16
|
const interface_api_1 = require("@antelopejs/interface-api");
|
|
17
17
|
const interface_core_1 = require("@antelopejs/interface-core");
|
|
18
18
|
const interface_data_api_1 = require("@antelopejs/interface-data-api");
|
|
@@ -49,6 +49,10 @@ __decorate([
|
|
|
49
49
|
(0, interface_database_decorators_1.Field)("any"),
|
|
50
50
|
__metadata("design:type", Object)
|
|
51
51
|
], NativeDocument.prototype, "image", void 0);
|
|
52
|
+
__decorate([
|
|
53
|
+
(0, interface_database_decorators_1.Field)("any"),
|
|
54
|
+
__metadata("design:type", Array)
|
|
55
|
+
], NativeDocument.prototype, "gallery", void 0);
|
|
52
56
|
NativeDocument = __decorate([
|
|
53
57
|
(0, interface_database_decorators_1.RegisterTable)(TABLE, constants_1.CORE_SCHEMA_NAME)
|
|
54
58
|
], NativeDocument);
|
|
@@ -58,6 +62,7 @@ let NativeDocumentController = class NativeDocumentController extends (0, interf
|
|
|
58
62
|
new: table_view_1.TableViewRoutes.New,
|
|
59
63
|
edit: table_view_1.TableViewRoutes.Edit,
|
|
60
64
|
get: table_view_1.TableViewRoutes.Get,
|
|
65
|
+
select: table_view_1.TableViewRoutes.Select,
|
|
61
66
|
delete: table_view_1.TableViewRoutes.Delete,
|
|
62
67
|
}, (0, interface_api_1.Controller)(LOCATION)) {
|
|
63
68
|
};
|
|
@@ -116,6 +121,17 @@ __decorate([
|
|
|
116
121
|
(0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
|
|
117
122
|
__metadata("design:type", Object)
|
|
118
123
|
], NativeDocumentController.prototype, "image", void 0);
|
|
124
|
+
__decorate([
|
|
125
|
+
(0, table_view_1.Column)({
|
|
126
|
+
name: "Gallery",
|
|
127
|
+
type: new default_types_1.DefaultDataTypes.ImageType({
|
|
128
|
+
multiple: true,
|
|
129
|
+
constraints: { allowedMimetypes: ["image/png"], maxSize: 64 },
|
|
130
|
+
}),
|
|
131
|
+
}),
|
|
132
|
+
(0, metadata_1.Access)(metadata_1.AccessMode.ReadWrite),
|
|
133
|
+
__metadata("design:type", Array)
|
|
134
|
+
], NativeDocumentController.prototype, "gallery", void 0);
|
|
119
135
|
NativeDocumentController = __decorate([
|
|
120
136
|
(0, interface_data_api_1.RegisterDataController)()
|
|
121
137
|
], NativeDocumentController);
|
|
@@ -142,10 +158,40 @@ exports.NativeFilePage = NativeFilePage;
|
|
|
142
158
|
exports.NativeFilePage = NativeFilePage = __decorate([
|
|
143
159
|
(0, page_1.RegisterPage)()
|
|
144
160
|
], NativeFilePage);
|
|
161
|
+
const secondaryTable = (0, table_view_1.TableView)(NativeDocumentController, {
|
|
162
|
+
rowIdKey: "id",
|
|
163
|
+
rowActions: { add: true, edit: true, details: true },
|
|
164
|
+
});
|
|
165
|
+
let NativeFileSecondaryPage = class NativeFileSecondaryPage extends (0, page_1.RootPageController)("nativefiles-secondary", { displayName: "Native files (secondary)" }) {
|
|
166
|
+
static content = secondaryTable;
|
|
167
|
+
};
|
|
168
|
+
exports.NativeFileSecondaryPage = NativeFileSecondaryPage;
|
|
169
|
+
exports.NativeFileSecondaryPage = NativeFileSecondaryPage = __decorate([
|
|
170
|
+
(0, page_1.RegisterPage)()
|
|
171
|
+
], NativeFileSecondaryPage);
|
|
172
|
+
let NativeFileNewFormPage = class NativeFileNewFormPage extends (0, page_1.RootPageController)("nativefiles-new-form", { displayName: "Native files (new form)" }) {
|
|
173
|
+
static content = (0, table_view_1.ResourceForm)(NativeDocumentController, { mode: "new" });
|
|
174
|
+
};
|
|
175
|
+
exports.NativeFileNewFormPage = NativeFileNewFormPage;
|
|
176
|
+
exports.NativeFileNewFormPage = NativeFileNewFormPage = __decorate([
|
|
177
|
+
(0, page_1.RegisterPage)()
|
|
178
|
+
], NativeFileNewFormPage);
|
|
179
|
+
let NativeFileEditFormPage = class NativeFileEditFormPage extends (0, page_1.RootPageController)("nativefiles-edit-form", { displayName: "Native files (edit form)" }) {
|
|
180
|
+
static content = (0, table_view_1.ResourceForm)(NativeDocumentController, { mode: "edit" });
|
|
181
|
+
};
|
|
182
|
+
exports.NativeFileEditFormPage = NativeFileEditFormPage;
|
|
183
|
+
exports.NativeFileEditFormPage = NativeFileEditFormPage = __decorate([
|
|
184
|
+
(0, page_1.RegisterPage)()
|
|
185
|
+
], NativeFileEditFormPage);
|
|
145
186
|
class NativeAttachmentFormController extends (0, interface_api_1.Controller)(`${LOCATION}/form`) {
|
|
146
187
|
async get(_user) {
|
|
147
188
|
return form.serialize();
|
|
148
189
|
}
|
|
190
|
+
async relation(_user) {
|
|
191
|
+
return new default_types_1.DefaultDataTypes.RelationType({
|
|
192
|
+
dataApiController: NativeDocumentController,
|
|
193
|
+
}).inputComponent();
|
|
194
|
+
}
|
|
149
195
|
}
|
|
150
196
|
exports.NativeAttachmentFormController = NativeAttachmentFormController;
|
|
151
197
|
__decorate([
|
|
@@ -155,4 +201,11 @@ __decorate([
|
|
|
155
201
|
__metadata("design:paramtypes", [Function]),
|
|
156
202
|
__metadata("design:returntype", Promise)
|
|
157
203
|
], NativeAttachmentFormController.prototype, "get", null);
|
|
204
|
+
__decorate([
|
|
205
|
+
(0, interface_api_1.Get)("/relation"),
|
|
206
|
+
__param(0, (0, guards_1.AuthTenantMember)()),
|
|
207
|
+
__metadata("design:type", Function),
|
|
208
|
+
__metadata("design:paramtypes", [Function]),
|
|
209
|
+
__metadata("design:returntype", Promise)
|
|
210
|
+
], NativeAttachmentFormController.prototype, "relation", null);
|
|
158
211
|
//# sourceMappingURL=native.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/test/attachment-host/native.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,6DAKmC;AACnC,+DAAyD;AACzD,uEAGwC;AACxC,sEAMiD;AACjD,6FAQmD;AACnD,mEAAuE;AACvE,6DAAoE;AACpE,yDAGwC;AACxC,yDAA8E;AAE9E,2FAA2F;AAC3F,
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../../../src/test/attachment-host/native.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type AxiosInstance } from "axios";
|
|
2
2
|
import { type UploadTokenClaims } from "../../utils/upload-token";
|
|
3
|
-
export declare function nativeUploadToken(client: AxiosInstance, field?: string, mode?: string): Promise<string>;
|
|
3
|
+
export declare function nativeUploadToken(client: AxiosInstance, field?: string, mode?: string, slug?: string): Promise<string>;
|
|
4
4
|
export declare function findUploadToken(value: unknown, field: string): string | undefined;
|
|
5
5
|
export interface UploadedAttachment {
|
|
6
6
|
key: string;
|
|
@@ -11,9 +11,9 @@ const chai_1 = require("chai");
|
|
|
11
11
|
const upload_token_1 = require("../../utils/upload-token");
|
|
12
12
|
const PRESIGN_URL = "/api/files/presign";
|
|
13
13
|
const HTTP_OK = 200;
|
|
14
|
-
async function nativeUploadToken(client, field = "file", mode = "new") {
|
|
14
|
+
async function nativeUploadToken(client, field = "file", mode = "new", slug = "/nativefiles") {
|
|
15
15
|
const response = await client.get("/dms/pagelayout", {
|
|
16
|
-
params: { slug
|
|
16
|
+
params: { slug },
|
|
17
17
|
});
|
|
18
18
|
(0, chai_1.expect)(response.status, JSON.stringify(response.data)).to.equal(HTTP_OK);
|
|
19
19
|
const form = response.data.components.content.options.formComponents[mode];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/test/helpers/attachments.ts"],"names":[],"mappings":";;;;;AAWA,
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../../../src/test/helpers/attachments.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const chai_1 = require("chai");
|
|
4
|
+
const attachments_1 = require("../../helpers/attachments");
|
|
5
|
+
const auth_1 = require("../../helpers/auth");
|
|
6
|
+
const db_1 = require("../../helpers/db");
|
|
7
|
+
const PRESIGN_URL = "/api/files/presign";
|
|
8
|
+
const LOCATION = "/api/native-attachments";
|
|
9
|
+
const PROFILE_SLUG = "/settings/user/profile";
|
|
10
|
+
const AVATAR_FIELD = "profile-avatar#avatar";
|
|
11
|
+
const FIELD_MAX_SIZE = 64;
|
|
12
|
+
const HTTP_OK = 200;
|
|
13
|
+
const HTTP_BAD_REQUEST = 400;
|
|
14
|
+
const HTTP_FORBIDDEN = 403;
|
|
15
|
+
async function ownerClient() {
|
|
16
|
+
const user = await (0, auth_1.registerUser)({ owner: true });
|
|
17
|
+
return (0, auth_1.authorizedClient)(user.accessToken);
|
|
18
|
+
}
|
|
19
|
+
async function presign(client, uploadToken, { mimetype, size }) {
|
|
20
|
+
return client.post(PRESIGN_URL, {
|
|
21
|
+
filename: "upload.bin",
|
|
22
|
+
size,
|
|
23
|
+
mimetype,
|
|
24
|
+
uploadToken,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async function presignTableField(client, request) {
|
|
28
|
+
return presign(client, await (0, attachments_1.nativeUploadToken)(client, request.field), request);
|
|
29
|
+
}
|
|
30
|
+
async function avatarToken(client) {
|
|
31
|
+
const layout = await client.get("/dms/pagelayout", {
|
|
32
|
+
params: { slug: PROFILE_SLUG },
|
|
33
|
+
});
|
|
34
|
+
(0, chai_1.expect)(layout.status, JSON.stringify(layout.data)).to.equal(HTTP_OK);
|
|
35
|
+
const token = (0, attachments_1.findUploadToken)(layout.data, AVATAR_FIELD);
|
|
36
|
+
if (!token)
|
|
37
|
+
throw new Error("No upload token for the profile avatar");
|
|
38
|
+
return token;
|
|
39
|
+
}
|
|
40
|
+
const ACCEPTED = [
|
|
41
|
+
{ field: "file", mimetype: "text/plain", size: FIELD_MAX_SIZE },
|
|
42
|
+
{ field: "files", mimetype: "application/pdf", size: 1024 },
|
|
43
|
+
{ field: "image", mimetype: "image/jpeg", size: 1024 },
|
|
44
|
+
{ field: "gallery", mimetype: "image/png", size: FIELD_MAX_SIZE },
|
|
45
|
+
];
|
|
46
|
+
const REJECTED = [
|
|
47
|
+
{ field: "file", mimetype: "text/plain", size: FIELD_MAX_SIZE + 1 },
|
|
48
|
+
{ field: "image", mimetype: "text/plain", size: 16 },
|
|
49
|
+
{ field: "gallery", mimetype: "image/jpeg", size: 16 },
|
|
50
|
+
{ field: "gallery", mimetype: "image/png", size: FIELD_MAX_SIZE + 1 },
|
|
51
|
+
];
|
|
52
|
+
describe("[integration] native field constraints at presign", () => {
|
|
53
|
+
beforeEach(db_1.resetDatabase);
|
|
54
|
+
it("presigns uploads that satisfy the table-view column constraints", async () => {
|
|
55
|
+
const client = await ownerClient();
|
|
56
|
+
for (const request of ACCEPTED) {
|
|
57
|
+
const response = await presignTableField(client, request);
|
|
58
|
+
(0, chai_1.expect)(response.status, JSON.stringify(request)).to.equal(HTTP_OK);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
it("rejects uploads that break the table-view column constraints with 400", async () => {
|
|
62
|
+
const client = await ownerClient();
|
|
63
|
+
for (const request of REJECTED) {
|
|
64
|
+
const response = await presignTableField(client, request);
|
|
65
|
+
(0, chai_1.expect)(response.status, JSON.stringify(request)).to.equal(HTTP_BAD_REQUEST);
|
|
66
|
+
(0, chai_1.expect)(String(response.data)).to.match(/^Upload rejected: /);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
it("applies a standalone form field's own constraints", async () => {
|
|
70
|
+
const client = await ownerClient();
|
|
71
|
+
const token = await avatarToken(client);
|
|
72
|
+
const accepted = await presign(client, token, {
|
|
73
|
+
mimetype: "image/png",
|
|
74
|
+
size: 16,
|
|
75
|
+
});
|
|
76
|
+
(0, chai_1.expect)(accepted.status, JSON.stringify(accepted.data)).to.equal(HTTP_OK);
|
|
77
|
+
const rejected = await presign(client, token, {
|
|
78
|
+
mimetype: "text/plain",
|
|
79
|
+
size: 16,
|
|
80
|
+
});
|
|
81
|
+
(0, chai_1.expect)(rejected.status).to.equal(HTTP_BAD_REQUEST);
|
|
82
|
+
(0, chai_1.expect)(String(rejected.data)).to.contain("image/png");
|
|
83
|
+
});
|
|
84
|
+
it("still rejects at promotion a key staged through a laxer field", async () => {
|
|
85
|
+
const client = await ownerClient();
|
|
86
|
+
const upload = await (0, attachments_1.uploadAttachment)({
|
|
87
|
+
client,
|
|
88
|
+
content: Buffer.from("not an image"),
|
|
89
|
+
mimetype: "text/plain",
|
|
90
|
+
claims: {},
|
|
91
|
+
filename: "note.txt",
|
|
92
|
+
token: await (0, attachments_1.nativeUploadToken)(client, "files"),
|
|
93
|
+
});
|
|
94
|
+
const saved = await client.post(`${LOCATION}/new`, {
|
|
95
|
+
gallery: [{ key: upload.key }],
|
|
96
|
+
});
|
|
97
|
+
(0, chai_1.expect)(saved.status, JSON.stringify(saved.data)).to.equal(HTTP_FORBIDDEN);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=field-constraints.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-constraints.test.js","sourceRoot":"","sources":["../../../../src/test/integration/files/field-constraints.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const interface_file_storage_1 = require("@antelopejs/interface-file-storage");
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const chai_1 = require("chai");
|
|
9
|
+
const attachments_1 = require("../../helpers/attachments");
|
|
10
|
+
const auth_1 = require("../../helpers/auth");
|
|
11
|
+
const db_1 = require("../../helpers/db");
|
|
12
|
+
const CONTENT = Buffer.from("page-mode form file");
|
|
13
|
+
const METADATA = "/api/files/metadata";
|
|
14
|
+
const PRESIGN_URL = "/api/files/presign";
|
|
15
|
+
const LOCATION = "/api/native-attachments";
|
|
16
|
+
const FILE_FIELD = `${LOCATION}#file`;
|
|
17
|
+
const TABLE_SLUG = "/nativefiles";
|
|
18
|
+
const PROFILE_SLUG = "/settings/user/profile";
|
|
19
|
+
async function ownerClient() {
|
|
20
|
+
const owner = await (0, auth_1.registerUser)({ owner: true });
|
|
21
|
+
return (0, auth_1.authorizedClient)(owner.accessToken);
|
|
22
|
+
}
|
|
23
|
+
async function formPageSlug(client, kind) {
|
|
24
|
+
const layout = await client.get("/dms/pagelayout", {
|
|
25
|
+
params: { slug: TABLE_SLUG },
|
|
26
|
+
});
|
|
27
|
+
(0, chai_1.expect)(layout.status, JSON.stringify(layout.data)).to.equal(200);
|
|
28
|
+
return layout.data.components.content.options.formPages[kind];
|
|
29
|
+
}
|
|
30
|
+
async function subPageUploadToken(client, slug) {
|
|
31
|
+
const layout = await client.get("/dms/pagelayout", { params: { slug } });
|
|
32
|
+
(0, chai_1.expect)(layout.status, JSON.stringify(layout.data)).to.equal(200);
|
|
33
|
+
const token = (0, attachments_1.findUploadToken)(layout.data.components.form, FILE_FIELD);
|
|
34
|
+
if (!token)
|
|
35
|
+
throw new Error(`No upload token on ${slug}`);
|
|
36
|
+
return token;
|
|
37
|
+
}
|
|
38
|
+
async function stageFrom(client, slug) {
|
|
39
|
+
const upload = await (0, attachments_1.uploadAttachment)({
|
|
40
|
+
client,
|
|
41
|
+
content: CONTENT,
|
|
42
|
+
mimetype: "text/plain",
|
|
43
|
+
claims: {},
|
|
44
|
+
filename: "file.txt",
|
|
45
|
+
token: await subPageUploadToken(client, slug),
|
|
46
|
+
});
|
|
47
|
+
return upload.key;
|
|
48
|
+
}
|
|
49
|
+
async function storedUrl(client, key) {
|
|
50
|
+
const promoted = await client.get(METADATA, {
|
|
51
|
+
params: { resourceKey: (0, interface_file_storage_1.stripStagingPrefix)(key) },
|
|
52
|
+
});
|
|
53
|
+
(0, chai_1.expect)(promoted.status, JSON.stringify(promoted.data)).to.equal(200);
|
|
54
|
+
return promoted.data.url;
|
|
55
|
+
}
|
|
56
|
+
describe("[integration] native files submitted from page-mode TableView forms", () => {
|
|
57
|
+
beforeEach(db_1.resetDatabase);
|
|
58
|
+
it("promotes a file staged from the table's new form sub-page", async () => {
|
|
59
|
+
const client = await ownerClient();
|
|
60
|
+
const key = await stageFrom(client, await formPageSlug(client, "new"));
|
|
61
|
+
const saved = await client.post(`${LOCATION}/new`, { file: key });
|
|
62
|
+
(0, chai_1.expect)(saved.status, JSON.stringify(saved.data)).to.equal(200);
|
|
63
|
+
await storedUrl(client, key);
|
|
64
|
+
});
|
|
65
|
+
it("replaces a file from the table's edit form sub-page and cleans the old one", async () => {
|
|
66
|
+
const client = await ownerClient();
|
|
67
|
+
const createdKey = await stageFrom(client, await formPageSlug(client, "new"));
|
|
68
|
+
const created = await client.post(`${LOCATION}/new`, { file: createdKey });
|
|
69
|
+
(0, chai_1.expect)(created.status, JSON.stringify(created.data)).to.equal(200);
|
|
70
|
+
const createdUrl = await storedUrl(client, createdKey);
|
|
71
|
+
const editedKey = await stageFrom(client, await formPageSlug(client, "edit"));
|
|
72
|
+
const edited = await client.put(`${LOCATION}/edit`, { file: editedKey }, { params: { id: created.data[0] } });
|
|
73
|
+
(0, chai_1.expect)(edited.status, JSON.stringify(edited.data)).to.equal(200);
|
|
74
|
+
await storedUrl(client, editedKey);
|
|
75
|
+
(0, chai_1.expect)((await axios_1.default.get(createdUrl, { validateStatus: () => true })).status, "the replaced file is cleaned up").to.equal(404);
|
|
76
|
+
});
|
|
77
|
+
it("still denies a file staged by a component that does not write to the controller", async () => {
|
|
78
|
+
const client = await ownerClient();
|
|
79
|
+
const layout = await client.get("/dms/pagelayout", {
|
|
80
|
+
params: { slug: PROFILE_SLUG },
|
|
81
|
+
});
|
|
82
|
+
(0, chai_1.expect)(layout.status, JSON.stringify(layout.data)).to.equal(200);
|
|
83
|
+
const avatar = await (0, attachments_1.uploadAttachment)({
|
|
84
|
+
client,
|
|
85
|
+
content: CONTENT,
|
|
86
|
+
mimetype: "image/png",
|
|
87
|
+
claims: {},
|
|
88
|
+
filename: "avatar.png",
|
|
89
|
+
token: (0, attachments_1.findUploadToken)(layout.data, "profile-avatar#avatar"),
|
|
90
|
+
});
|
|
91
|
+
const foreign = await client.post(`${LOCATION}/new`, {
|
|
92
|
+
image: { key: avatar.key },
|
|
93
|
+
});
|
|
94
|
+
(0, chai_1.expect)(foreign.status).to.equal(403);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe("[integration] saving a native file that was never stored", () => {
|
|
98
|
+
beforeEach(db_1.resetDatabase);
|
|
99
|
+
it("answers 400 without leaking the storage key", async () => {
|
|
100
|
+
const client = await ownerClient();
|
|
101
|
+
const presigned = await client.post(PRESIGN_URL, {
|
|
102
|
+
filename: "never-uploaded.txt",
|
|
103
|
+
size: CONTENT.byteLength,
|
|
104
|
+
mimetype: "text/plain",
|
|
105
|
+
uploadToken: await (0, attachments_1.nativeUploadToken)(client),
|
|
106
|
+
});
|
|
107
|
+
(0, chai_1.expect)(presigned.status, JSON.stringify(presigned.data)).to.equal(200);
|
|
108
|
+
const key = presigned.data.resourceKey;
|
|
109
|
+
const saved = await client.post(`${LOCATION}/new`, { file: key });
|
|
110
|
+
(0, chai_1.expect)(saved.status, JSON.stringify(saved.data)).to.equal(400);
|
|
111
|
+
(0, chai_1.expect)(JSON.stringify(saved.data)).to.not.include((0, interface_file_storage_1.stripStagingPrefix)(key));
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=page-mode-form-files.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-mode-form-files.test.js","sourceRoot":"","sources":["../../../../src/test/integration/files/page-mode-form-files.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const interface_file_storage_1 = require("@antelopejs/interface-file-storage");
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const chai_1 = require("chai");
|
|
9
|
+
const attachments_1 = require("../../helpers/attachments");
|
|
10
|
+
const auth_1 = require("../../helpers/auth");
|
|
11
|
+
const db_1 = require("../../helpers/db");
|
|
12
|
+
const CONTENT = Buffer.from("resource-form file");
|
|
13
|
+
const METADATA = "/api/files/metadata";
|
|
14
|
+
const PRESIGN_URL = "/api/files/presign";
|
|
15
|
+
const LOCATION = "/api/native-attachments";
|
|
16
|
+
const FILE_FIELD = `${LOCATION}#file`;
|
|
17
|
+
const NEW_FORM_SLUG = "/nativefiles-new-form";
|
|
18
|
+
const EDIT_FORM_SLUG = "/nativefiles-edit-form";
|
|
19
|
+
const PROFILE_SLUG = "/settings/user/profile";
|
|
20
|
+
const FIELD_MAX_SIZE = 64;
|
|
21
|
+
async function ownerClient() {
|
|
22
|
+
const owner = await (0, auth_1.registerUser)({ owner: true });
|
|
23
|
+
return (0, auth_1.authorizedClient)(owner.accessToken);
|
|
24
|
+
}
|
|
25
|
+
async function formUploadToken(client, slug) {
|
|
26
|
+
const layout = await client.get("/dms/pagelayout", { params: { slug } });
|
|
27
|
+
(0, chai_1.expect)(layout.status, JSON.stringify(layout.data)).to.equal(200);
|
|
28
|
+
const token = (0, attachments_1.findUploadToken)(layout.data.components.content, FILE_FIELD);
|
|
29
|
+
if (!token)
|
|
30
|
+
throw new Error(`No upload token on ${slug}`);
|
|
31
|
+
return token;
|
|
32
|
+
}
|
|
33
|
+
async function stageFrom(client, slug) {
|
|
34
|
+
const upload = await (0, attachments_1.uploadAttachment)({
|
|
35
|
+
client,
|
|
36
|
+
content: CONTENT,
|
|
37
|
+
mimetype: "text/plain",
|
|
38
|
+
claims: {},
|
|
39
|
+
filename: "file.txt",
|
|
40
|
+
token: await formUploadToken(client, slug),
|
|
41
|
+
});
|
|
42
|
+
return upload.key;
|
|
43
|
+
}
|
|
44
|
+
async function storedUrl(client, key) {
|
|
45
|
+
const promoted = await client.get(METADATA, {
|
|
46
|
+
params: { resourceKey: (0, interface_file_storage_1.stripStagingPrefix)(key) },
|
|
47
|
+
});
|
|
48
|
+
(0, chai_1.expect)(promoted.status, JSON.stringify(promoted.data)).to.equal(200);
|
|
49
|
+
return promoted.data.url;
|
|
50
|
+
}
|
|
51
|
+
describe("[integration] native files submitted from ResourceForm blocks", () => {
|
|
52
|
+
beforeEach(db_1.resetDatabase);
|
|
53
|
+
it("promotes a file staged from a new ResourceForm", async () => {
|
|
54
|
+
const client = await ownerClient();
|
|
55
|
+
const key = await stageFrom(client, NEW_FORM_SLUG);
|
|
56
|
+
const saved = await client.post(`${LOCATION}/new`, { file: key });
|
|
57
|
+
(0, chai_1.expect)(saved.status, JSON.stringify(saved.data)).to.equal(200);
|
|
58
|
+
await storedUrl(client, key);
|
|
59
|
+
});
|
|
60
|
+
it("promotes a file staged from an edit ResourceForm over a TableView's row", async () => {
|
|
61
|
+
const client = await ownerClient();
|
|
62
|
+
const tableKey = (await (0, attachments_1.uploadAttachment)({
|
|
63
|
+
client,
|
|
64
|
+
content: CONTENT,
|
|
65
|
+
mimetype: "text/plain",
|
|
66
|
+
claims: {},
|
|
67
|
+
filename: "table.txt",
|
|
68
|
+
token: await (0, attachments_1.nativeUploadToken)(client),
|
|
69
|
+
})).key;
|
|
70
|
+
const created = await client.post(`${LOCATION}/new`, { file: tableKey });
|
|
71
|
+
(0, chai_1.expect)(created.status, JSON.stringify(created.data)).to.equal(200);
|
|
72
|
+
const tableUrl = await storedUrl(client, tableKey);
|
|
73
|
+
const formKey = await stageFrom(client, EDIT_FORM_SLUG);
|
|
74
|
+
const edited = await client.put(`${LOCATION}/edit`, { file: formKey }, { params: { id: created.data[0] } });
|
|
75
|
+
(0, chai_1.expect)(edited.status, JSON.stringify(edited.data)).to.equal(200);
|
|
76
|
+
await storedUrl(client, formKey);
|
|
77
|
+
(0, chai_1.expect)((await axios_1.default.get(tableUrl, { validateStatus: () => true })).status, "the replaced file is cleaned up").to.equal(404);
|
|
78
|
+
});
|
|
79
|
+
it("deletes a row holding a ResourceForm file through the shared delete route", async () => {
|
|
80
|
+
const client = await ownerClient();
|
|
81
|
+
const key = await stageFrom(client, NEW_FORM_SLUG);
|
|
82
|
+
const saved = await client.post(`${LOCATION}/new`, { file: key });
|
|
83
|
+
(0, chai_1.expect)(saved.status, JSON.stringify(saved.data)).to.equal(200);
|
|
84
|
+
const url = await storedUrl(client, key);
|
|
85
|
+
const removed = await client.delete(`${LOCATION}/delete`, {
|
|
86
|
+
params: { id: saved.data[0] },
|
|
87
|
+
});
|
|
88
|
+
(0, chai_1.expect)(removed.status, JSON.stringify(removed.data)).to.equal(200);
|
|
89
|
+
(0, chai_1.expect)((await axios_1.default.get(url, { validateStatus: () => true })).status).to.equal(404);
|
|
90
|
+
});
|
|
91
|
+
it("still denies a file staged by a component that does not write to the controller", async () => {
|
|
92
|
+
const client = await ownerClient();
|
|
93
|
+
const layout = await client.get("/dms/pagelayout", {
|
|
94
|
+
params: { slug: PROFILE_SLUG },
|
|
95
|
+
});
|
|
96
|
+
(0, chai_1.expect)(layout.status, JSON.stringify(layout.data)).to.equal(200);
|
|
97
|
+
const avatar = await (0, attachments_1.uploadAttachment)({
|
|
98
|
+
client,
|
|
99
|
+
content: CONTENT,
|
|
100
|
+
mimetype: "image/png",
|
|
101
|
+
claims: {},
|
|
102
|
+
filename: "avatar.png",
|
|
103
|
+
token: (0, attachments_1.findUploadToken)(layout.data, "profile-avatar#avatar"),
|
|
104
|
+
});
|
|
105
|
+
const foreign = await client.post(`${LOCATION}/new`, {
|
|
106
|
+
image: { key: avatar.key },
|
|
107
|
+
});
|
|
108
|
+
(0, chai_1.expect)(foreign.status).to.equal(403);
|
|
109
|
+
});
|
|
110
|
+
it("applies the column's constraints at presign for a ResourceForm field", async () => {
|
|
111
|
+
const client = await ownerClient();
|
|
112
|
+
const response = await client.post(PRESIGN_URL, {
|
|
113
|
+
filename: "large.txt",
|
|
114
|
+
size: FIELD_MAX_SIZE + 1,
|
|
115
|
+
mimetype: "text/plain",
|
|
116
|
+
uploadToken: await formUploadToken(client, NEW_FORM_SLUG),
|
|
117
|
+
});
|
|
118
|
+
(0, chai_1.expect)(response.status).to.equal(400);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=resource-form-files.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-form-files.test.js","sourceRoot":"","sources":["../../../../src/test/integration/files/resource-form-files.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|