@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
package/server/types.d.ts CHANGED
@@ -1,18 +1,9 @@
1
- import { type App, type AppConfigEntry, type AppMember, type AppMessages, type Asset, type BlockDefinition, type BlockManifest, type ControllerDefinition, type EmailActionDefinition, type Resource, type ResourceDefinition, type TeamMember, type Theme as ThemeType, type UserInfo } from '@appsemble/types';
2
- import { type IdentifiableBlock, type Permission } from '@appsemble/utils';
1
+ import { type App, type AppConfigEntry, type AppMemberInfo, type AppMessages, type Asset, type BlockDefinition, type BlockManifest, type ControllerDefinition, type CustomAppPermission, type EmailActionDefinition, type Group, type OrganizationPermission, type Resource, type ResourceDefinition, type Theme as ThemeType } from '@appsemble/types';
2
+ import { type IdentifiableBlock } from '@appsemble/utils';
3
3
  import { type RawAxiosRequestConfig } from 'axios';
4
- import { type Context, type DefaultContext as DefaultContextInterface, type DefaultState, type ParameterizedContext } from 'koa';
5
- export interface UtilsUser {
4
+ import { type DefaultContext as DefaultContextInterface, type DefaultState, type ParameterizedContext } from 'koa';
5
+ export interface AuthSubject {
6
6
  id: string;
7
- name: string;
8
- primaryEmail: string;
9
- timezone: string;
10
- locale: string;
11
- EmailAuthorizations?: {
12
- verified: boolean;
13
- }[];
14
- subscribed?: boolean;
15
- demoLoginUser?: boolean;
16
7
  }
17
8
  declare module 'koa' {
18
9
  interface Request {
@@ -25,9 +16,9 @@ declare module 'koa' {
25
16
  appBlocks: BlockManifest[];
26
17
  appMessages: AppMessages[];
27
18
  appVariables: AppConfigEntry[];
28
- appMembers: AppMember[];
29
- appUserInfo: UserInfo;
30
- appTeams: ExtendedTeam[];
19
+ appMembers: AppMemberInfo[];
20
+ appMemberInfo: AppMemberInfo;
21
+ appGroups: ExtendedGroup[];
31
22
  appAssets: AppAsset[];
32
23
  appReadmes: AppReadme[];
33
24
  blockConfigs: ContextBlockConfig[];
@@ -47,11 +38,11 @@ declare module 'koas-security' {
47
38
  studio: {};
48
39
  }
49
40
  interface Users {
50
- app: UtilsUser;
51
- basic: UtilsUser;
52
- cli: UtilsUser;
53
- scim: UtilsUser;
54
- studio: UtilsUser;
41
+ app: AuthSubject;
42
+ basic: AuthSubject;
43
+ cli: AuthSubject;
44
+ scim: AuthSubject;
45
+ studio: AuthSubject;
55
46
  }
56
47
  }
57
48
  declare module 'koas-parameters' {
@@ -67,7 +58,9 @@ declare module 'koas-parameters' {
67
58
  controllerVersion: string;
68
59
  clientId: string;
69
60
  language: string;
70
- memberId: string;
61
+ organizationMemberId: string;
62
+ groupMemberId: string;
63
+ appMemberId: string;
71
64
  organizationId: string;
72
65
  path: string;
73
66
  resourceId: number;
@@ -77,9 +70,9 @@ declare module 'koas-parameters' {
77
70
  screenshotId: number;
78
71
  readmeId: number;
79
72
  snapshotId: number;
80
- teamId: string;
73
+ groupId: number;
81
74
  token: string;
82
- appServiceId: number;
75
+ serviceSecretId: number;
83
76
  appSecretId: number;
84
77
  appVariableId: number;
85
78
  userId: string;
@@ -104,8 +97,11 @@ declare module 'koas-parameters' {
104
97
  assets: boolean;
105
98
  screenshots: boolean;
106
99
  readmes: boolean;
107
- roles: string[];
100
+ roles: string[] | string;
108
101
  includeMessages: boolean;
102
+ demo: boolean;
103
+ selectedGroupId: number;
104
+ $own: boolean;
109
105
  }
110
106
  }
111
107
  export type Operator = 'and' | 'not' | 'or';
@@ -140,26 +136,9 @@ export interface GetAppMessagesParams extends GetAppSubEntityParams {
140
136
  language?: string;
141
137
  merge?: string[] | string;
142
138
  }
143
- export interface GetAppMembersParams extends GetAppSubEntityParams {
144
- userId: string;
145
- }
146
- export interface GetAppUserInfoParams {
147
- context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
148
- client: {
149
- scope: string;
150
- } | {
151
- scope: string;
152
- app: App;
153
- } | {};
154
- user: UtilsUser;
155
- ctx: Context;
156
- }
157
- export interface ExtendedTeam extends TeamMember {
139
+ export interface ExtendedGroup extends Group {
158
140
  size: number;
159
141
  }
160
- export interface GetAppTeamsParams extends GetAppSubEntityParams {
161
- user: UtilsUser;
162
- }
163
142
  export interface GetAppBlockStylesParams extends GetAppSubEntityParams {
164
143
  name: string;
165
144
  }
@@ -220,26 +199,37 @@ export interface GetCspParams {
220
199
  settingsHash: string;
221
200
  nonce: string;
222
201
  }
202
+ export interface GetCurrentAppMemberParams {
203
+ context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
204
+ }
223
205
  export type ResourceAction = 'create' | 'delete' | 'update';
224
206
  export type Action = ResourceAction | 'count' | 'get' | 'patch' | 'query';
225
- export interface VerifyResourceActionPermissionParams {
207
+ export interface ApplyAppServiceSecretsParams {
226
208
  context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
227
209
  app: App;
228
- resourceType: string;
229
- action: Action;
230
- options: Options;
231
- ctx: Context;
210
+ axiosConfig: RawAxiosRequestConfig<any>;
232
211
  }
233
- export interface ApplyAppServiceSecretsParams {
212
+ export interface CheckAppMemberAppPermissionsParams {
234
213
  context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
214
+ permissions: CustomAppPermission[];
235
215
  app: App;
236
- axiosConfig: RawAxiosRequestConfig<any>;
237
216
  }
238
- export interface CheckRoleParams {
217
+ export interface CheckUserOrganizationPermissionsParams {
218
+ context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
219
+ permissions: OrganizationPermission[];
220
+ app: App;
221
+ }
222
+ export interface CheckAuthSubjectAppPermissionsParams {
223
+ context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
224
+ app: App;
225
+ groupId?: number;
226
+ permissions: CustomAppPermission[];
227
+ }
228
+ export interface CheckAppPermissionsParams {
239
229
  context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
240
230
  app: App;
241
- permissions: Permission | Permission[];
242
- findOptions?: FindOptions;
231
+ groupId?: number;
232
+ permissions: CustomAppPermission[];
243
233
  }
244
234
  export interface ReloadUserParams {
245
235
  context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
@@ -266,8 +256,8 @@ export interface CreateAppResourcesWithAssetsParams extends GetAppSubEntityParam
266
256
  resources: Record<string, unknown>[];
267
257
  preparedAssets: PreparedAsset[];
268
258
  resourceType: string;
269
- action: ResourceAction;
270
259
  options: Options;
260
+ groupId?: number;
271
261
  }
272
262
  export interface UpdateAppResourceParams extends GetAppSubEntityParams {
273
263
  id: number | string;
@@ -277,7 +267,6 @@ export interface UpdateAppResourceParams extends GetAppSubEntityParams {
277
267
  deletedAssetIds: string[];
278
268
  type: string;
279
269
  options: Options;
280
- action: ResourceAction;
281
270
  }
282
271
  export interface DeleteAppResourceParams extends GetAppSubEntityParams {
283
272
  id: number | string;
@@ -292,6 +281,7 @@ export interface CreateAppAssetParams extends GetAppSubEntityParams {
292
281
  name: string;
293
282
  data: Buffer;
294
283
  };
284
+ seed?: boolean;
295
285
  }
296
286
  export interface DeleteAppAssetParams extends GetAppSubEntityParams {
297
287
  id: string;
@@ -301,7 +291,6 @@ export interface EmailParams {
301
291
  action: EmailActionDefinition;
302
292
  data: any;
303
293
  mailer: any;
304
- user: any;
305
294
  options: Options;
306
295
  context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
307
296
  }
@@ -353,12 +342,11 @@ export interface ParsedQuery {
353
342
  }
354
343
  export type ContentSecurityPolicy = Record<string, (string | false)[]>;
355
344
  export interface Options {
345
+ getCurrentAppMember: (params: GetCurrentAppMemberParams) => Promise<AppMemberInfo>;
356
346
  getApp: (params: GetAppParams) => Promise<App>;
357
347
  getAppDetails: (params: GetAppParams) => Promise<AppDetails>;
358
348
  getAppMessages: (params: GetAppMessagesParams) => Promise<AppMessages[]>;
359
- getAppMembers: (params: GetAppMembersParams) => Promise<AppMember[]>;
360
- getAppUserInfo: (params: GetAppUserInfoParams) => Promise<UserInfo>;
361
- getAppTeams: (params: GetAppTeamsParams) => Promise<ExtendedTeam[]>;
349
+ getAppGroups: (params: GetAppSubEntityParams) => Promise<ExtendedGroup[]>;
362
350
  getAppStyles: (params: GetAppParams | GetAppSubEntityParams) => Promise<AppStyles>;
363
351
  getAppScreenshots: (params: GetAppSubEntityParams) => Promise<AppScreenshot[]>;
364
352
  getAppReadmes: (params: GetAppSubEntityParams) => Promise<AppReadme[]>;
@@ -374,9 +362,11 @@ export interface Options {
374
362
  getHost: (params: GetHostParams) => string;
375
363
  getCsp: (params: GetCspParams) => ContentSecurityPolicy;
376
364
  createSettings: (params: CreateSettingsParams) => Promise<[digest: string, script: string]>;
377
- verifyResourceActionPermission: (params: VerifyResourceActionPermissionParams) => Promise<Record<string, any>>;
378
365
  applyAppServiceSecrets: (params: ApplyAppServiceSecretsParams) => Promise<RawAxiosRequestConfig<any>>;
379
- checkRole: (params: CheckRoleParams) => Promise<Record<string, any>>;
366
+ checkAppMemberAppPermissions: (params: CheckAppMemberAppPermissionsParams) => Promise<void>;
367
+ checkUserOrganizationPermissions: (params: CheckUserOrganizationPermissionsParams) => Promise<void>;
368
+ checkAuthSubjectAppPermissions: (params: CheckAuthSubjectAppPermissionsParams) => Promise<void>;
369
+ checkAppPermissions: (params: CheckAppPermissionsParams) => Promise<void>;
380
370
  reloadUser: (params: ReloadUserParams) => Promise<Record<string, any>>;
381
371
  parseQuery: (params: ParseQueryParams) => ParsedQuery;
382
372
  getAppResource: (params: GetAppResourceParams) => Promise<Resource>;
@@ -0,0 +1,6 @@
1
+ import { type Options } from '@appsemble/node-utils';
2
+ import { type App, type EmailActionDefinition, type NotifyActionDefinition } from '@appsemble/types';
3
+ import { type Context, type Middleware } from 'koa';
4
+ export declare function handleEmail(ctx: Context, app: App, action: EmailActionDefinition, options: Options): Promise<void>;
5
+ export declare function handleNotify(ctx: Context, app: App, action: NotifyActionDefinition, options: Options): Promise<void>;
6
+ export declare function createProxyHandler(useBody: boolean, options: Options): Middleware;
@@ -1,8 +1,7 @@
1
- import { assertKoaError, createFormData, getContainerNamespace, getRemapperContext, logger, parseServiceUrl, scaleDeployment, setLastRequestAnnotation, throwKoaError, version, waitForPodReadiness, } from '@appsemble/node-utils';
1
+ import { assertKoaError, createFormData, EmailQuotaExceededError, getContainerNamespace, getRemapperContext, logger, parseServiceUrl, scaleDeployment, setLastRequestAnnotation, throwKoaError, version, waitForPodReadiness, } from '@appsemble/node-utils';
2
2
  import { defaultLocale, remap } from '@appsemble/utils';
3
3
  import axios from 'axios';
4
4
  import { get, mapValues, pick } from 'lodash-es';
5
- import { EmailQuotaExceededError } from '../../EmailQuotaExceededError.js';
6
5
  /**
7
6
  * These response headers are forwarded when proxying requests.
8
7
  */
@@ -13,15 +12,14 @@ const allowResponseHeaders = [
13
12
  'transfer-encoding',
14
13
  ];
15
14
  const supportedActions = ['email', 'notify', 'request'];
16
- async function handleEmail(ctx, app, action, options) {
17
- const { mailer, method, request: { body: data }, user, } = ctx;
15
+ export async function handleEmail(ctx, app, action, options) {
16
+ const { mailer, method, request: { body: data }, } = ctx;
18
17
  if (method !== 'POST') {
19
18
  throwKoaError(ctx, 405, 'Method must be POST for email actions');
20
19
  }
21
- const { email, reloadUser } = options;
22
- await reloadUser({ context: ctx });
20
+ const { email } = options;
23
21
  try {
24
- await email({ action, data, mailer, user, options, context: ctx });
22
+ await email({ action, data, mailer, options, context: ctx });
25
23
  }
26
24
  catch (error) {
27
25
  if (error instanceof EmailQuotaExceededError) {
@@ -31,18 +29,10 @@ async function handleEmail(ctx, app, action, options) {
31
29
  }
32
30
  ctx.status = 204;
33
31
  }
34
- async function handleNotify(ctx, app, action, options) {
35
- var _a, _b;
36
- const { request: { body: data }, user, } = ctx;
37
- const { reloadUser, sendNotifications } = options;
38
- await reloadUser({ context: ctx });
39
- const remapperContext = await getRemapperContext(app, app.definition.defaultLanguage || defaultLocale, user && {
40
- sub: user.id,
41
- name: user.name,
42
- email: user.primaryEmail,
43
- email_verified: Boolean((_b = (_a = user.EmailAuthorizations) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.verified),
44
- zoneinfo: user.timezone,
45
- }, options, ctx);
32
+ export async function handleNotify(ctx, app, action, options) {
33
+ const { request: { body: data }, } = ctx;
34
+ const { sendNotifications } = options;
35
+ const remapperContext = await getRemapperContext(app, app.definition.defaultLanguage || defaultLocale, options, ctx);
46
36
  const to = remap(action.to, data, remapperContext);
47
37
  const title = remap(action.title, data, remapperContext);
48
38
  const body = remap(action.body, data, remapperContext);
@@ -70,8 +60,8 @@ function deserializeResource(data) {
70
60
  return replaceAssets(resource);
71
61
  }
72
62
  async function handleRequestProxy(ctx, app, action, useBody, options) {
73
- var _a, _b, _c, _d;
74
- const { method, query, request: { body, headers }, user, } = ctx;
63
+ var _a, _b;
64
+ const { method, query, request: { body, headers }, } = ctx;
75
65
  let data;
76
66
  if (useBody) {
77
67
  if (Object.hasOwn(body, 'assets')) {
@@ -90,17 +80,11 @@ async function handleRequestProxy(ctx, app, action, useBody, options) {
90
80
  throwKoaError(ctx, 400, 'data should be a JSON object.');
91
81
  }
92
82
  }
93
- const { applyAppServiceSecrets, reloadUser } = options;
94
- await reloadUser({ context: ctx });
95
- const remapperContext = await getRemapperContext(app, app.definition.defaultLanguage || defaultLocale, user && {
96
- sub: user.id,
97
- name: user.name,
98
- email: user.primaryEmail,
99
- email_verified: Boolean((_b = (_a = user.EmailAuthorizations) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.verified),
100
- zoneinfo: user.timezone,
101
- }, options, ctx);
83
+ // TODO
84
+ const { applyAppServiceSecrets } = options;
85
+ const remapperContext = await getRemapperContext(app, app.definition.defaultLanguage || defaultLocale, options, ctx);
102
86
  const proxyUrl = new URL(String(remap(action.url, data, remapperContext)));
103
- if (/\/api\/apps\/\d+\/action\/.*/.test(proxyUrl.pathname) && ctx.URL.host === proxyUrl.host) {
87
+ if (/\/api\/apps\/\d+\/actions\/.*/.test(proxyUrl.pathname) && ctx.URL.host === proxyUrl.host) {
104
88
  throwKoaError(ctx, 400, 'Not allowed to make direct requests to the Appsemble action controller using this action.');
105
89
  }
106
90
  let params;
@@ -113,7 +97,7 @@ async function handleRequestProxy(ctx, app, action, useBody, options) {
113
97
  throwKoaError(ctx, 400, 'params should be a JSON object.');
114
98
  }
115
99
  let axiosConfig = {
116
- method: (_c = action.method) !== null && _c !== void 0 ? _c : 'GET',
100
+ method: (_a = action.method) !== null && _a !== void 0 ? _a : 'GET',
117
101
  url: String(proxyUrl),
118
102
  params,
119
103
  responseType: 'arraybuffer',
@@ -154,7 +138,7 @@ async function handleRequestProxy(ctx, app, action, useBody, options) {
154
138
  const { deploymentName, namespace } = parseServiceUrl(String(proxyUrl));
155
139
  try {
156
140
  await scaleDeployment(namespace, deploymentName, 1);
157
- await waitForPodReadiness(namespace, deploymentName, (_d = process.env.POD_READINESS_TIMEOUT) !== null && _d !== void 0 ? _d : undefined);
141
+ await waitForPodReadiness(namespace, deploymentName, (_b = process.env.POD_READINESS_TIMEOUT) !== null && _b !== void 0 ? _b : undefined);
158
142
  response = await axios(axiosConfig);
159
143
  }
160
144
  catch {
@@ -174,7 +158,7 @@ async function handleRequestProxy(ctx, app, action, useBody, options) {
174
158
  ctx.set(pick(response.headers, allowResponseHeaders));
175
159
  ctx.body = response.data;
176
160
  }
177
- function createProxyHandler(useBody, options) {
161
+ export function createProxyHandler(useBody, options) {
178
162
  return async (ctx) => {
179
163
  const { pathParams: { appId, path }, } = ctx;
180
164
  const app = await options.getApp({ context: ctx, query: { where: { id: appId } } });
@@ -193,19 +177,4 @@ function createProxyHandler(useBody, options) {
193
177
  }
194
178
  };
195
179
  }
196
- export function createProxyDelete(options) {
197
- return createProxyHandler(false, options);
198
- }
199
- export function createProxyGet(options) {
200
- return createProxyHandler(false, options);
201
- }
202
- export function createProxyPatch(options) {
203
- return createProxyHandler(true, options);
204
- }
205
- export function createProxyPost(options) {
206
- return createProxyHandler(true, options);
207
- }
208
- export function createProxyPut(options) {
209
- return createProxyHandler(true, options);
210
- }
211
- //# sourceMappingURL=action.js.map
180
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1,8 @@
1
+ import { type App, type ResourceDefinition } from '@appsemble/types';
2
+ import { type Context } from 'koa';
3
+ import { type Options, type OrderItem, type WhereOptions } from '../types.js';
4
+ export declare function generateResourceQuery(ctx: Context, { parseQuery }: Options, resourceDefinition?: ResourceDefinition): {
5
+ order: OrderItem[];
6
+ where: WhereOptions;
7
+ };
8
+ export declare function deleteResourcesRecursively(type: string, app: App, options: Options, context: Context): Promise<void>;
@@ -0,0 +1,51 @@
1
+ import { throwKoaError } from '../../koa.js';
2
+ import { logger } from '../../logger.js';
3
+ export function generateResourceQuery(ctx, { parseQuery }, resourceDefinition) {
4
+ try {
5
+ return parseQuery({
6
+ $filter: ctx.queryParams.$filter,
7
+ $orderby: ctx.queryParams.$orderby,
8
+ resourceDefinition,
9
+ });
10
+ }
11
+ catch (error) {
12
+ if (error instanceof Error) {
13
+ throwKoaError(ctx, 400, 'Unable to process this query', { syntaxError: error.message });
14
+ }
15
+ logger.error(error);
16
+ throwKoaError(ctx, 400, 'Unable to process this query');
17
+ }
18
+ }
19
+ export async function deleteResourcesRecursively(type, app, options, context) {
20
+ const { deleteAppResource, getAppResources } = options;
21
+ const referencingResources = Object.entries(app.definition.resources).filter(([, resourceDefinition]) => {
22
+ var _a;
23
+ return Object.values((_a = resourceDefinition.references) !== null && _a !== void 0 ? _a : {}).find((resourceReference) => resourceReference.resource === type);
24
+ });
25
+ for (const [referencingResourceType] of referencingResources) {
26
+ await deleteResourcesRecursively(referencingResourceType, app, options, context);
27
+ }
28
+ const resourcesToDeleteFindOptions = {
29
+ where: {
30
+ type,
31
+ AppId: app.id,
32
+ or: [{ seed: true }, { ephemeral: true }],
33
+ },
34
+ };
35
+ const resourcesToDelete = await getAppResources({
36
+ app,
37
+ findOptions: resourcesToDeleteFindOptions,
38
+ type,
39
+ context,
40
+ });
41
+ for (const resourceToDelete of resourcesToDelete) {
42
+ await deleteAppResource({
43
+ app,
44
+ context,
45
+ options,
46
+ id: resourceToDelete.id,
47
+ type,
48
+ });
49
+ }
50
+ }
51
+ //# sourceMappingURL=resources.js.map
@@ -1,3 +0,0 @@
1
- export declare class UserPropertiesError extends Error {
2
- constructor(message: string);
3
- }
@@ -1,8 +0,0 @@
1
- export class UserPropertiesError extends Error {
2
- constructor(message) {
3
- super(message);
4
- this.name = 'UserPropertiesError';
5
- Error.captureStackTrace(this, UserPropertiesError);
6
- }
7
- }
8
- //# sourceMappingURL=UserPropertiesError.js.map
@@ -1,7 +0,0 @@
1
- import { type Options } from '@appsemble/node-utils';
2
- import { type Middleware } from 'koa';
3
- export declare function createProxyDelete(options: Options): Middleware;
4
- export declare function createProxyGet(options: Options): Middleware;
5
- export declare function createProxyPatch(options: Options): Middleware;
6
- export declare function createProxyPost(options: Options): Middleware;
7
- export declare function createProxyPut(options: Options): Middleware;
@@ -1,3 +0,0 @@
1
- import { type Middleware } from 'koa';
2
- import { type Options } from '../types.js';
3
- export declare function createGetAppMember({ getApp, getAppMembers }: Options): Middleware;
@@ -1,13 +0,0 @@
1
- import { assertKoaError } from '../../koa.js';
2
- export function createGetAppMember({ getApp, getAppMembers }) {
3
- return async (ctx) => {
4
- const { pathParams: { appId, userId }, } = ctx;
5
- const app = await getApp({ context: ctx, query: { where: { id: appId } } });
6
- assertKoaError(!app, ctx, 404, 'App not found');
7
- assertKoaError(app.definition.security === undefined, ctx, 404, 'App does not have a security definition');
8
- const appMembers = await getAppMembers({ context: ctx, app, userId });
9
- assertKoaError(appMembers.length !== 1, ctx, 404, 'App member not found');
10
- ctx.body = appMembers[0];
11
- };
12
- }
13
- //# sourceMappingURL=appMembers.js.map
@@ -1,3 +0,0 @@
1
- import { type Middleware } from 'koa';
2
- import { type Options } from '../types.js';
3
- export declare function createGetAppVariables({ getApp, getAppVariables }: Options): Middleware;
@@ -1,5 +0,0 @@
1
- import { type Options } from '@appsemble/node-utils';
2
- import { type Middleware } from 'koa';
3
- export declare function createGetAssets({ checkRole, getApp, getAppAssets }: Options): Middleware;
4
- export declare function createGetAssetById({ getApp, getAppAssets }: Options): Middleware;
5
- export declare function createCreateAsset({ createAppAsset, getApp }: Options): Middleware;
@@ -1,66 +0,0 @@
1
- import { assertKoaError } from '@appsemble/node-utils';
2
- import { Permission } from '@appsemble/utils';
3
- import { extension } from 'mime-types';
4
- export function createGetAssets({ checkRole, getApp, getAppAssets }) {
5
- return async (ctx) => {
6
- const { pathParams: { appId }, queryParams: { $skip, $top }, } = ctx;
7
- const app = await getApp({ context: ctx, query: { where: { id: appId } } });
8
- assertKoaError(!app, ctx, 404, 'App not found');
9
- const findOptions = {
10
- limit: $top,
11
- offset: $skip,
12
- where: { AppId: app.id },
13
- };
14
- await checkRole({ context: ctx, app, permissions: Permission.ReadAssets, findOptions });
15
- ctx.body = await getAppAssets({ app, context: ctx });
16
- };
17
- }
18
- export function createGetAssetById({ getApp, getAppAssets }) {
19
- return async (ctx) => {
20
- const { pathParams: { appId, assetId }, } = ctx;
21
- const app = await getApp({ context: ctx, query: { where: { id: appId } } });
22
- assertKoaError(!app, ctx, 404, 'App not found');
23
- const assets = await getAppAssets({ app, context: ctx });
24
- // Pick asset id over asset name
25
- const asset = assets.find((a) => a.id === assetId) || assets.find((a) => a.name === assetId);
26
- assertKoaError(!asset, ctx, 404, 'Asset not found');
27
- if (assetId !== asset.id) {
28
- // Redirect to asset using current asset ID
29
- ctx.status = 302;
30
- ctx.set('location', `/api/apps/${app.id}/assets/${asset.id}`);
31
- ctx.type = null;
32
- return;
33
- }
34
- let { filename, mime } = asset;
35
- if (!filename) {
36
- filename = asset.id;
37
- if (mime) {
38
- const ext = extension(mime);
39
- if (ext) {
40
- filename += `.${ext}`;
41
- }
42
- }
43
- }
44
- ctx.set('content-type', mime || 'application/octet-stream');
45
- if (filename) {
46
- ctx.set('content-disposition', `attachment; filename=${JSON.stringify(filename)}`);
47
- }
48
- ctx.set('Cache-Control', 'max-age=31536000,immutable');
49
- ctx.body = asset.data;
50
- };
51
- }
52
- export function createCreateAsset({ createAppAsset, getApp }) {
53
- return async (ctx) => {
54
- const { pathParams: { appId }, request: { body: { file: { contents, filename, mime }, name, }, }, } = ctx;
55
- const app = await getApp({ context: ctx, query: { where: { id: appId } } });
56
- assertKoaError(!app, ctx, 404, 'App not found');
57
- const asset = await createAppAsset({
58
- app,
59
- context: ctx,
60
- payload: { filename, mime, name, data: contents },
61
- });
62
- ctx.status = 201;
63
- ctx.body = { id: asset.id, mime, filename, name };
64
- };
65
- }
66
- //# sourceMappingURL=assets.js.map
@@ -1,3 +0,0 @@
1
- import { type Middleware } from 'koa';
2
- import { type Options } from '../types.js';
3
- export declare function createGetUserInfo({ getAppUserInfo }: Options): Middleware;
@@ -1,7 +0,0 @@
1
- export function createGetUserInfo({ getAppUserInfo }) {
2
- return async (ctx) => {
3
- const { client, user } = ctx;
4
- ctx.body = await getAppUserInfo({ context: ctx, client, user, ctx });
5
- };
6
- }
7
- //# sourceMappingURL=oauth2Provider.js.map
@@ -1,10 +0,0 @@
1
- import { type Options } from '@appsemble/node-utils';
2
- import { type Middleware } from 'koa';
3
- export declare function createQueryResources(options: Options): Middleware;
4
- export declare function createCountResources(options: Options): Middleware;
5
- export declare function createGetResourceById(options: Options): Middleware;
6
- export declare function createCreateResource(options: Options): Middleware;
7
- export declare function createUpdateResource(options: Options): Middleware;
8
- export declare function createDeleteResource(options: Options): Middleware;
9
- export declare function createSeedResource(options: Options): Middleware;
10
- export declare function createDeleteSeedResources(options: Options): Middleware;