@appsemble/node-utils 0.29.11 → 0.30.2
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/AppMemberPropertiesError.d.ts +3 -0
- package/AppMemberPropertiesError.js +8 -0
- package/README.md +3 -3
- package/app.d.ts +2 -3
- package/app.js +6 -7
- package/authentication.js +1 -1
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/package.json +3 -3
- package/resource.d.ts +5 -5
- package/resource.js +6 -6
- package/server/controllers/apps/actions/createProxyDeleteController.d.ts +3 -0
- package/server/controllers/apps/actions/createProxyDeleteController.js +5 -0
- package/server/controllers/apps/actions/createProxyGetController.d.ts +3 -0
- package/server/controllers/apps/actions/createProxyGetController.js +5 -0
- package/server/controllers/apps/actions/createProxyPatchController.d.ts +3 -0
- package/server/controllers/apps/actions/createProxyPatchController.js +5 -0
- package/server/controllers/apps/actions/createProxyPostController.d.ts +3 -0
- package/server/controllers/apps/actions/createProxyPostController.js +5 -0
- package/server/controllers/apps/actions/createProxyPutController.d.ts +3 -0
- package/server/controllers/apps/actions/createProxyPutController.js +5 -0
- package/server/controllers/apps/actions/index.d.ts +5 -0
- package/server/controllers/apps/actions/index.js +6 -0
- package/server/controllers/apps/index.d.ts +2 -0
- package/server/controllers/apps/index.js +3 -0
- package/server/controllers/apps/members/current/createGetCurrentAppMemberController.d.ts +3 -0
- package/server/controllers/apps/members/current/createGetCurrentAppMemberController.js +6 -0
- package/server/controllers/apps/members/current/index.d.ts +1 -0
- package/server/controllers/apps/members/current/index.js +2 -0
- package/server/controllers/apps/members/index.d.ts +1 -0
- package/server/controllers/apps/members/index.js +2 -0
- package/server/controllers/common/apps/assets/createGetAppAssetByIdController.d.ts +3 -0
- package/server/controllers/common/apps/assets/createGetAppAssetByIdController.js +37 -0
- package/server/controllers/common/apps/assets/index.d.ts +1 -0
- package/server/controllers/common/apps/assets/index.js +2 -0
- package/server/controllers/common/apps/groups/createGetAppGroupsController.d.ts +3 -0
- package/server/controllers/common/apps/groups/createGetAppGroupsController.js +16 -0
- package/server/controllers/common/apps/groups/index.d.ts +1 -0
- package/server/controllers/common/apps/groups/index.js +2 -0
- package/server/controllers/common/apps/index.d.ts +5 -0
- package/server/controllers/common/apps/index.js +6 -0
- package/server/controllers/common/apps/messages/createGetAppMessagesController.d.ts +3 -0
- package/server/controllers/{appMessages.js → common/apps/messages/createGetAppMessagesController.js} +3 -3
- package/server/controllers/common/apps/messages/index.d.ts +1 -0
- package/server/controllers/common/apps/messages/index.js +2 -0
- package/server/controllers/{appMessages.d.ts → common/apps/resources/createCountAppResourcesController.d.ts} +1 -1
- package/server/controllers/common/apps/resources/createCountAppResourcesController.js +40 -0
- package/server/controllers/common/apps/resources/createCreateAppResourceController.d.ts +15 -0
- package/server/controllers/common/apps/resources/createCreateAppResourceController.js +94 -0
- package/server/controllers/common/apps/resources/createDeleteAppResourceController.d.ts +3 -0
- package/server/controllers/common/apps/resources/createDeleteAppResourceController.js +46 -0
- package/server/controllers/common/apps/resources/createGetAppResourceByIdController.d.ts +3 -0
- package/server/controllers/common/apps/resources/createGetAppResourceByIdController.js +48 -0
- package/server/controllers/common/apps/resources/createQueryAppResourcesController.d.ts +3 -0
- package/server/controllers/common/apps/resources/createQueryAppResourcesController.js +58 -0
- package/server/controllers/common/apps/resources/createUpdateAppResourceController.d.ts +3 -0
- package/server/controllers/common/apps/resources/createUpdateAppResourceController.js +53 -0
- package/server/controllers/common/apps/resources/index.d.ts +6 -0
- package/server/controllers/common/apps/resources/index.js +7 -0
- package/server/controllers/{resources.test.js → common/apps/resources/resources.test.js} +44 -32
- package/server/controllers/common/apps/variables/createGetAppVariablesController.d.ts +3 -0
- package/server/controllers/{appVariables.js → common/apps/variables/createGetAppVariablesController.js} +4 -5
- package/server/controllers/common/apps/variables/index.d.ts +1 -0
- package/server/controllers/common/apps/variables/index.js +2 -0
- package/server/controllers/common/index.d.ts +1 -0
- package/server/controllers/common/index.js +2 -0
- package/server/controllers/index.d.ts +3 -8
- package/server/controllers/index.js +3 -8
- package/server/controllers/main/apps/assets/createCreateAppAssetController.d.ts +3 -0
- package/server/controllers/main/apps/assets/createCreateAppAssetController.js +16 -0
- package/server/controllers/main/apps/assets/index.d.ts +1 -0
- package/server/controllers/main/apps/assets/index.js +2 -0
- package/server/controllers/main/apps/index.d.ts +2 -0
- package/server/controllers/main/apps/index.js +3 -0
- package/server/controllers/main/apps/resources/createDeleteAppSeedResourcesController.d.ts +3 -0
- package/server/controllers/main/apps/resources/createDeleteAppSeedResourcesController.js +15 -0
- package/server/controllers/main/apps/resources/index.d.ts +1 -0
- package/server/controllers/main/apps/resources/index.js +2 -0
- package/server/controllers/main/index.d.ts +1 -0
- package/server/controllers/main/index.js +2 -0
- package/server/types.d.ts +51 -61
- package/server/utils/actions.d.ts +6 -0
- package/server/{controllers/action.js → utils/actions.js} +19 -50
- package/server/utils/resources.d.ts +8 -0
- package/server/utils/resources.js +51 -0
- package/UserPropertiesError.d.ts +0 -3
- package/UserPropertiesError.js +0 -8
- package/server/controllers/action.d.ts +0 -7
- package/server/controllers/appMembers.d.ts +0 -3
- package/server/controllers/appMembers.js +0 -13
- package/server/controllers/appVariables.d.ts +0 -3
- package/server/controllers/assets.d.ts +0 -5
- package/server/controllers/assets.js +0 -66
- package/server/controllers/oauth2Provider.d.ts +0 -3
- package/server/controllers/oauth2Provider.js +0 -7
- package/server/controllers/resources.d.ts +0 -10
- package/server/controllers/resources.js +0 -402
- package/server/controllers/teams.d.ts +0 -3
- package/server/controllers/teams.js +0 -10
- /package/server/controllers/{resources.test.d.ts → common/apps/resources/resources.test.d.ts} +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { assertKoaError } from '@appsemble/node-utils';
|
|
2
|
+
export function createDeleteAppResourceController(options) {
|
|
3
|
+
return async (ctx) => {
|
|
4
|
+
var _a;
|
|
5
|
+
const { pathParams: { appId, resourceId, resourceType }, queryParams: { selectedGroupId }, user: authSubject, } = ctx;
|
|
6
|
+
const { checkAppPermissions, deleteAppResource, getApp, getAppResource } = options;
|
|
7
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
8
|
+
const findOptions = {
|
|
9
|
+
where: {
|
|
10
|
+
id: resourceId,
|
|
11
|
+
type: resourceType,
|
|
12
|
+
AppId: appId,
|
|
13
|
+
GroupId: selectedGroupId !== null && selectedGroupId !== void 0 ? selectedGroupId : null,
|
|
14
|
+
expires: { or: [{ gt: new Date() }, { eq: null }] },
|
|
15
|
+
...(app.demoMode ? { seed: false, ephemeral: true } : {}),
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
const resource = await getAppResource({
|
|
19
|
+
app,
|
|
20
|
+
id: resourceId,
|
|
21
|
+
type: resourceType,
|
|
22
|
+
context: ctx,
|
|
23
|
+
findOptions,
|
|
24
|
+
});
|
|
25
|
+
assertKoaError(!resource, ctx, 404, 'Resource not found');
|
|
26
|
+
await checkAppPermissions({
|
|
27
|
+
context: ctx,
|
|
28
|
+
permissions: [
|
|
29
|
+
((_a = resource.$author) === null || _a === void 0 ? void 0 : _a.id) === authSubject.id
|
|
30
|
+
? `$resource:${resourceType}:own:delete`
|
|
31
|
+
: `$resource:${resourceType}:delete`,
|
|
32
|
+
],
|
|
33
|
+
app,
|
|
34
|
+
groupId: selectedGroupId,
|
|
35
|
+
});
|
|
36
|
+
await deleteAppResource({
|
|
37
|
+
app,
|
|
38
|
+
context: ctx,
|
|
39
|
+
id: resourceId,
|
|
40
|
+
type: resourceType,
|
|
41
|
+
options,
|
|
42
|
+
});
|
|
43
|
+
ctx.status = 204;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=createDeleteAppResourceController.js.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { assertKoaError, getRemapperContext, getResourceDefinition, } from '@appsemble/node-utils';
|
|
2
|
+
import { defaultLocale, remap } from '@appsemble/utils';
|
|
3
|
+
export function createGetAppResourceByIdController(options) {
|
|
4
|
+
return async (ctx) => {
|
|
5
|
+
var _a;
|
|
6
|
+
const { pathParams: { appId, resourceId, resourceType }, queryParams: { selectedGroupId, view }, user: authSubject, } = ctx;
|
|
7
|
+
const { checkAppPermissions, getApp, getAppResource } = options;
|
|
8
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
9
|
+
const findOptions = {
|
|
10
|
+
where: {
|
|
11
|
+
id: resourceId,
|
|
12
|
+
type: resourceType,
|
|
13
|
+
AppId: appId,
|
|
14
|
+
GroupId: selectedGroupId !== null && selectedGroupId !== void 0 ? selectedGroupId : null,
|
|
15
|
+
expires: { or: [{ gt: new Date() }, null] },
|
|
16
|
+
...(app.demoMode ? { seed: false, ephemeral: true } : {}),
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
const resource = await getAppResource({
|
|
20
|
+
app,
|
|
21
|
+
id: resourceId,
|
|
22
|
+
type: resourceType,
|
|
23
|
+
context: ctx,
|
|
24
|
+
findOptions,
|
|
25
|
+
});
|
|
26
|
+
assertKoaError(!resource, ctx, 404, 'Resource not found');
|
|
27
|
+
await checkAppPermissions({
|
|
28
|
+
context: ctx,
|
|
29
|
+
permissions: [
|
|
30
|
+
((_a = resource.$author) === null || _a === void 0 ? void 0 : _a.id) === (authSubject === null || authSubject === void 0 ? void 0 : authSubject.id)
|
|
31
|
+
? `$resource:${resourceType}:own:get`
|
|
32
|
+
: view
|
|
33
|
+
? `$resource:${resourceType}:get:${view}`
|
|
34
|
+
: `$resource:${resourceType}:get`,
|
|
35
|
+
],
|
|
36
|
+
app,
|
|
37
|
+
groupId: selectedGroupId,
|
|
38
|
+
});
|
|
39
|
+
if (view) {
|
|
40
|
+
const context = await getRemapperContext(app, app.definition.defaultLanguage || defaultLocale, options, ctx);
|
|
41
|
+
const resourceDefinition = getResourceDefinition(app.definition, resourceType, ctx, view);
|
|
42
|
+
ctx.body = remap(resourceDefinition.views[view].remap, resource, context);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
ctx.body = resource;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=createGetAppResourceByIdController.js.map
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { getRemapperContext, getResourceDefinition, } from '@appsemble/node-utils';
|
|
2
|
+
import { defaultLocale, remap } from '@appsemble/utils';
|
|
3
|
+
import { generateResourceQuery } from '../../../../utils/resources.js';
|
|
4
|
+
export function createQueryAppResourcesController(options) {
|
|
5
|
+
return async (ctx) => {
|
|
6
|
+
var _a, _b;
|
|
7
|
+
const { pathParams: { appId, resourceType }, queryParams: { $own, $select, $skip, $top, selectedGroupId, view }, user: authSubject, } = ctx;
|
|
8
|
+
const { checkAppPermissions, getApp, getAppResources } = options;
|
|
9
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
10
|
+
const resourceDefinition = getResourceDefinition(app.definition, resourceType, ctx, view);
|
|
11
|
+
const { order, where } = generateResourceQuery(ctx, options, resourceDefinition);
|
|
12
|
+
await checkAppPermissions({
|
|
13
|
+
context: ctx,
|
|
14
|
+
permissions: [
|
|
15
|
+
$own
|
|
16
|
+
? `$resource:${resourceType}:own:query`
|
|
17
|
+
: view
|
|
18
|
+
? `$resource:${resourceType}:query:${view}`
|
|
19
|
+
: `$resource:${resourceType}:query`,
|
|
20
|
+
],
|
|
21
|
+
app,
|
|
22
|
+
groupId: selectedGroupId,
|
|
23
|
+
});
|
|
24
|
+
const isSameOrigin = ((_a = ctx === null || ctx === void 0 ? void 0 : ctx.headers) === null || _a === void 0 ? void 0 : _a.origin) === ((_b = ctx === null || ctx === void 0 ? void 0 : ctx.headers) === null || _b === void 0 ? void 0 : _b.host);
|
|
25
|
+
const findOptions = {
|
|
26
|
+
limit: $top,
|
|
27
|
+
offset: $skip,
|
|
28
|
+
attributes: $select === null || $select === void 0 ? void 0 : $select.split(',').map((s) => s.trim()),
|
|
29
|
+
where: {
|
|
30
|
+
and: [
|
|
31
|
+
where,
|
|
32
|
+
{
|
|
33
|
+
type: resourceType,
|
|
34
|
+
AppId: appId,
|
|
35
|
+
GroupId: selectedGroupId !== null && selectedGroupId !== void 0 ? selectedGroupId : null,
|
|
36
|
+
expires: { or: [{ gt: new Date() }, null] },
|
|
37
|
+
...(app.demoMode && !isSameOrigin ? { seed: false, ephemeral: true } : {}),
|
|
38
|
+
...($own ? { AuthorId: authSubject === null || authSubject === void 0 ? void 0 : authSubject.id } : {}),
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
order,
|
|
43
|
+
};
|
|
44
|
+
const resources = await getAppResources({
|
|
45
|
+
app,
|
|
46
|
+
findOptions,
|
|
47
|
+
type: resourceType,
|
|
48
|
+
context: ctx,
|
|
49
|
+
});
|
|
50
|
+
if (view) {
|
|
51
|
+
const context = await getRemapperContext(app, app.definition.defaultLanguage || defaultLocale, options, ctx);
|
|
52
|
+
ctx.body = resources.map((resource) => remap(resourceDefinition.views[view].remap, resource, context));
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
ctx.body = resources;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=createQueryAppResourcesController.js.map
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { assertKoaError, getResourceDefinition, processResourceBody, } from '@appsemble/node-utils';
|
|
2
|
+
export function createUpdateAppResourceController(options) {
|
|
3
|
+
return async (ctx) => {
|
|
4
|
+
var _a;
|
|
5
|
+
const { pathParams: { appId, resourceId, resourceType }, queryParams: { selectedGroupId }, user: authSubject, } = ctx;
|
|
6
|
+
const { checkAppPermissions, getApp, getAppAssets, getAppResource, updateAppResource } = options;
|
|
7
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
8
|
+
const findOptions = {
|
|
9
|
+
where: {
|
|
10
|
+
id: resourceId,
|
|
11
|
+
type: resourceType,
|
|
12
|
+
AppId: appId,
|
|
13
|
+
GroupId: selectedGroupId !== null && selectedGroupId !== void 0 ? selectedGroupId : null,
|
|
14
|
+
expires: { or: [{ gt: new Date() }, null] },
|
|
15
|
+
...(app.demoMode ? { seed: false, ephemeral: true } : {}),
|
|
16
|
+
},
|
|
17
|
+
};
|
|
18
|
+
const oldResource = await getAppResource({
|
|
19
|
+
app,
|
|
20
|
+
id: resourceId,
|
|
21
|
+
type: resourceType,
|
|
22
|
+
context: ctx,
|
|
23
|
+
findOptions,
|
|
24
|
+
});
|
|
25
|
+
assertKoaError(!oldResource, ctx, 404, 'Resource not found');
|
|
26
|
+
await checkAppPermissions({
|
|
27
|
+
context: ctx,
|
|
28
|
+
permissions: [
|
|
29
|
+
((_a = oldResource.$author) === null || _a === void 0 ? void 0 : _a.id) === (authSubject === null || authSubject === void 0 ? void 0 : authSubject.id)
|
|
30
|
+
? `$resource:${resourceType}:own:update`
|
|
31
|
+
: `$resource:${resourceType}:update`,
|
|
32
|
+
],
|
|
33
|
+
app,
|
|
34
|
+
groupId: selectedGroupId,
|
|
35
|
+
});
|
|
36
|
+
const appAssets = await getAppAssets({ context: ctx, app });
|
|
37
|
+
const resourceDefinition = getResourceDefinition(app.definition, resourceType, ctx);
|
|
38
|
+
const [processedBody, preparedAssets, deletedAssetIds] = processResourceBody(ctx, resourceDefinition, appAssets.filter((asset) => asset.resourceId === resourceId).map((asset) => asset.id), oldResource.expires, appAssets.map((asset) => ({ id: asset.id, name: asset.name })));
|
|
39
|
+
const resources = Array.isArray(processedBody) ? processedBody : [processedBody];
|
|
40
|
+
ctx.body = await updateAppResource({
|
|
41
|
+
app,
|
|
42
|
+
context: ctx,
|
|
43
|
+
id: resourceId,
|
|
44
|
+
type: resourceType,
|
|
45
|
+
resource: resources[0],
|
|
46
|
+
preparedAssets,
|
|
47
|
+
deletedAssetIds,
|
|
48
|
+
resourceDefinition,
|
|
49
|
+
options,
|
|
50
|
+
});
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=createUpdateAppResourceController.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createCountAppResourcesController } from './createCountAppResourcesController.js';
|
|
2
|
+
export { createCreateAppResourceController } from './createCreateAppResourceController.js';
|
|
3
|
+
export { createDeleteAppResourceController } from './createDeleteAppResourceController.js';
|
|
4
|
+
export { createQueryAppResourcesController } from './createQueryAppResourcesController.js';
|
|
5
|
+
export { createUpdateAppResourceController } from './createUpdateAppResourceController.js';
|
|
6
|
+
export { createGetAppResourceByIdController } from './createGetAppResourceByIdController.js';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createCountAppResourcesController } from './createCountAppResourcesController.js';
|
|
2
|
+
export { createCreateAppResourceController } from './createCreateAppResourceController.js';
|
|
3
|
+
export { createDeleteAppResourceController } from './createDeleteAppResourceController.js';
|
|
4
|
+
export { createQueryAppResourcesController } from './createQueryAppResourcesController.js';
|
|
5
|
+
export { createUpdateAppResourceController } from './createUpdateAppResourceController.js';
|
|
6
|
+
export { createGetAppResourceByIdController } from './createGetAppResourceByIdController.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1,29 +1,34 @@
|
|
|
1
1
|
import { defaultLocale, remap } from '@appsemble/utils';
|
|
2
2
|
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
3
|
+
import { createCountAppResourcesController } from './createCountAppResourcesController.js';
|
|
4
|
+
import { createCreateAppResourceController } from './createCreateAppResourceController.js';
|
|
5
|
+
import { createGetAppResourceByIdController } from './createGetAppResourceByIdController.js';
|
|
6
|
+
import { createQueryAppResourcesController } from './createQueryAppResourcesController.js';
|
|
7
|
+
import { getRemapperContext } from '../../../../../app.js';
|
|
8
|
+
import { getResourceDefinition } from '../../../../../resource.js';
|
|
6
9
|
let mockGetApp;
|
|
7
10
|
let mockGetAppResources;
|
|
8
11
|
let mockGetAppResource;
|
|
9
|
-
let mockVerifyResourceActionPermission;
|
|
10
12
|
let mockParseQuery;
|
|
11
13
|
let mockGetAppUrl;
|
|
12
14
|
let mockGetAppMessages;
|
|
13
15
|
let mockGetAppVariables;
|
|
14
16
|
let mockCreateAppResourcesWithAssets;
|
|
15
17
|
let mockGetAppAssets;
|
|
18
|
+
let mockCheckAppPermissions;
|
|
19
|
+
let mockGetCurrentAppMember;
|
|
16
20
|
let mockCtx;
|
|
17
21
|
let mockCtxIs;
|
|
18
22
|
describe('createQueryResources', () => {
|
|
19
23
|
beforeEach(() => {
|
|
20
24
|
mockGetApp = vi.fn();
|
|
21
25
|
mockGetAppResources = vi.fn();
|
|
22
|
-
mockVerifyResourceActionPermission = vi.fn();
|
|
23
26
|
mockParseQuery = vi.fn();
|
|
24
27
|
mockGetAppUrl = vi.fn();
|
|
25
28
|
mockGetAppMessages = vi.fn();
|
|
26
29
|
mockGetAppVariables = vi.fn();
|
|
30
|
+
mockCheckAppPermissions = vi.fn();
|
|
31
|
+
mockGetCurrentAppMember = vi.fn();
|
|
27
32
|
mockCtx = {
|
|
28
33
|
pathParams: { appId: 1, resourceType: 'mockResourceType' },
|
|
29
34
|
queryParams: { $select: 'field1, field2', $skip: 0, $top: 10 },
|
|
@@ -50,11 +55,11 @@ describe('createQueryResources', () => {
|
|
|
50
55
|
mockGetApp.mockResolvedValue(mockApp);
|
|
51
56
|
mockGetAppResources.mockResolvedValue(mockResources);
|
|
52
57
|
mockParseQuery.mockReturnValue(mockParsedQuery);
|
|
53
|
-
const middleware =
|
|
58
|
+
const middleware = createQueryAppResourcesController({
|
|
54
59
|
getApp: mockGetApp,
|
|
55
60
|
getAppResources: mockGetAppResources,
|
|
56
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
57
61
|
parseQuery: mockParseQuery,
|
|
62
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
58
63
|
});
|
|
59
64
|
await middleware(mockCtx, vi.fn());
|
|
60
65
|
expect(mockGetApp).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -135,11 +140,11 @@ describe('createQueryResources', () => {
|
|
|
135
140
|
mockGetApp.mockResolvedValue(mockApp);
|
|
136
141
|
mockGetAppResources.mockResolvedValue(mockResources);
|
|
137
142
|
mockParseQuery.mockReturnValue(mockParsedQuery);
|
|
138
|
-
const middleware =
|
|
143
|
+
const middleware = createQueryAppResourcesController({
|
|
139
144
|
getApp: mockGetApp,
|
|
140
145
|
getAppResources: mockGetAppResources,
|
|
141
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
142
146
|
parseQuery: mockParseQuery,
|
|
147
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
143
148
|
});
|
|
144
149
|
await middleware(mockCtx, vi.fn());
|
|
145
150
|
expect(mockCtx.body).toStrictEqual(mockResources);
|
|
@@ -174,16 +179,17 @@ describe('createQueryResources', () => {
|
|
|
174
179
|
const options = {
|
|
175
180
|
getApp: mockGetApp,
|
|
176
181
|
getAppResources: mockGetAppResources,
|
|
177
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
178
182
|
parseQuery: mockParseQuery,
|
|
179
183
|
getAppUrl: mockGetAppUrl,
|
|
180
184
|
getAppMessages: mockGetAppMessages,
|
|
181
185
|
getAppVariables: mockGetAppVariables,
|
|
186
|
+
getCurrentAppMember: mockGetCurrentAppMember,
|
|
187
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
182
188
|
};
|
|
183
|
-
const resourceDefinition = getResourceDefinition(mockApp, 'mockResourceType', mockCtx, 'view');
|
|
184
|
-
const remapperContext = await getRemapperContext(mockApp, mockApp.definition.defaultLanguage || defaultLocale,
|
|
189
|
+
const resourceDefinition = getResourceDefinition(mockApp.definition, 'mockResourceType', mockCtx, 'view');
|
|
190
|
+
const remapperContext = await getRemapperContext(mockApp, mockApp.definition.defaultLanguage || defaultLocale, options, mockCtx);
|
|
185
191
|
const remappedResources = mockResources.map((resource) => remap(resourceDefinition.views.view.remap, resource, remapperContext));
|
|
186
|
-
const middleware =
|
|
192
|
+
const middleware = createQueryAppResourcesController(options);
|
|
187
193
|
await middleware(mockCtx, vi.fn());
|
|
188
194
|
expect(mockCtx.body).toStrictEqual(remappedResources);
|
|
189
195
|
});
|
|
@@ -192,7 +198,6 @@ describe('createCountResources', () => {
|
|
|
192
198
|
beforeEach(() => {
|
|
193
199
|
mockGetApp = vi.fn();
|
|
194
200
|
mockGetAppResources = vi.fn();
|
|
195
|
-
mockVerifyResourceActionPermission = vi.fn();
|
|
196
201
|
mockParseQuery = vi.fn();
|
|
197
202
|
mockCtx = {
|
|
198
203
|
pathParams: { appId: 1, resourceType: 'mockResourceType' },
|
|
@@ -220,11 +225,11 @@ describe('createCountResources', () => {
|
|
|
220
225
|
mockGetApp.mockResolvedValue(mockApp);
|
|
221
226
|
mockGetAppResources.mockResolvedValue(mockResources);
|
|
222
227
|
mockParseQuery.mockReturnValue(mockParsedQuery);
|
|
223
|
-
const middleware =
|
|
228
|
+
const middleware = createCountAppResourcesController({
|
|
224
229
|
getApp: mockGetApp,
|
|
225
230
|
getAppResources: mockGetAppResources,
|
|
226
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
227
231
|
parseQuery: mockParseQuery,
|
|
232
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
228
233
|
});
|
|
229
234
|
await middleware(mockCtx, vi.fn());
|
|
230
235
|
expect(mockGetApp).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -293,11 +298,11 @@ describe('createCountResources', () => {
|
|
|
293
298
|
mockGetApp.mockResolvedValue(mockApp);
|
|
294
299
|
mockGetAppResources.mockResolvedValue(mockResources);
|
|
295
300
|
mockParseQuery.mockReturnValue(mockParsedQuery);
|
|
296
|
-
const middleware =
|
|
301
|
+
const middleware = createCountAppResourcesController({
|
|
297
302
|
getApp: mockGetApp,
|
|
298
303
|
getAppResources: mockGetAppResources,
|
|
299
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
300
304
|
parseQuery: mockParseQuery,
|
|
305
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
301
306
|
});
|
|
302
307
|
await middleware(mockCtx, vi.fn());
|
|
303
308
|
expect(mockCtx.body).toStrictEqual(mockResources.length);
|
|
@@ -307,13 +312,13 @@ describe('createGetResourceById', () => {
|
|
|
307
312
|
beforeEach(() => {
|
|
308
313
|
mockGetApp = vi.fn();
|
|
309
314
|
mockGetAppResource = vi.fn();
|
|
310
|
-
mockVerifyResourceActionPermission = vi.fn();
|
|
311
315
|
mockGetAppUrl = vi.fn();
|
|
312
316
|
mockGetAppMessages = vi.fn();
|
|
313
317
|
mockGetAppVariables = vi.fn();
|
|
314
318
|
mockCtx = {
|
|
315
319
|
pathParams: { appId: 1, resourceId: 1, resourceType: 'mockResourceType' },
|
|
316
320
|
user: { id: 'mockUserId', name: 'John Doe', primaryEmail: 'john@example.com' },
|
|
321
|
+
queryParams: {},
|
|
317
322
|
};
|
|
318
323
|
});
|
|
319
324
|
it('should fetch app and resource with correct parameters', async () => {
|
|
@@ -328,10 +333,11 @@ describe('createGetResourceById', () => {
|
|
|
328
333
|
const mockResource = { id: 1 };
|
|
329
334
|
mockGetApp.mockResolvedValue(mockApp);
|
|
330
335
|
mockGetAppResource.mockResolvedValue(mockResource);
|
|
331
|
-
const middleware =
|
|
336
|
+
const middleware = createGetAppResourceByIdController({
|
|
332
337
|
getApp: mockGetApp,
|
|
333
338
|
getAppResource: mockGetAppResource,
|
|
334
|
-
|
|
339
|
+
parseQuery: mockParseQuery,
|
|
340
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
335
341
|
});
|
|
336
342
|
await middleware(mockCtx, vi.fn());
|
|
337
343
|
expect(mockGetApp).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -389,10 +395,11 @@ describe('createGetResourceById', () => {
|
|
|
389
395
|
const mockResource = { id: 1 };
|
|
390
396
|
mockGetApp.mockResolvedValue(mockApp);
|
|
391
397
|
mockGetAppResource.mockResolvedValue(mockResource);
|
|
392
|
-
const middleware =
|
|
398
|
+
const middleware = createGetAppResourceByIdController({
|
|
393
399
|
getApp: mockGetApp,
|
|
394
400
|
getAppResource: mockGetAppResource,
|
|
395
|
-
|
|
401
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
402
|
+
parseQuery: mockParseQuery,
|
|
396
403
|
});
|
|
397
404
|
await middleware(mockCtx, vi.fn());
|
|
398
405
|
expect(mockCtx.body).toStrictEqual(mockResource);
|
|
@@ -419,15 +426,16 @@ describe('createGetResourceById', () => {
|
|
|
419
426
|
const options = {
|
|
420
427
|
getApp: mockGetApp,
|
|
421
428
|
getAppResource: mockGetAppResource,
|
|
422
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
423
429
|
getAppUrl: mockGetAppUrl,
|
|
424
430
|
getAppMessages: mockGetAppMessages,
|
|
425
431
|
getAppVariables: mockGetAppVariables,
|
|
432
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
433
|
+
getCurrentAppMember: mockGetCurrentAppMember,
|
|
426
434
|
};
|
|
427
|
-
const resourceDefinition = getResourceDefinition(mockApp, 'mockResourceType', mockCtx, 'view');
|
|
428
|
-
const remapperContext = await getRemapperContext(mockApp, mockApp.definition.defaultLanguage || defaultLocale,
|
|
435
|
+
const resourceDefinition = getResourceDefinition(mockApp.definition, 'mockResourceType', mockCtx, 'view');
|
|
436
|
+
const remapperContext = await getRemapperContext(mockApp, mockApp.definition.defaultLanguage || defaultLocale, options, mockCtx);
|
|
429
437
|
const remappedResource = remap(resourceDefinition.views.view.remap, mockResource, remapperContext);
|
|
430
|
-
const middleware =
|
|
438
|
+
const middleware = createGetAppResourceByIdController(options);
|
|
431
439
|
await middleware(mockCtx, vi.fn());
|
|
432
440
|
expect(mockCtx.body).toStrictEqual(remappedResource);
|
|
433
441
|
});
|
|
@@ -435,7 +443,6 @@ describe('createGetResourceById', () => {
|
|
|
435
443
|
describe('createCreateResource', () => {
|
|
436
444
|
beforeEach(() => {
|
|
437
445
|
mockGetApp = vi.fn();
|
|
438
|
-
mockVerifyResourceActionPermission = vi.fn();
|
|
439
446
|
mockCreateAppResourcesWithAssets = vi.fn();
|
|
440
447
|
mockGetAppAssets = vi.fn();
|
|
441
448
|
mockCtxIs = vi.fn();
|
|
@@ -444,6 +451,7 @@ describe('createCreateResource', () => {
|
|
|
444
451
|
user: { id: 'mockUserId', name: 'John Doe', primaryEmail: 'john@example.com' },
|
|
445
452
|
is: mockCtxIs,
|
|
446
453
|
request: {},
|
|
454
|
+
queryParams: {},
|
|
447
455
|
};
|
|
448
456
|
});
|
|
449
457
|
it('should fetch app and create multiple resources', async () => {
|
|
@@ -461,11 +469,13 @@ describe('createCreateResource', () => {
|
|
|
461
469
|
mockCtxIs.mockReturnValue('multipart/form-data');
|
|
462
470
|
mockCreateAppResourcesWithAssets.mockResolvedValue(mockResources);
|
|
463
471
|
mockGetAppAssets.mockResolvedValue([]);
|
|
464
|
-
const middleware =
|
|
472
|
+
const middleware = createCreateAppResourceController({
|
|
465
473
|
getApp: mockGetApp,
|
|
466
474
|
createAppResourcesWithAssets: mockCreateAppResourcesWithAssets,
|
|
467
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
468
475
|
getAppAssets: mockGetAppAssets,
|
|
476
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
477
|
+
getCurrentAppMember: mockGetCurrentAppMember,
|
|
478
|
+
parseQuery: mockParseQuery,
|
|
469
479
|
});
|
|
470
480
|
await middleware(mockCtx, vi.fn());
|
|
471
481
|
expect(mockGetApp).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -520,11 +530,13 @@ describe('createCreateResource', () => {
|
|
|
520
530
|
mockCtxIs.mockReturnValue('multipart/form-data');
|
|
521
531
|
mockCreateAppResourcesWithAssets.mockResolvedValue(mockResources);
|
|
522
532
|
mockGetAppAssets.mockResolvedValue([]);
|
|
523
|
-
const middleware =
|
|
533
|
+
const middleware = createCreateAppResourceController({
|
|
524
534
|
getApp: mockGetApp,
|
|
525
535
|
createAppResourcesWithAssets: mockCreateAppResourcesWithAssets,
|
|
526
|
-
verifyResourceActionPermission: mockVerifyResourceActionPermission,
|
|
527
536
|
getAppAssets: mockGetAppAssets,
|
|
537
|
+
checkAppPermissions: mockCheckAppPermissions,
|
|
538
|
+
getCurrentAppMember: mockGetCurrentAppMember,
|
|
539
|
+
parseQuery: mockParseQuery,
|
|
528
540
|
});
|
|
529
541
|
await middleware(mockCtx, vi.fn());
|
|
530
542
|
expect(mockGetApp).toHaveBeenCalledWith(expect.objectContaining({
|
|
@@ -1,15 +1,14 @@
|
|
|
1
|
-
import { assertKoaError } from '
|
|
2
|
-
export function
|
|
1
|
+
import { assertKoaError } from '../../../../../koa.js';
|
|
2
|
+
export function createGetAppVariablesController({ getApp, getAppVariables }) {
|
|
3
3
|
return async (ctx) => {
|
|
4
4
|
const { pathParams: { appId }, } = ctx;
|
|
5
5
|
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
6
6
|
assertKoaError(!app, ctx, 404, 'App not found');
|
|
7
|
-
|
|
7
|
+
ctx.body = await getAppVariables({
|
|
8
8
|
context: ctx,
|
|
9
9
|
app,
|
|
10
10
|
query: { attributes: ['id', 'name', 'value'] },
|
|
11
11
|
});
|
|
12
|
-
ctx.body = variables;
|
|
13
12
|
};
|
|
14
13
|
}
|
|
15
|
-
//# sourceMappingURL=
|
|
14
|
+
//# sourceMappingURL=createGetAppVariablesController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createGetAppVariablesController } from './createGetAppVariablesController.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './apps/index.js';
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './resources.js';
|
|
5
|
-
export * from './appMembers.js';
|
|
6
|
-
export * from './appVariables.js';
|
|
7
|
-
export * from './teams.js';
|
|
8
|
-
export * from './oauth2Provider.js';
|
|
1
|
+
export * from './apps/index.js';
|
|
2
|
+
export * from './common/index.js';
|
|
3
|
+
export * from './main/index.js';
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './resources.js';
|
|
5
|
-
export * from './appMembers.js';
|
|
6
|
-
export * from './appVariables.js';
|
|
7
|
-
export * from './teams.js';
|
|
8
|
-
export * from './oauth2Provider.js';
|
|
1
|
+
export * from './apps/index.js';
|
|
2
|
+
export * from './common/index.js';
|
|
3
|
+
export * from './main/index.js';
|
|
9
4
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { assertKoaError } from '../../../../../koa.js';
|
|
2
|
+
export function createCreateAppAssetController({ createAppAsset, getApp }) {
|
|
3
|
+
return async (ctx) => {
|
|
4
|
+
const { pathParams: { appId }, request: { body: { file: { contents, filename, mime }, name, }, }, } = ctx;
|
|
5
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
6
|
+
assertKoaError(!app, ctx, 404, 'App not found');
|
|
7
|
+
const asset = await createAppAsset({
|
|
8
|
+
app,
|
|
9
|
+
context: ctx,
|
|
10
|
+
payload: { filename, mime, name, data: contents },
|
|
11
|
+
});
|
|
12
|
+
ctx.status = 201;
|
|
13
|
+
ctx.body = { id: asset.id, mime, filename, name };
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=createCreateAppAssetController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createCreateAppAssetController } from './createCreateAppAssetController.js';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { assertKoaError } from '../../../../../koa.js';
|
|
2
|
+
import { deleteResourcesRecursively } from '../../../../utils/resources.js';
|
|
3
|
+
export function createDeleteAppSeedResourcesController(options) {
|
|
4
|
+
return async (ctx) => {
|
|
5
|
+
var _a;
|
|
6
|
+
const { pathParams: { appId }, } = ctx;
|
|
7
|
+
const { getApp } = options;
|
|
8
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
9
|
+
assertKoaError(!app, ctx, 404, 'App not found');
|
|
10
|
+
for (const resourceType of Object.keys((_a = app.definition.resources) !== null && _a !== void 0 ? _a : {})) {
|
|
11
|
+
await deleteResourcesRecursively(resourceType, app, options, ctx);
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=createDeleteAppSeedResourcesController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createDeleteAppSeedResourcesController } from './createDeleteAppSeedResourcesController.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './apps/index.js';
|