@antelopejs/dms 0.5.2 → 0.5.3

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/attachments/access.d.ts +1 -0
  3. package/dist/attachments/access.js +7 -3
  4. package/dist/attachments/access.js.map +1 -1
  5. package/dist/attachments/constraints.d.ts +4 -0
  6. package/dist/attachments/constraints.js +28 -0
  7. package/dist/attachments/constraints.js.map +1 -0
  8. package/dist/attachments/save.js +23 -12
  9. package/dist/attachments/save.js.map +1 -1
  10. package/dist/attachments/uploads.js +2 -0
  11. package/dist/attachments/uploads.js.map +1 -1
  12. package/dist/implementations/dms-base/search-route.js +3 -4
  13. package/dist/implementations/dms-base/search-route.js.map +1 -1
  14. package/dist/test/attachment-host/native.d.ts +25 -0
  15. package/dist/test/attachment-host/native.js +54 -1
  16. package/dist/test/attachment-host/native.js.map +1 -1
  17. package/dist/test/helpers/attachments.d.ts +1 -1
  18. package/dist/test/helpers/attachments.js +2 -2
  19. package/dist/test/helpers/attachments.js.map +1 -1
  20. package/dist/test/integration/files/field-constraints.test.d.ts +1 -0
  21. package/dist/test/integration/files/field-constraints.test.js +100 -0
  22. package/dist/test/integration/files/field-constraints.test.js.map +1 -0
  23. package/dist/test/integration/files/page-mode-form-files.test.d.ts +1 -0
  24. package/dist/test/integration/files/page-mode-form-files.test.js +114 -0
  25. package/dist/test/integration/files/page-mode-form-files.test.js.map +1 -0
  26. package/dist/test/integration/files/resource-form-files.test.d.ts +1 -0
  27. package/dist/test/integration/files/resource-form-files.test.js +121 -0
  28. package/dist/test/integration/files/resource-form-files.test.js.map +1 -0
  29. package/dist/test/integration/files/shared-controller-files.test.d.ts +1 -0
  30. package/dist/test/integration/files/shared-controller-files.test.js +136 -0
  31. package/dist/test/integration/files/shared-controller-files.test.js.map +1 -0
  32. package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.d.ts +1 -0
  33. package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js +113 -0
  34. package/dist/test/unit/implementations/dms-base/table-view-shared-controller.test.js.map +1 -0
  35. package/dist/test/unit/interfaces/dms-base/resource-form.test.js +19 -0
  36. package/dist/test/unit/interfaces/dms-base/resource-form.test.js.map +1 -1
  37. package/dist/test/unit/interfaces/dms-base/table-view-tenant-gate.test.js +2 -2
  38. package/dist/test/unit/interfaces/dms-base/table-view-tenant-gate.test.js.map +1 -1
  39. package/frontend-vue/layers/dms-ui/app/components/form/components/File.vue +50 -21
  40. package/frontend-vue/layers/dms-ui/app/components/form/components/Image.vue +54 -21
  41. package/frontend-vue/layers/dms-ui/app/components/form/components/Relation.vue +4 -3
  42. package/frontend-vue/layers/dms-ui/app/composables/form/useUploadWithProgress.ts +44 -3
  43. package/frontend-vue/layers/dms-ui/app/utils/metadataRetry.ts +47 -0
  44. package/frontend-vue/layers/dms-ui/i18n/locales/ui-en-GB.json +3 -1
  45. package/frontend-vue/layers/dms-ui/i18n/locales/ui-fr-FR.json +3 -1
  46. package/frontend-vue/tests/file-unavailable.test.ts +107 -0
  47. package/frontend-vue/tests/image-hydration-ids.test.ts +87 -0
  48. package/frontend-vue/tests/image-reference-preservation.test.ts +12 -2
  49. package/frontend-vue/tests/metadata-retry.test.ts +187 -0
  50. package/frontend-vue/tests/upload-forbidden-headers.test.ts +52 -0
  51. package/package.json +2 -2
