@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.
Files changed (100) hide show
  1. package/AppMemberPropertiesError.d.ts +3 -0
  2. package/AppMemberPropertiesError.js +8 -0
  3. package/README.md +3 -3
  4. package/app.d.ts +2 -3
  5. package/app.js +6 -7
  6. package/authentication.js +1 -1
  7. package/index.d.ts +1 -1
  8. package/index.js +1 -1
  9. package/package.json +3 -3
  10. package/resource.d.ts +5 -5
  11. package/resource.js +6 -6
  12. package/server/controllers/apps/actions/createProxyDeleteController.d.ts +3 -0
  13. package/server/controllers/apps/actions/createProxyDeleteController.js +5 -0
  14. package/server/controllers/apps/actions/createProxyGetController.d.ts +3 -0
  15. package/server/controllers/apps/actions/createProxyGetController.js +5 -0
  16. package/server/controllers/apps/actions/createProxyPatchController.d.ts +3 -0
  17. package/server/controllers/apps/actions/createProxyPatchController.js +5 -0
  18. package/server/controllers/apps/actions/createProxyPostController.d.ts +3 -0
  19. package/server/controllers/apps/actions/createProxyPostController.js +5 -0
  20. package/server/controllers/apps/actions/createProxyPutController.d.ts +3 -0
  21. package/server/controllers/apps/actions/createProxyPutController.js +5 -0
  22. package/server/controllers/apps/actions/index.d.ts +5 -0
  23. package/server/controllers/apps/actions/index.js +6 -0
  24. package/server/controllers/apps/index.d.ts +2 -0
  25. package/server/controllers/apps/index.js +3 -0
  26. package/server/controllers/apps/members/current/createGetCurrentAppMemberController.d.ts +3 -0
  27. package/server/controllers/apps/members/current/createGetCurrentAppMemberController.js +6 -0
  28. package/server/controllers/apps/members/current/index.d.ts +1 -0
  29. package/server/controllers/apps/members/current/index.js +2 -0
  30. package/server/controllers/apps/members/index.d.ts +1 -0
  31. package/server/controllers/apps/members/index.js +2 -0
  32. package/server/controllers/common/apps/assets/createGetAppAssetByIdController.d.ts +3 -0
  33. package/server/controllers/common/apps/assets/createGetAppAssetByIdController.js +37 -0
  34. package/server/controllers/common/apps/assets/index.d.ts +1 -0
  35. package/server/controllers/common/apps/assets/index.js +2 -0
  36. package/server/controllers/common/apps/groups/createGetAppGroupsController.d.ts +3 -0
  37. package/server/controllers/common/apps/groups/createGetAppGroupsController.js +16 -0
  38. package/server/controllers/common/apps/groups/index.d.ts +1 -0
  39. package/server/controllers/common/apps/groups/index.js +2 -0
  40. package/server/controllers/common/apps/index.d.ts +5 -0
  41. package/server/controllers/common/apps/index.js +6 -0
  42. package/server/controllers/common/apps/messages/createGetAppMessagesController.d.ts +3 -0
  43. package/server/controllers/{appMessages.js → common/apps/messages/createGetAppMessagesController.js} +3 -3
  44. package/server/controllers/common/apps/messages/index.d.ts +1 -0
  45. package/server/controllers/common/apps/messages/index.js +2 -0
  46. package/server/controllers/{appMessages.d.ts → common/apps/resources/createCountAppResourcesController.d.ts} +1 -1
  47. package/server/controllers/common/apps/resources/createCountAppResourcesController.js +40 -0
  48. package/server/controllers/common/apps/resources/createCreateAppResourceController.d.ts +15 -0
  49. package/server/controllers/common/apps/resources/createCreateAppResourceController.js +94 -0
  50. package/server/controllers/common/apps/resources/createDeleteAppResourceController.d.ts +3 -0
  51. package/server/controllers/common/apps/resources/createDeleteAppResourceController.js +46 -0
  52. package/server/controllers/common/apps/resources/createGetAppResourceByIdController.d.ts +3 -0
  53. package/server/controllers/common/apps/resources/createGetAppResourceByIdController.js +48 -0
  54. package/server/controllers/common/apps/resources/createQueryAppResourcesController.d.ts +3 -0
  55. package/server/controllers/common/apps/resources/createQueryAppResourcesController.js +58 -0
  56. package/server/controllers/common/apps/resources/createUpdateAppResourceController.d.ts +3 -0
  57. package/server/controllers/common/apps/resources/createUpdateAppResourceController.js +53 -0
  58. package/server/controllers/common/apps/resources/index.d.ts +6 -0
  59. package/server/controllers/common/apps/resources/index.js +7 -0
  60. package/server/controllers/{resources.test.js → common/apps/resources/resources.test.js} +44 -32
  61. package/server/controllers/common/apps/variables/createGetAppVariablesController.d.ts +3 -0
  62. package/server/controllers/{appVariables.js → common/apps/variables/createGetAppVariablesController.js} +4 -5
  63. package/server/controllers/common/apps/variables/index.d.ts +1 -0
  64. package/server/controllers/common/apps/variables/index.js +2 -0
  65. package/server/controllers/common/index.d.ts +1 -0
  66. package/server/controllers/common/index.js +2 -0
  67. package/server/controllers/index.d.ts +3 -8
  68. package/server/controllers/index.js +3 -8
  69. package/server/controllers/main/apps/assets/createCreateAppAssetController.d.ts +3 -0
  70. package/server/controllers/main/apps/assets/createCreateAppAssetController.js +16 -0
  71. package/server/controllers/main/apps/assets/index.d.ts +1 -0
  72. package/server/controllers/main/apps/assets/index.js +2 -0
  73. package/server/controllers/main/apps/index.d.ts +2 -0
  74. package/server/controllers/main/apps/index.js +3 -0
  75. package/server/controllers/main/apps/resources/createDeleteAppSeedResourcesController.d.ts +3 -0
  76. package/server/controllers/main/apps/resources/createDeleteAppSeedResourcesController.js +15 -0
  77. package/server/controllers/main/apps/resources/index.d.ts +1 -0
  78. package/server/controllers/main/apps/resources/index.js +2 -0
  79. package/server/controllers/main/index.d.ts +1 -0
  80. package/server/controllers/main/index.js +2 -0
  81. package/server/types.d.ts +51 -61
  82. package/server/utils/actions.d.ts +6 -0
  83. package/server/{controllers/action.js → utils/actions.js} +19 -50
  84. package/server/utils/resources.d.ts +8 -0
  85. package/server/utils/resources.js +51 -0
  86. package/UserPropertiesError.d.ts +0 -3
  87. package/UserPropertiesError.js +0 -8
  88. package/server/controllers/action.d.ts +0 -7
  89. package/server/controllers/appMembers.d.ts +0 -3
  90. package/server/controllers/appMembers.js +0 -13
  91. package/server/controllers/appVariables.d.ts +0 -3
  92. package/server/controllers/assets.d.ts +0 -5
  93. package/server/controllers/assets.js +0 -66
  94. package/server/controllers/oauth2Provider.d.ts +0 -3
  95. package/server/controllers/oauth2Provider.js +0 -7
  96. package/server/controllers/resources.d.ts +0 -10
  97. package/server/controllers/resources.js +0 -402
  98. package/server/controllers/teams.d.ts +0 -3
  99. package/server/controllers/teams.js +0 -10
  100. /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,3 @@
