@appsemble/node-utils 0.29.10 → 0.30.1
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
package/server/types.d.ts
CHANGED
|
@@ -1,18 +1,9 @@
|
|
|
1
|
-
import { type App, type AppConfigEntry, type
|
|
2
|
-
import { type IdentifiableBlock
|
|
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
|
|
5
|
-
export interface
|
|
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:
|
|
29
|
-
|
|
30
|
-
|
|
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:
|
|
51
|
-
basic:
|
|
52
|
-
cli:
|
|
53
|
-
scim:
|
|
54
|
-
studio:
|
|
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
|
-
|
|
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
|
-
|
|
73
|
+
groupId: number;
|
|
81
74
|
token: string;
|
|
82
|
-
|
|
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
|
|
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
|
|
207
|
+
export interface ApplyAppServiceSecretsParams {
|
|
226
208
|
context: ParameterizedContext<DefaultState, DefaultContextInterface, any>;
|
|
227
209
|
app: App;
|
|
228
|
-
|
|
229
|
-
action: Action;
|
|
230
|
-
options: Options;
|
|
231
|
-
ctx: Context;
|
|
210
|
+
axiosConfig: RawAxiosRequestConfig<any>;
|
|
232
211
|
}
|
|
233
|
-
export interface
|
|
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
|
|
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
|
-
|
|
242
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 },
|
|
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
|
|
22
|
-
await reloadUser({ context: ctx });
|
|
20
|
+
const { email } = options;
|
|
23
21
|
try {
|
|
24
|
-
await email({ action, data, mailer,
|
|
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
|
-
|
|
36
|
-
const {
|
|
37
|
-
const
|
|
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
|
|
74
|
-
const { method, query, request: { body, headers },
|
|
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
|
-
|
|
94
|
-
|
|
95
|
-
const remapperContext = await getRemapperContext(app, app.definition.defaultLanguage || defaultLocale,
|
|
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+\/
|
|
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: (
|
|
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, (
|
|
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
|
-
|
|
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
|
package/UserPropertiesError.d.ts
DELETED
package/UserPropertiesError.js
DELETED
|
@@ -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,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,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,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;
|