@@ -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,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,136 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
4
+ const interface_file_storage_1 = require("@antelopejs/interface-file-storage");
5
+ const chai_1 = require("chai");
6
+ const constants_1 = require("@antelopejs/interface-dms/constants");
7
+ const db_1 = require("@antelopejs/interface-dms/db");
8
+ const upload_token_1 = require("../../../utils/upload-token");
9
+ const attachments_1 = require("../../helpers/attachments");
10
+ const auth_1 = require("../../helpers/auth");
11
+ const db_2 = require("../../helpers/db");
12
+ const CONTENT = Buffer.from("shared-controller file");
13
+ const METADATA = "/api/files/metadata";
14
+ const LOCATION = "/api/native-attachments";
15
+ const FIRST_TABLE_SLUG = "/nativefiles";
16
+ const LAST_TABLE_SLUG = "/nativefiles-secondary";
17
+ const PROFILE_SLUG = "/settings/user/profile";
18
+ const RELATION_INPUT = `${LOCATION}/form/relation`;
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 stageFrom(client, slug) {
24
+ const token = await (0, attachments_1.nativeUploadToken)(client, "file", "new", slug);
25
+ const upload = await (0, attachments_1.uploadAttachment)({
26
+ client,
27
+ content: CONTENT,
28
+ mimetype: "text/plain",
29
+ claims: {},
30
+ filename: "file.txt",
31
+ token,
32
+ });
33
+ return upload.key;
34
+ }
35
+ async function tableClaims(client, slug) {
36
+ const claims = (0, upload_token_1.verifyUploadToken)(await (0, attachments_1.nativeUploadToken)(client, "file", "new", slug));
37
+ if (!claims?.pageId || !claims.componentId)
38
+ throw new Error(`No native claims on ${slug}`);
39
+ return { pageId: claims.pageId, componentId: claims.componentId };
40
+ }
41
+ describe("[integration] native files on a data controller shared by several TableViews", () => {
42
+ beforeEach(db_2.resetDatabase);
43
+ for (const slug of [FIRST_TABLE_SLUG, LAST_TABLE_SLUG]) {
44
+ it(`promotes a file staged from the TableView on ${slug}`, async () => {
45
+ const client = await ownerClient();
46
+ const key = await stageFrom(client, slug);
47
+ const saved = await client.post(`${LOCATION}/new`, { file: key });
48
+ (0, chai_1.expect)(saved.status, JSON.stringify(saved.data)).to.equal(200);
49
+ const promoted = await client.get(METADATA, {
50
+ params: { resourceKey: (0, interface_file_storage_1.stripStagingPrefix)(key) },
51
+ });
52
+ (0, chai_1.expect)(promoted.status, JSON.stringify(promoted.data)).to.equal(200);
53
+ });
54
+ }
55
+ it("still denies a file staged by a component that is no TableView of the controller", async () => {
56
+ const client = await ownerClient();
57
+ const layout = await client.get("/dms/pagelayout", {
58
+ params: { slug: PROFILE_SLUG },
59
+ });
60
+ (0, chai_1.expect)(layout.status, JSON.stringify(layout.data)).to.equal(200);
61
+ const token = (0, attachments_1.findUploadToken)(layout.data, "profile-avatar#avatar");
62
+ (0, chai_1.expect)(token).to.be.a("string");
63
+ const image = await (0, attachments_1.uploadAttachment)({
64
+ client,
65
+ content: CONTENT,
66
+ mimetype: "image/png",
67
+ claims: {},
68
+ filename: "avatar.png",
69
+ token,
70
+ });
71
+ const foreign = await client.post(`${LOCATION}/new`, {
72
+ image: { key: image.key },
73
+ });
74
+ (0, chai_1.expect)(foreign.status).to.equal(403);
75
+ (0, chai_1.expect)((await client.get(METADATA, { params: { resourceKey: image.key } }))
76
+ .status).to.equal(200);
77
+ });
78
+ it("lets a user granted add on the first TableView only create a row with an image", async () => {
79
+ const owner = await ownerClient();
80
+ const firstTable = await tableClaims(owner, FIRST_TABLE_SLUG);
81
+ const roles = (0, interface_database_decorators_1.GetModel)(db_1.RoleModel, constants_1.DEFAULT_TENANT_ID);
82
+ const [firstTableEditor] = await roles.insert({
83
+ name: "First table editor",
84
+ permissions: [
85
+ firstTable.pageId,
86
+ firstTable.componentId,
87
+ `${firstTable.componentId}.add`,
88
+ ],
89
+ });
90
+ const editor = await (0, auth_1.registerUser)({ roles_ids: [firstTableEditor] });
91
+ const client = (0, auth_1.authorizedClient)(editor.accessToken);
92
+ const image = await (0, attachments_1.uploadAttachment)({
93
+ client,
94
+ content: CONTENT,
95
+ mimetype: "image/png",
96
+ claims: {},
97
+ filename: "image.png",
98
+ token: await (0, attachments_1.nativeUploadToken)(client, "image", "new", FIRST_TABLE_SLUG),
99
+ });
100
+ const created = await client.post(`${LOCATION}/new`, { image: { en: { key: image.key } } }, { headers: { "x-content-language": "*" } });
101
+ (0, chai_1.expect)(created.status, JSON.stringify(created.data)).to.equal(200);
102
+ const promoted = await client.get(METADATA, {
103
+ params: { resourceKey: (0, interface_file_storage_1.stripStagingPrefix)(image.key) },
104
+ });
105
+ (0, chai_1.expect)(promoted.status, JSON.stringify(promoted.data)).to.equal(200);
106
+ });
107
+ it("refuses a user granted add on none of the controller's TableViews", async () => {
108
+ const owner = await ownerClient();
109
+ const firstTable = await tableClaims(owner, FIRST_TABLE_SLUG);
110
+ const lastTable = await tableClaims(owner, LAST_TABLE_SLUG);
111
+ const [viewer] = await (0, interface_database_decorators_1.GetModel)(db_1.RoleModel, constants_1.DEFAULT_TENANT_ID).insert({
112
+ name: "Table viewer",
113
+ permissions: [
114
+ firstTable.pageId,
115
+ firstTable.componentId,
116
+ lastTable.pageId,
117
+ lastTable.componentId,
118
+ ],
119
+ });
120
+ const user = await (0, auth_1.registerUser)({ roles_ids: [viewer] });
121
+ const refused = await (0, auth_1.authorizedClient)(user.accessToken).post(`${LOCATION}/new`, { readerId: "table-viewer" });
122
+ (0, chai_1.expect)(refused.status).to.equal(403);
123
+ });
124
+ it("offers a relation's inline add to the add grant of every TableView", async () => {
125
+ const owner = await ownerClient();
126
+ const firstTable = await tableClaims(owner, FIRST_TABLE_SLUG);
127
+ const lastTable = await tableClaims(owner, LAST_TABLE_SLUG);
128
+ const relation = await owner.get(RELATION_INPUT);
129
+ (0, chai_1.expect)(relation.status, JSON.stringify(relation.data)).to.equal(200);
130
+ (0, chai_1.expect)(relation.data.options.addPermissionIds).to.have.members([
131
+ `${firstTable.componentId}.add`,
132
+ `${lastTable.componentId}.add`,
133
+ ]);
134
+ });
135
+ });
136
+ //# sourceMappingURL=shared-controller-files.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-controller-files.test.js","sourceRoot":"","sources":["../../../../src/test/integration/files/shared-controller-files.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const interface_api_1 = require("@antelopejs/interface-api");
37
+ const interface_core_1 = require("@antelopejs/interface-core");
38
+ const chai_1 = require("chai");
39
+ const search_route_1 = require("../../../../implementations/dms-base/search-route");
40
+ const permissionsImpl = __importStar(require("../../../../implementations/dms/permissions"));
41
+ const permissionsInterface = __importStar(require("@antelopejs/interface-dms/permissions"));
42
+ const table_view_1 = require("@antelopejs/interface-dms/base/table-view");
43
+ const ARCHIVE_FIELD = "archived";
44
+ const VIEW_ARCHIVED_ACTION = "viewArchived";
45
+ const ARCHIVING_TABLE_PERMISSION = "pages.shared.archiving.table.viewArchived";
46
+ const HTTP_FORBIDDEN = 403;
47
+ function stampedBuilder(permissionIds = {}) {
48
+ return {
49
+ getAction: (actionId) => permissionIds[actionId]
50
+ ? { permissionId: permissionIds[actionId] }
51
+ : undefined,
52
+ };
53
+ }
54
+ function requestShowingArchived() {
55
+ return {
56
+ url: new URL("http://localhost/list?showArchived=true"),
57
+ };
58
+ }
59
+ async function rejectionOf(promise) {
60
+ try {
61
+ await promise;
62
+ }
63
+ catch (error) {
64
+ (0, chai_1.expect)(error).to.be.instanceOf(interface_api_1.HTTPResult);
65
+ return error;
66
+ }
67
+ throw new Error("expected the archive filter to refuse");
68
+ }
69
+ describe("[unit] implementations/dms-base — data controller shared by several TableViews", () => {
70
+ const builders = [];
71
+ function sharedController(...tableViews) {
72
+ class Controller {
73
+ }
74
+ const meta = (0, interface_core_1.GetMetadata)(Controller, table_view_1.TableViewMeta);
75
+ meta.setArchiveField(ARCHIVE_FIELD);
76
+ for (const builder of tableViews) {
77
+ builders.push(builder);
78
+ meta.addComponentBuilder(builder);
79
+ }
80
+ return new Controller();
81
+ }
82
+ before(() => {
83
+ (0, interface_core_1.ImplementInterface)(permissionsInterface, permissionsImpl);
84
+ });
85
+ it("keeps every TableView built on the controller", () => {
86
+ const first = stampedBuilder();
87
+ const last = stampedBuilder();
88
+ const instance = sharedController(first, last);
89
+ const meta = (0, interface_core_1.GetMetadata)(instance.constructor, table_view_1.TableViewMeta);
90
+ (0, chai_1.expect)(meta.componentBuilders).to.deep.equal([first, last]);
91
+ });
92
+ it("collects an action's permission from each TableView that stamps it", () => {
93
+ const instance = sharedController(stampedBuilder({ add: "pages.a.table.add" }), stampedBuilder(), stampedBuilder({ add: "pages.b.table.add" }), stampedBuilder({ add: "pages.a.table.add" }));
94
+ const meta = (0, interface_core_1.GetMetadata)(instance.constructor, table_view_1.TableViewMeta);
95
+ (0, chai_1.expect)(meta.actionPermissionIds("add")).to.deep.equal([
96
+ "pages.a.table.add",
97
+ "pages.b.table.add",
98
+ ]);
99
+ });
100
+ it("guards archived rows when only an earlier TableView declares viewArchived", async () => {
101
+ const instance = sharedController(stampedBuilder({ [VIEW_ARCHIVED_ACTION]: ARCHIVING_TABLE_PERMISSION }), stampedBuilder());
102
+ const error = await rejectionOf((0, search_route_1.applyArchiveFilter)(instance, requestShowingArchived(), undefined, new Set(), {}));
103
+ (0, chai_1.expect)(error.getStatus()).to.equal(HTTP_FORBIDDEN);
104
+ });
105
+ it("shows archived rows to a holder of any TableView's viewArchived", async () => {
106
+ const instance = sharedController(stampedBuilder({ [VIEW_ARCHIVED_ACTION]: ARCHIVING_TABLE_PERMISSION }), stampedBuilder({
107
+ [VIEW_ARCHIVED_ACTION]: "pages.shared.other.table.viewArchived",
108
+ }));
109
+ const filters = await (0, search_route_1.applyArchiveFilter)(instance, requestShowingArchived(), undefined, new Set([ARCHIVING_TABLE_PERMISSION]), {});
110
+ (0, chai_1.expect)(filters).to.have.property(ARCHIVE_FIELD);
111
+ });
112
+ });
113
+ //# sourceMappingURL=table-view-shared-controller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-view-shared-controller.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/implementations/dms-base/table-view-shared-controller.test.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ const interface_api_1 = require("@antelopejs/interface-api");
13
13
  const interface_data_api_1 = require("@antelopejs/interface-data-api");