1
+ import { type Options } from '@appsemble/node-utils';
2
+ import { type Middleware } from 'koa';
3
+ export declare function createGetAppResourceByIdController(options: Options): Middleware;
@@ -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,3 @@
1
+ import { type Options } from '@appsemble/node-utils';
2
+ import { type Middleware } from 'koa';
3
+ export declare function createQueryAppResourcesController(options: Options): Middleware;
@@ -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,3 @@
1
+ import { type Options } from '@appsemble/node-utils';
2
+ import { type Middleware } from 'koa';
3
+ export declare function createUpdateAppResourceController(options: Options): Middleware;
@@ -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 { createCountResources, createCreateResource, createGetResourceById, createQueryResources, } from './resources.js';
4
- import { getRemapperContext } from '../../app.js';
5
- import { getResourceDefinition } from '../../resource.js';
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 = createQueryResources({
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 = createQueryResources({
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, null, options, mockCtx);
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 = createQueryResources(options);
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 = createCountResources({
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 = createCountResources({
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 = createGetResourceById({
336
+ const middleware = createGetAppResourceByIdController({
332
337
  getApp: mockGetApp,
333
338
  getAppResource: mockGetAppResource,
334
- verifyResourceActionPermission: mockVerifyResourceActionPermission,
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 = createGetResourceById({
398
+ const middleware = createGetAppResourceByIdController({
393
399
  getApp: mockGetApp,
394
400
  getAppResource: mockGetAppResource,
395
- verifyResourceActionPermission: mockVerifyResourceActionPermission,
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, null, options, mockCtx);
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 = createGetResourceById(options);
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 = createCreateResource({
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 = createCreateResource({
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({
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../../types.js';
3
+ export declare function createGetAppVariablesController({ getApp, getAppVariables }: Options): Middleware;
@@ -1,15 +1,14 @@
1
- import { assertKoaError } from '../../koa.js';
2
- export function createGetAppVariables({ getApp, getAppVariables }) {
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
- const variables = await getAppVariables({
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=appVariables.js.map
14
+ //# sourceMappingURL=createGetAppVariablesController.js.map
@@ -0,0 +1 @@
1
+ export { createGetAppVariablesController } from './createGetAppVariablesController.js';
@@ -0,0 +1,2 @@
1
+ export { createGetAppVariablesController } from './createGetAppVariablesController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ export * from './apps/index.js';
@@ -0,0 +1,2 @@
1
+ export * from './apps/index.js';
2
+ //# sourceMappingURL=index.js.map
@@ -1,8 +1,3 @@
1
- export * from './action.js';
2
- export * from './appMessages.js';
3
- export * from './assets.js';
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 './action.js';
2
- export * from './appMessages.js';
3
- export * from './assets.js';
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,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../../types.js';
3
+ export declare function createCreateAppAssetController({ createAppAsset, getApp }: Options): Middleware;
@@ -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,2 @@
1
+ export { createCreateAppAssetController } from './createCreateAppAssetController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export * from './assets/index.js';
2
+ export * from './resources/index.js';
@@ -0,0 +1,3 @@
1
+ export * from './assets/index.js';
2
+ export * from './resources/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../../types.js';
3
+ export declare function createDeleteAppSeedResourcesController(options: Options): Middleware;
@@ -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,2 @@
1
+ export { createDeleteAppSeedResourcesController } from './createDeleteAppSeedResourcesController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ export * from './apps/index.js';
@@ -0,0 +1,2 @@
1
+ export * from './apps/index.js';
2
+ //# sourceMappingURL=index.js.map