@appsemble/node-utils 0.29.11 → 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/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
#  Appsemble Node Utilities
|
|
2
2
|
|
|
3
3
|
> NodeJS utilities used by Appsemble internally.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/@appsemble/node-utils)
|
|
6
|
-
[](https://gitlab.com/appsemble/appsemble/-/releases/0.30.1)
|
|
7
7
|
[](https://prettier.io)
|
|
8
8
|
|
|
9
9
|
## Table of Contents
|
|
@@ -26,5 +26,5 @@ compatibility is not guaranteed.
|
|
|
26
26
|
|
|
27
27
|
## License
|
|
28
28
|
|
|
29
|
-
[LGPL-3.0-only](https://gitlab.com/appsemble/appsemble/-/blob/0.
|
|
29
|
+
[LGPL-3.0-only](https://gitlab.com/appsemble/appsemble/-/blob/0.30.1/LICENSE.md) ©
|
|
30
30
|
[Appsemble](https://appsemble.com)
|
package/app.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type App, type AppsembleMessages
|
|
1
|
+
import { type App, type AppsembleMessages } from '@appsemble/types';
|
|
2
2
|
import { type RemapperContext } from '@appsemble/utils';
|
|
3
3
|
import { type DefaultContext, type DefaultState, type ParameterizedContext } from 'koa';
|
|
4
4
|
import { type Options } from './server/types.js';
|
|
@@ -9,12 +9,11 @@ import { type Options } from './server/types.js';
|
|
|
9
9
|
*
|
|
10
10
|
* @param app The app for which to get the remapper context.
|
|
11
11
|
* @param language The preferred language for the context.
|
|
12
|
-
* @param userInfo The OAuth2 compatible user information.
|
|
13
12
|
* @param options The API utility options.
|
|
14
13
|
* @param context The koa context.
|
|
15
14
|
* @returns A localized remapper context for the app.
|
|
16
15
|
*/
|
|
17
|
-
export declare function getRemapperContext(app: App, language: string,
|
|
16
|
+
export declare function getRemapperContext(app: App, language: string, options: Options, context: ParameterizedContext<DefaultState, DefaultContext, any>): Promise<RemapperContext>;
|
|
18
17
|
/**
|
|
19
18
|
* Patch an app definition of an app inside the `apps` folder.
|
|
20
19
|
*
|
package/app.js
CHANGED
|
@@ -20,14 +20,13 @@ const getPluralRules = memoize((locale, opts) => new Intl.PluralRules(locale, op
|
|
|
20
20
|
*
|
|
21
21
|
* @param app The app for which to get the remapper context.
|
|
22
22
|
* @param language The preferred language for the context.
|
|
23
|
-
* @param userInfo The OAuth2 compatible user information.
|
|
24
23
|
* @param options The API utility options.
|
|
25
24
|
* @param context The koa context.
|
|
26
25
|
* @returns A localized remapper context for the app.
|
|
27
26
|
*/
|
|
28
|
-
export async function getRemapperContext(app, language,
|
|
27
|
+
export async function getRemapperContext(app, language, options, context) {
|
|
29
28
|
var _a, _b;
|
|
30
|
-
const { getAppMessages, getAppUrl, getAppVariables } = options;
|
|
29
|
+
const { getAppMessages, getAppUrl, getAppVariables, getCurrentAppMember } = options;
|
|
31
30
|
const appUrl = String(await getAppUrl({ context, app }));
|
|
32
31
|
const appMessages = await getAppMessages({
|
|
33
32
|
app,
|
|
@@ -35,11 +34,12 @@ export async function getRemapperContext(app, language, userInfo, options, conte
|
|
|
35
34
|
language,
|
|
36
35
|
});
|
|
37
36
|
const appVariables = await getAppVariables({ context, app });
|
|
37
|
+
const appMemberInfo = await getCurrentAppMember({ context });
|
|
38
38
|
const cache = objectCache((message) => new IntlMessageFormat(message, language, undefined, {
|
|
39
39
|
formatters: {
|
|
40
40
|
getNumberFormat,
|
|
41
41
|
getPluralRules,
|
|
42
|
-
getDateTimeFormat: memoize((locale, opts) => new Intl.DateTimeFormat(locale, { ...opts, timeZone:
|
|
42
|
+
getDateTimeFormat: memoize((locale, opts) => new Intl.DateTimeFormat(locale, { ...opts, timeZone: appMemberInfo === null || appMemberInfo === void 0 ? void 0 : appMemberInfo.zoneinfo })),
|
|
43
43
|
},
|
|
44
44
|
}));
|
|
45
45
|
return {
|
|
@@ -55,10 +55,9 @@ export async function getRemapperContext(app, language, userInfo, options, conte
|
|
|
55
55
|
var _a;
|
|
56
56
|
return (_a = appVariables.find((appVariable) => appVariable.name === variableName)) === null || _a === void 0 ? void 0 : _a.value;
|
|
57
57
|
},
|
|
58
|
-
|
|
59
|
-
appMember: userInfo === null || userInfo === void 0 ? void 0 : userInfo.appMember,
|
|
58
|
+
appMemberInfo,
|
|
60
59
|
context: {},
|
|
61
|
-
locale: (_b = (_a =
|
|
60
|
+
locale: (_b = (_a = appMemberInfo === null || appMemberInfo === void 0 ? void 0 : appMemberInfo.locale) !== null && _a !== void 0 ? _a : app.definition.defaultLanguage) !== null && _b !== void 0 ? _b : defaultLocale,
|
|
62
61
|
};
|
|
63
62
|
}
|
|
64
63
|
function replaceStyle(stylesheet, selector, property, value) {
|
package/authentication.js
CHANGED
|
@@ -60,7 +60,7 @@ export async function authenticate(remote, scope, inputCredentials) {
|
|
|
60
60
|
return;
|
|
61
61
|
}
|
|
62
62
|
logger.verbose(`Logging in to ${remote}`);
|
|
63
|
-
const { data } = await axios.post('/oauth2/token', new URLSearchParams({ grant_type: 'client_credentials', scope }), {
|
|
63
|
+
const { data } = await axios.post('/auth/oauth2/token', new URLSearchParams({ grant_type: 'client_credentials', scope }), {
|
|
64
64
|
headers: { authorization: `Basic ${Buffer.from(credentials).toString('base64')}` },
|
|
65
65
|
baseURL: remote,
|
|
66
66
|
});
|
package/index.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export * from './koa.js';
|
|
|
33
33
|
export { bulmaVersion, faVersion, version } from './versions.cjs';
|
|
34
34
|
export * from './EmailQuotaExceededError.js';
|
|
35
35
|
export * from './EmailError.js';
|
|
36
|
-
export * from './
|
|
36
|
+
export * from './AppMemberPropertiesError.js';
|
|
37
37
|
export * from './authentication.js';
|
|
38
38
|
export * from './getMessagesUtil.js';
|
|
39
39
|
export * from './container/index.js';
|
package/index.js
CHANGED
|
@@ -33,7 +33,7 @@ export * from './koa.js';
|
|
|
33
33
|
export { bulmaVersion, faVersion, version } from './versions.cjs';
|
|
34
34
|
export * from './EmailQuotaExceededError.js';
|
|
35
35
|
export * from './EmailError.js';
|
|
36
|
-
export * from './
|
|
36
|
+
export * from './AppMemberPropertiesError.js';
|
|
37
37
|
export * from './authentication.js';
|
|
38
38
|
export * from './getMessagesUtil.js';
|
|
39
39
|
export * from './container/index.js';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@appsemble/node-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.1",
|
|
4
4
|
"description": "NodeJS utilities used by Appsemble internally.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"app",
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
"test": "vitest"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@appsemble/types": "0.
|
|
42
|
-
"@appsemble/utils": "0.
|
|
41
|
+
"@appsemble/types": "0.30.1",
|
|
42
|
+
"@appsemble/utils": "0.30.1",
|
|
43
43
|
"@formatjs/fast-memoize": "^2.0.0",
|
|
44
44
|
"@fortawesome/fontawesome-free": "^6.0.0",
|
|
45
45
|
"@kubernetes/client-node": "0.21.0",
|
package/resource.d.ts
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type App, type ResourceDefinition, type Resource as ResourceType } from '@appsemble/types';
|
|
1
|
+
import { type AppDefinition, type ResourceDefinition, type Resource as ResourceType } from '@appsemble/types';
|
|
3
2
|
import { type PreValidatePropertyFunction } from 'jsonschema';
|
|
4
3
|
import { type Context, type DefaultContext, type DefaultState, type ParameterizedContext } from 'koa';
|
|
5
4
|
import { type File } from 'koas-body-parser';
|
|
6
|
-
|
|
5
|
+
import { type PreparedAsset } from './index.js';
|
|
6
|
+
export declare function stripResource({ $author, $created, $editor, $ephemeral, $group, $seed, $updated, ...data }: ResourceType): Record<string, unknown>;
|
|
7
7
|
/**
|
|
8
8
|
* Get the resource definition of an app by name.
|
|
9
9
|
*
|
|
10
10
|
* If there is no match, a 404 HTTP error is thrown.
|
|
11
11
|
*
|
|
12
|
-
* @param
|
|
12
|
+
* @param appDefinition The app definition to get the resource definition of
|
|
13
13
|
* @param resourceType The name of the resource definition to get.
|
|
14
14
|
* @param ctx Context used to throw back the errors.
|
|
15
15
|
* @param view The view that’s being used.
|
|
16
16
|
* @returns The matching resource definition.
|
|
17
17
|
*/
|
|
18
|
-
export declare function getResourceDefinition(
|
|
18
|
+
export declare function getResourceDefinition(appDefinition: AppDefinition, resourceType: string, ctx?: Context, view?: string): ResourceDefinition;
|
|
19
19
|
/**
|
|
20
20
|
* Extracts the IDs of resource request body.
|
|
21
21
|
*
|
package/resource.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto';
|
|
2
|
-
import { handleValidatorResult } from '@appsemble/node-utils';
|
|
3
2
|
import { addMilliseconds, isPast, parseISO } from 'date-fns';
|
|
4
3
|
import { ValidationError, Validator } from 'jsonschema';
|
|
5
4
|
import parseDuration from 'parse-duration';
|
|
6
5
|
import { preProcessCSV } from './csv.js';
|
|
6
|
+
import { handleValidatorResult } from './index.js';
|
|
7
7
|
import { throwKoaError } from './koa.js';
|
|
8
|
-
export function stripResource({ $author, $created, $editor, $ephemeral, $seed, $updated, ...data }) {
|
|
8
|
+
export function stripResource({ $author, $created, $editor, $ephemeral, $group, $seed, $updated, ...data }) {
|
|
9
9
|
return data;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
@@ -13,15 +13,15 @@ export function stripResource({ $author, $created, $editor, $ephemeral, $seed, $
|
|
|
13
13
|
*
|
|
14
14
|
* If there is no match, a 404 HTTP error is thrown.
|
|
15
15
|
*
|
|
16
|
-
* @param
|
|
16
|
+
* @param appDefinition The app definition to get the resource definition of
|
|
17
17
|
* @param resourceType The name of the resource definition to get.
|
|
18
18
|
* @param ctx Context used to throw back the errors.
|
|
19
19
|
* @param view The view that’s being used.
|
|
20
20
|
* @returns The matching resource definition.
|
|
21
21
|
*/
|
|
22
|
-
export function getResourceDefinition(
|
|
22
|
+
export function getResourceDefinition(appDefinition, resourceType, ctx, view) {
|
|
23
23
|
var _a;
|
|
24
|
-
if (!
|
|
24
|
+
if (!appDefinition) {
|
|
25
25
|
if (ctx === undefined) {
|
|
26
26
|
throw new Error('App not found');
|
|
27
27
|
}
|
|
@@ -29,7 +29,7 @@ export function getResourceDefinition(app, resourceType, ctx, view) {
|
|
|
29
29
|
throwKoaError(ctx, 404, 'App not found');
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
-
const definition = (_a =
|
|
32
|
+
const definition = (_a = appDefinition.resources) === null || _a === void 0 ? void 0 : _a[resourceType];
|
|
33
33
|
if (!definition) {
|
|
34
34
|
if (ctx === undefined || ctx.response === undefined) {
|
|
35
35
|
throw new Error(`App does not have resources called ${resourceType}`);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createProxyDeleteController } from './createProxyDeleteController.js';
|
|
2
|
+
export { createProxyGetController } from './createProxyGetController.js';
|
|
3
|
+
export { createProxyPatchController } from './createProxyPatchController.js';
|
|
4
|
+
export { createProxyPostController } from './createProxyPostController.js';
|
|
5
|
+
export { createProxyPutController } from './createProxyPutController.js';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { createProxyDeleteController } from './createProxyDeleteController.js';
|
|
2
|
+
export { createProxyGetController } from './createProxyGetController.js';
|
|
3
|
+
export { createProxyPatchController } from './createProxyPatchController.js';
|
|
4
|
+
export { createProxyPostController } from './createProxyPostController.js';
|
|
5
|
+
export { createProxyPutController } from './createProxyPutController.js';
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createGetCurrentAppMemberController } from './createGetCurrentAppMemberController.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './current/index.js';
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { extension } from 'mime-types';
|
|
2
|
+
import { assertKoaError } from '../../../../../koa.js';
|
|
3
|
+
export function createGetAppAssetByIdController({ getApp, getAppAssets }) {
|
|
4
|
+
return async (ctx) => {
|
|
5
|
+
const { pathParams: { appId, assetId }, } = ctx;
|
|
6
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
7
|
+
assertKoaError(!app, ctx, 404, 'App not found');
|
|
8
|
+
const assets = await getAppAssets({ app, context: ctx });
|
|
9
|
+
// Pick asset id over asset name
|
|
10
|
+
const asset = assets.find((a) => a.id === assetId) || assets.find((a) => a.name === assetId);
|
|
11
|
+
assertKoaError(!asset, ctx, 404, 'Asset not found');
|
|
12
|
+
if (assetId !== asset.id) {
|
|
13
|
+
// Redirect to asset using current asset ID
|
|
14
|
+
ctx.status = 302;
|
|
15
|
+
ctx.set('location', `/api/apps/${app.id}/assets/${asset.id}`);
|
|
16
|
+
ctx.type = null;
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
let { filename, mime } = asset;
|
|
20
|
+
if (!filename) {
|
|
21
|
+
filename = asset.id;
|
|
22
|
+
if (mime) {
|
|
23
|
+
const ext = extension(mime);
|
|
24
|
+
if (ext) {
|
|
25
|
+
filename += `.${ext}`;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
ctx.set('content-type', mime || 'application/octet-stream');
|
|
30
|
+
if (filename) {
|
|
31
|
+
ctx.set('content-disposition', `attachment; filename=${JSON.stringify(filename)}`);
|
|
32
|
+
}
|
|
33
|
+
ctx.set('Cache-Control', 'max-age=31536000,immutable');
|
|
34
|
+
ctx.body = asset.data;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=createGetAppAssetByIdController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createGetAppAssetByIdController } from './createGetAppAssetByIdController.js';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AppPermission } from '@appsemble/types';
|
|
2
|
+
import { assertKoaError } from '../../../../../koa.js';
|
|
3
|
+
export function createGetAppGroupsController({ checkAuthSubjectAppPermissions, getApp, getAppGroups, }) {
|
|
4
|
+
return async (ctx) => {
|
|
5
|
+
const { pathParams: { appId }, } = ctx;
|
|
6
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
7
|
+
assertKoaError(!app, ctx, 404, 'App not found');
|
|
8
|
+
await checkAuthSubjectAppPermissions({
|
|
9
|
+
app,
|
|
10
|
+
context: ctx,
|
|
11
|
+
permissions: [AppPermission.QueryGroups],
|
|
12
|
+
});
|
|
13
|
+
ctx.body = await getAppGroups({ context: ctx, app });
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=createGetAppGroupsController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createGetAppGroupsController } from './createGetAppGroupsController.js';
|
package/server/controllers/{appMessages.js → common/apps/messages/createGetAppMessagesController.js}
RENAMED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { getMessagesUtil } from '
|
|
2
|
-
export function
|
|
1
|
+
import { getMessagesUtil } from '../../../../../index.js';
|
|
2
|
+
export function createGetAppMessagesController(options) {
|
|
3
3
|
return async (ctx) => {
|
|
4
4
|
const { pathParams: { appId, language }, query: { merge, override = 'true' }, } = ctx;
|
|
5
5
|
ctx.body = await getMessagesUtil(ctx, language, appId, merge, options, override);
|
|
6
6
|
};
|
|
7
7
|
}
|
|
8
|
-
//# sourceMappingURL=
|
|
8
|
+
//# sourceMappingURL=createGetAppMessagesController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createGetAppMessagesController } from './createGetAppMessagesController.js';
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { generateResourceQuery } from '../../../../utils/resources.js';
|
|
2
|
+
export function createCountAppResourcesController(options) {
|
|
3
|
+
return async (ctx) => {
|
|
4
|
+
const { pathParams: { appId, resourceType }, queryParams: { $own, selectedGroupId }, user: authSubject, } = ctx;
|
|
5
|
+
const { checkAppPermissions, getApp, getAppResources } = options;
|
|
6
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
7
|
+
await checkAppPermissions({
|
|
8
|
+
context: ctx,
|
|
9
|
+
permissions: [
|
|
10
|
+
$own ? `$resource:${resourceType}:own:query` : `$resource:${resourceType}:query`,
|
|
11
|
+
],
|
|
12
|
+
app,
|
|
13
|
+
groupId: selectedGroupId,
|
|
14
|
+
});
|
|
15
|
+
const { where } = generateResourceQuery(ctx, options);
|
|
16
|
+
const findOptions = {
|
|
17
|
+
where: {
|
|
18
|
+
and: [
|
|
19
|
+
where || {},
|
|
20
|
+
{
|
|
21
|
+
type: resourceType,
|
|
22
|
+
AppId: appId,
|
|
23
|
+
GroupId: selectedGroupId !== null && selectedGroupId !== void 0 ? selectedGroupId : null,
|
|
24
|
+
expires: { or: [{ gt: new Date() }, null] },
|
|
25
|
+
...(app.demoMode ? { seed: false, ephemeral: true } : {}),
|
|
26
|
+
...($own ? { AuthorId: authSubject === null || authSubject === void 0 ? void 0 : authSubject.id } : {}),
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
const resources = await getAppResources({
|
|
32
|
+
app,
|
|
33
|
+
findOptions,
|
|
34
|
+
type: resourceType,
|
|
35
|
+
context: ctx,
|
|
36
|
+
});
|
|
37
|
+
ctx.body = resources.length;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=createCountAppResourcesController.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type Middleware } from 'koa';
|
|
2
|
+
import { type Options } from '../../../../../index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Create a controller for resource creation.
|
|
5
|
+
*
|
|
6
|
+
* The created controller handles resource creation of one or more resources,
|
|
7
|
+
* extracted from the request body.
|
|
8
|
+
*
|
|
9
|
+
* The controller can be used to seed resources into an app when the endpoint is
|
|
10
|
+
* called from the CLI with the `seed` parameter equal to `true`.
|
|
11
|
+
*
|
|
12
|
+
* @param options The options object to use for resource creation
|
|
13
|
+
* @returns A middleware function that handles resource creation.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createCreateAppResourceController(options: Options): Middleware;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { isDeepStrictEqual } from 'node:util';
|
|
3
|
+
import { getResourceDefinition, processResourceBody } from '../../../../../index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Create a controller for resource creation.
|
|
6
|
+
*
|
|
7
|
+
* The created controller handles resource creation of one or more resources,
|
|
8
|
+
* extracted from the request body.
|
|
9
|
+
*
|
|
10
|
+
* The controller can be used to seed resources into an app when the endpoint is
|
|
11
|
+
* called from the CLI with the `seed` parameter equal to `true`.
|
|
12
|
+
*
|
|
13
|
+
* @param options The options object to use for resource creation
|
|
14
|
+
* @returns A middleware function that handles resource creation.
|
|
15
|
+
*/
|
|
16
|
+
export function createCreateAppResourceController(options) {
|
|
17
|
+
return async (ctx) => {
|
|
18
|
+
const { pathParams: { appId, resourceType }, query, queryParams: { selectedGroupId }, } = ctx;
|
|
19
|
+
const { checkAppPermissions, createAppResourcesWithAssets, getApp, getAppAssets } = options;
|
|
20
|
+
const app = await getApp({ context: ctx, query: { where: { id: appId } } });
|
|
21
|
+
await checkAppPermissions({
|
|
22
|
+
context: ctx,
|
|
23
|
+
permissions: [`$resource:${resourceType}:create`],
|
|
24
|
+
app,
|
|
25
|
+
groupId: selectedGroupId,
|
|
26
|
+
});
|
|
27
|
+
const resourceDefinition = getResourceDefinition(app.definition, resourceType, ctx);
|
|
28
|
+
const appAssets = await getAppAssets({ app, context: ctx });
|
|
29
|
+
const [processedBody, preparedAssets] = processResourceBody(ctx, resourceDefinition, undefined, undefined, appAssets.map((appAsset) => ({ id: appAsset.id, name: appAsset.name })));
|
|
30
|
+
if (Array.isArray(processedBody) && !processedBody.length) {
|
|
31
|
+
ctx.body = [];
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const resources = Array.isArray(processedBody) ? processedBody : [processedBody];
|
|
35
|
+
if (!(ctx.client && 'app' in ctx.client) && (query === null || query === void 0 ? void 0 : query.seed) === 'true') {
|
|
36
|
+
const preparedSeedAssets = structuredClone(preparedAssets);
|
|
37
|
+
const preparedSeedResources = resources.map((resource) => {
|
|
38
|
+
var _a;
|
|
39
|
+
const cleanResource = { ...resource };
|
|
40
|
+
if (app.demoMode) {
|
|
41
|
+
for (const referencedProperty of Object.keys((_a = resourceDefinition.references) !== null && _a !== void 0 ? _a : {})) {
|
|
42
|
+
delete cleanResource[referencedProperty];
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
...cleanResource,
|
|
47
|
+
$seed: true,
|
|
48
|
+
$ephemeral: false,
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
for (const preparedSeedAsset of preparedSeedAssets) {
|
|
52
|
+
const index = resources.findIndex(({ $clonable: clonable, $ephemeral: ephemeral, $seed: unused, ...cleanResource }) => {
|
|
53
|
+
const { $clonable, $ephemeral, $seed, ...cleanAssetResource } = preparedSeedAsset.resource;
|
|
54
|
+
return isDeepStrictEqual(cleanResource, cleanAssetResource);
|
|
55
|
+
});
|
|
56
|
+
const previousAssetId = preparedSeedAsset.id;
|
|
57
|
+
const newAssetId = randomUUID();
|
|
58
|
+
const updatedResource = JSON.parse(JSON.stringify(preparedSeedResources[index]).replace(previousAssetId, newAssetId));
|
|
59
|
+
preparedSeedAsset.id = newAssetId;
|
|
60
|
+
preparedSeedAsset.resource = updatedResource;
|
|
61
|
+
preparedSeedResources[index] = updatedResource;
|
|
62
|
+
}
|
|
63
|
+
const createdSeedResources = await createAppResourcesWithAssets({
|
|
64
|
+
app,
|
|
65
|
+
groupId: selectedGroupId,
|
|
66
|
+
context: ctx,
|
|
67
|
+
resources: preparedSeedResources,
|
|
68
|
+
preparedAssets: preparedSeedAssets,
|
|
69
|
+
resourceType,
|
|
70
|
+
options,
|
|
71
|
+
});
|
|
72
|
+
if (!app.demoMode) {
|
|
73
|
+
ctx.body = Array.isArray(processedBody) ? createdSeedResources : createdSeedResources[0];
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const createdResources = await createAppResourcesWithAssets({
|
|
78
|
+
app,
|
|
79
|
+
groupId: selectedGroupId,
|
|
80
|
+
context: ctx,
|
|
81
|
+
resources: resources.map((resource) => ({
|
|
82
|
+
...resource,
|
|
83
|
+
$seed: false,
|
|
84
|
+
$ephemeral: app.demoMode,
|
|
85
|
+
...(app.demoMode ? { $clonable: false } : {}),
|
|
86
|
+
})),
|
|
87
|
+
preparedAssets,
|
|
88
|
+
resourceType,
|
|
89
|
+
options,
|
|
90
|
+
});
|
|
91
|
+
ctx.body = Array.isArray(processedBody) ? createdResources : createdResources[0];
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=createCreateAppResourceController.js.map
|