14
14
  const metadata_1 = require("@antelopejs/interface-data-api/metadata");
15
15
  const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
16
+ const interface_core_1 = require("@antelopejs/interface-core");
16
17
  const chai_1 = require("chai");
17
18
  const block_types_1 = require("@antelopejs/interface-dms/base/block-types");
18
19
  const default_types_1 = require("@antelopejs/interface-dms/base/data-types/default-types");
@@ -107,6 +108,24 @@ describe("[unit] interfaces/dms-base/resource-form — a form derived from its t
107
108
  (0, chai_1.expect)(edited.submitUrl).to.equal(`${LOCATION}/edit?id={{params.ticket}}`);
108
109
  (0, chai_1.expect)(edited, "the row token is the form's to resolve, not an option").to.not.have.property("rowId");
109
110
  });
111
+ it("counts among the components writing to the table only when it submits", () => {
112
+ const meta = (0, interface_core_1.GetMetadata)(TicketAPI, meta_1.TableViewMeta);
113
+ const created = (0, resource_form_1.ResourceForm)(TicketAPI, { mode: "new" });
114
+ const edited = (0, resource_form_1.ResourceForm)(TicketAPI, { mode: "edit" });
115
+ const shown = (0, resource_form_1.ResourceForm)(TicketAPI, { mode: "view" });
116
+ const table = (0, factory_1.TableView)(TicketAPI);
117
+ (0, chai_1.expect)(meta.writingComponents).to.include.members([created, edited, table]);
118
+ (0, chai_1.expect)(meta.writingComponents).to.not.include(shown);
119
+ (0, chai_1.expect)(meta.componentBuilders, "a form carries no TableView action permission").to.not.include.members([created, edited]);
120
+ });
121
+ it("counts a TableView's own new and edit forms among the components writing to the table", () => {
122
+ const meta = (0, interface_core_1.GetMetadata)(TicketAPI, meta_1.TableViewMeta);
123
+ const built = meta.resourceFormBuilders.length;
124
+ (0, factory_1.TableView)(TicketAPI);
125
+ (0, chai_1.expect)(meta.resourceFormBuilders
126
+ .slice(built)
127
+ .map((form) => optionsOf(form).submitUrl)).to.deep.equal([`${LOCATION}/new`, `${LOCATION}/edit?id={{params.id}}`]);
128
+ });
110
129
  it("is declared as a block over a table, picked by mode", () => {
111
130
  const declared = (0, block_types_1.ListBlockTypes)().find((block) => block.type === "ResourceForm");
112
131
  (0, chai_1.expect)(declared?.controllerArg).to.equal(true);
@@ -1 +1 @@
1
- {"version":3,"file":"resource-form.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/resource-form.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource-form.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms-base/resource-form.test.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,6DAAuD;AACvD,uEAGwC;AACxC,sEAIiD;AACjD,6FAMmD;AACnD,+DAAyD;AACzD,+BAA8B;AAC9B,4EAA4E;AAC5E,2FAA2F;AAK3F,+EAA8E;AAC9E,yEAGwD;AAExD,2FAAuF;AACvF,6EAAmF;AACnF,oEAAuE;AAEvE,MAAM,MAAM,GAAG,oBAAoB,CAAC;AACpC,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,QAAQ,GAAG,qBAAqB,CAAC;AAGvC,IAAM,MAAM,GAAZ,MAAM,MAAO,SAAQ,qCAAK;CAKzB,CAAA;AAHS;IADP,IAAA,qCAAK,EAAC,QAAQ,CAAC;;qCACM;AAEd;IADP,IAAA,qCAAK,EAAC,QAAQ,CAAC;;yCACU;AAJtB,MAAM;IADX,IAAA,6CAAa,EAAC,KAAK,EAAE,MAAM,CAAC;GACvB,MAAM,CAKX;AACD,MAAM,WAAY,SAAQ,IAAA,8CAAc,EAAC,MAAM,EAAE,KAAK,CAAC;CAAG;AAG1D,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,IAAA,mCAAc,EACpC,MAAM,EACN,wBAAe,CAAC,GAAG,EACnB,IAAA,0BAAU,EAAC,QAAQ,CAAC,CACrB;CAYA,CAAA;AATS;IAFP,IAAA,yBAAc,GAAE;IAChB,IAAA,qCAAK,EAAC,WAAW,CAAC;8BACJ,WAAW;wCAAC;AAInB;IAFP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,gCAAgB,CAAC,UAAU,EAAE,EAAE,CAAC;IAClE,IAAA,iBAAM,EAAC,qBAAU,CAAC,SAAS,CAAC;;wCACP;AAId;IAFP,IAAA,aAAM,EAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,gCAAgB,CAAC,UAAU,EAAE,EAAE,CAAC;IACtE,IAAA,iBAAM,EAAC,qBAAU,CAAC,QAAQ,CAAC;;4CACF;AAftB,SAAS;IADd,IAAA,2CAAsB,GAAE;GACnB,SAAS,CAgBd;AAED,SAAS,SAAS,CAAC,OAElB;IACC,OAAO,OAAO,CAAC,aAAa,EAAE,CAAC,OAA8B,CAAC;AAChE,CAAC;AAED,SAAS,QAAQ,CAAC,OAA4B;IAC5C,OAAQ,OAAO,CAAC,MAAgC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAOD,QAAQ,CAAC,0EAA0E,EAAE,GAAG,EAAE;IACxF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,KAAK,GAAG,IAAA,mBAAS,EAAC,SAAS,CAAC,CAAC,aAAa,EAAE;aAC/C,OAAqC,CAAC;QAEzC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAA,4BAAY,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEpE,IAAA,aAAM,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,MAAM,CAAC,CAAC;QACtD,IAAA,aAAM,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAU,CAAC,IAAI,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,GAAG,EAAE,OAA8B,CAAC;QACxE,IAAA,aAAM,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAA,aAAM,EAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,SAAS,CAAC,IAAA,4BAAY,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,SAAS,CAAC,IAAA,4BAAY,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEnE,IAAA,aAAM,EAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAC9B,IAAI,MAAM,CAAC,IAAI,QAAQ,mCAAmC,CAAC,CAC5D,CAAC;QACF,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,uBAAuB,CAAC,CAAC;QACtE,IAAA,aAAM,EAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAU,CAAC,GAAG,CAAC,CAAC;QACxD,IAAA,aAAM,EAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,sBAAsB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,KAAK,GAAG,IAAA,mBAAS,EAAC,SAAS,CAAC,CAAC,aAAa,EAAE;aAC/C,OAAqC,CAAC;QAEzC,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,OAA8B,CAAC;QACzE,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,wBAAwB,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,KAAK,GAAG,SAAS,CAAC,IAAA,4BAAY,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QAEnE,IAAA,aAAM,EAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAA,aAAM,EACH,KAAK,CAAC,MAAgC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CACzE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAAG,SAAS,CACtB,IAAA,4BAAY,EAAC,SAAS,EAAE;YACtB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,iBAAiB;YACxB,WAAW,EAAE,iBAAiB;YAC9B,KAAK,EAAE,mBAAmB;SAC3B,CAAC,CACH,CAAC;QAEF,IAAA,aAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACjD,IAAA,aAAM,EAAC,MAAM,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QACvD,IAAA,aAAM,EAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,QAAQ,4BAA4B,CAAC,CAAC;QAC3E,IAAA,aAAM,EACJ,MAAM,EACN,uDAAuD,CACxD,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,MAAM,IAAI,GAAG,IAAA,4BAAW,EAAC,SAAS,EAAE,oBAAa,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAA,4BAAY,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,MAAM,GAAG,IAAA,4BAAY,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,IAAA,4BAAY,EAAC,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,IAAA,mBAAS,EAAC,SAAS,CAAC,CAAC;QAEnC,IAAA,aAAM,EAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5E,IAAA,aAAM,EAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrD,IAAA,aAAM,EACJ,IAAI,CAAC,iBAAiB,EACtB,+CAA+C,CAChD,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC/F,MAAM,IAAI,GAAG,IAAA,4BAAW,EAAC,SAAS,EAAE,oBAAa,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC;QAC/C,IAAA,mBAAS,EAAC,SAAS,CAAC,CAAC;QAIrB,IAAA,aAAM,EACJ,IAAI,CAAC,oBAAoB;aACtB,KAAK,CAAC,KAAK,CAAC;aACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAC5C,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,MAAM,EAAE,GAAG,QAAQ,wBAAwB,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,QAAQ,GAAG,IAAA,4BAAc,GAAE,CAAC,IAAI,CACpC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,cAAc,CACzC,CAAC;QAEF,IAAA,aAAM,EAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAA,aAAM,EAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAC3E,IAAA,aAAM,EAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC,EAAE,CAAC,KAAK,CACpE,SAAS,CACV,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -66,9 +66,9 @@ function tableViewInstance(options, permissionId) {
66
66
  meta.setBypassTenantAccessGate();
67
67
  }
68
68
  if (permissionId) {
69
- meta.componentBuilder = {
69
+ meta.addComponentBuilder({
70
70
  getAction: () => ({ permissionId }),
71
- };
71
+ });
72
72
  }
73
73
  return new Controller();
74
74
  }