@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.
Files changed (100) hide show
  1. package/AppMemberPropertiesError.d.ts +3 -0
  2. package/AppMemberPropertiesError.js +8 -0
  3. package/README.md +3 -3
  4. package/app.d.ts +2 -3
  5. package/app.js +6 -7
  6. package/authentication.js +1 -1
  7. package/index.d.ts +1 -1
  8. package/index.js +1 -1
  9. package/package.json +3 -3
  10. package/resource.d.ts +5 -5
  11. package/resource.js +6 -6
  12. package/server/controllers/apps/actions/createProxyDeleteController.d.ts +3 -0
  13. package/server/controllers/apps/actions/createProxyDeleteController.js +5 -0
  14. package/server/controllers/apps/actions/createProxyGetController.d.ts +3 -0
  15. package/server/controllers/apps/actions/createProxyGetController.js +5 -0
  16. package/server/controllers/apps/actions/createProxyPatchController.d.ts +3 -0
  17. package/server/controllers/apps/actions/createProxyPatchController.js +5 -0
  18. package/server/controllers/apps/actions/createProxyPostController.d.ts +3 -0
  19. package/server/controllers/apps/actions/createProxyPostController.js +5 -0
  20. package/server/controllers/apps/actions/createProxyPutController.d.ts +3 -0
  21. package/server/controllers/apps/actions/createProxyPutController.js +5 -0
  22. package/server/controllers/apps/actions/index.d.ts +5 -0
  23. package/server/controllers/apps/actions/index.js +6 -0
  24. package/server/controllers/apps/index.d.ts +2 -0
  25. package/server/controllers/apps/index.js +3 -0
  26. package/server/controllers/apps/members/current/createGetCurrentAppMemberController.d.ts +3 -0
  27. package/server/controllers/apps/members/current/createGetCurrentAppMemberController.js +6 -0
  28. package/server/controllers/apps/members/current/index.d.ts +1 -0
  29. package/server/controllers/apps/members/current/index.js +2 -0
  30. package/server/controllers/apps/members/index.d.ts +1 -0
  31. package/server/controllers/apps/members/index.js +2 -0
  32. package/server/controllers/common/apps/assets/createGetAppAssetByIdController.d.ts +3 -0
  33. package/server/controllers/common/apps/assets/createGetAppAssetByIdController.js +37 -0
  34. package/server/controllers/common/apps/assets/index.d.ts +1 -0
  35. package/server/controllers/common/apps/assets/index.js +2 -0
  36. package/server/controllers/common/apps/groups/createGetAppGroupsController.d.ts +3 -0
  37. package/server/controllers/common/apps/groups/createGetAppGroupsController.js +16 -0
  38. package/server/controllers/common/apps/groups/index.d.ts +1 -0
  39. package/server/controllers/common/apps/groups/index.js +2 -0
  40. package/server/controllers/common/apps/index.d.ts +5 -0
  41. package/server/controllers/common/apps/index.js +6 -0
  42. package/server/controllers/common/apps/messages/createGetAppMessagesController.d.ts +3 -0
  43. package/server/controllers/{appMessages.js → common/apps/messages/createGetAppMessagesController.js} +3 -3
  44. package/server/controllers/common/apps/messages/index.d.ts +1 -0
  45. package/server/controllers/common/apps/messages/index.js +2 -0
  46. package/server/controllers/{appMessages.d.ts → common/apps/resources/createCountAppResourcesController.d.ts} +1 -1
  47. package/server/controllers/common/apps/resources/createCountAppResourcesController.js +40 -0
  48. package/server/controllers/common/apps/resources/createCreateAppResourceController.d.ts +15 -0
  49. package/server/controllers/common/apps/resources/createCreateAppResourceController.js +94 -0
  50. package/server/controllers/common/apps/resources/createDeleteAppResourceController.d.ts +3 -0
  51. package/server/controllers/common/apps/resources/createDeleteAppResourceController.js +46 -0
  52. package/server/controllers/common/apps/resources/createGetAppResourceByIdController.d.ts +3 -0
  53. package/server/controllers/common/apps/resources/createGetAppResourceByIdController.js +48 -0
  54. package/server/controllers/common/apps/resources/createQueryAppResourcesController.d.ts +3 -0
  55. package/server/controllers/common/apps/resources/createQueryAppResourcesController.js +58 -0
  56. package/server/controllers/common/apps/resources/createUpdateAppResourceController.d.ts +3 -0
  57. package/server/controllers/common/apps/resources/createUpdateAppResourceController.js +53 -0
  58. package/server/controllers/common/apps/resources/index.d.ts +6 -0
  59. package/server/controllers/common/apps/resources/index.js +7 -0
  60. package/server/controllers/{resources.test.js → common/apps/resources/resources.test.js} +44 -32
  61. package/server/controllers/common/apps/variables/createGetAppVariablesController.d.ts +3 -0
  62. package/server/controllers/{appVariables.js → common/apps/variables/createGetAppVariablesController.js} +4 -5
  63. package/server/controllers/common/apps/variables/index.d.ts +1 -0
  64. package/server/controllers/common/apps/variables/index.js +2 -0
  65. package/server/controllers/common/index.d.ts +1 -0
  66. package/server/controllers/common/index.js +2 -0
  67. package/server/controllers/index.d.ts +3 -8
  68. package/server/controllers/index.js +3 -8
  69. package/server/controllers/main/apps/assets/createCreateAppAssetController.d.ts +3 -0
  70. package/server/controllers/main/apps/assets/createCreateAppAssetController.js +16 -0
  71. package/server/controllers/main/apps/assets/index.d.ts +1 -0
  72. package/server/controllers/main/apps/assets/index.js +2 -0
  73. package/server/controllers/main/apps/index.d.ts +2 -0
  74. package/server/controllers/main/apps/index.js +3 -0
  75. package/server/controllers/main/apps/resources/createDeleteAppSeedResourcesController.d.ts +3 -0
  76. package/server/controllers/main/apps/resources/createDeleteAppSeedResourcesController.js +15 -0
  77. package/server/controllers/main/apps/resources/index.d.ts +1 -0
  78. package/server/controllers/main/apps/resources/index.js +2 -0
  79. package/server/controllers/main/index.d.ts +1 -0
  80. package/server/controllers/main/index.js +2 -0
  81. package/server/types.d.ts +51 -61
  82. package/server/utils/actions.d.ts +6 -0
  83. package/server/{controllers/action.js → utils/actions.js} +19 -50
  84. package/server/utils/resources.d.ts +8 -0
  85. package/server/utils/resources.js +51 -0
  86. package/UserPropertiesError.d.ts +0 -3
  87. package/UserPropertiesError.js +0 -8
  88. package/server/controllers/action.d.ts +0 -7
  89. package/server/controllers/appMembers.d.ts +0 -3
  90. package/server/controllers/appMembers.js +0 -13
  91. package/server/controllers/appVariables.d.ts +0 -3
  92. package/server/controllers/assets.d.ts +0 -5
  93. package/server/controllers/assets.js +0 -66
  94. package/server/controllers/oauth2Provider.d.ts +0 -3
  95. package/server/controllers/oauth2Provider.js +0 -7
  96. package/server/controllers/resources.d.ts +0 -10
  97. package/server/controllers/resources.js +0 -402
  98. package/server/controllers/teams.d.ts +0 -3
  99. package/server/controllers/teams.js +0 -10
  100. /package/server/controllers/{resources.test.d.ts → common/apps/resources/resources.test.d.ts} +0 -0
@@ -0,0 +1,3 @@
1
+ export declare class AppMemberPropertiesError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -0,0 +1,8 @@
1
+ export class AppMemberPropertiesError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'AppMemberPropertiesError';
5
+ Error.captureStackTrace(this, AppMemberPropertiesError);
6
+ }
7
+ }
8
+ //# sourceMappingURL=AppMemberPropertiesError.js.map
package/README.md CHANGED
@@ -1,9 +1,9 @@
1
- # ![](https://gitlab.com/appsemble/appsemble/-/raw/0.29.11/config/assets/logo.svg) Appsemble Node Utilities
1
+ # ![](https://gitlab.com/appsemble/appsemble/-/raw/0.30.1/config/assets/logo.svg) Appsemble Node Utilities
2
2
 
3
3
  > NodeJS utilities used by Appsemble internally.
4
4
 
5
5
  [![npm](https://img.shields.io/npm/v/@appsemble/node-utils)](https://www.npmjs.com/package/@appsemble/node-utils)
6
- [![GitLab CI](https://gitlab.com/appsemble/appsemble/badges/0.29.11/pipeline.svg)](https://gitlab.com/appsemble/appsemble/-/releases/0.29.11)
6
+ [![GitLab CI](https://gitlab.com/appsemble/appsemble/badges/0.30.1/pipeline.svg)](https://gitlab.com/appsemble/appsemble/-/releases/0.30.1)
7
7
  [![Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](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.11/LICENSE.md) ©
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, type UserInfo } from '@appsemble/types';
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, userInfo: UserInfo, options: Options, context: ParameterizedContext<DefaultState, DefaultContext, any>): Promise<RemapperContext>;
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, userInfo, options, context) {
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: userInfo === null || userInfo === void 0 ? void 0 : userInfo.zoneinfo })),
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
- userInfo,
59
- appMember: userInfo === null || userInfo === void 0 ? void 0 : userInfo.appMember,
58
+ appMemberInfo,
60
59
  context: {},
61
- locale: (_b = (_a = userInfo === null || userInfo === void 0 ? void 0 : userInfo.locale) !== null && _a !== void 0 ? _a : app.definition.defaultLanguage) !== null && _b !== void 0 ? _b : defaultLocale,
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 './UserPropertiesError.js';
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 './UserPropertiesError.js';
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.29.11",
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.29.11",
42
- "@appsemble/utils": "0.29.11",
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 PreparedAsset } from '@appsemble/node-utils';
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
- export declare function stripResource({ $author, $created, $editor, $ephemeral, $seed, $updated, ...data }: ResourceType): Record<string, unknown>;
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 app The app to get the resource definition of
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(app: App, resourceType: string, ctx?: Context, view?: string): ResourceDefinition;
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 app The app to get the resource definition of
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(app, resourceType, ctx, view) {
22
+ export function getResourceDefinition(appDefinition, resourceType, ctx, view) {
23
23
  var _a;
24
- if (!app) {
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 = app.definition.resources) === null || _a === void 0 ? void 0 : _a[resourceType];
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,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../types.js';
3
+ export declare function createProxyDeleteController(options: Options): Middleware;
@@ -0,0 +1,5 @@
1
+ import { createProxyHandler } from '../../../utils/actions.js';
2
+ export function createProxyDeleteController(options) {
3
+ return createProxyHandler(false, options);
4
+ }
5
+ //# sourceMappingURL=createProxyDeleteController.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../types.js';
3
+ export declare function createProxyGetController(options: Options): Middleware;
@@ -0,0 +1,5 @@
1
+ import { createProxyHandler } from '../../../utils/actions.js';
2
+ export function createProxyGetController(options) {
3
+ return createProxyHandler(false, options);
4
+ }
5
+ //# sourceMappingURL=createProxyGetController.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../types.js';
3
+ export declare function createProxyPatchController(options: Options): Middleware;
@@ -0,0 +1,5 @@
1
+ import { createProxyHandler } from '../../../utils/actions.js';
2
+ export function createProxyPatchController(options) {
3
+ return createProxyHandler(true, options);
4
+ }
5
+ //# sourceMappingURL=createProxyPatchController.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../types.js';
3
+ export declare function createProxyPostController(options: Options): Middleware;
@@ -0,0 +1,5 @@
1
+ import { createProxyHandler } from '../../../utils/actions.js';
2
+ export function createProxyPostController(options) {
3
+ return createProxyHandler(true, options);
4
+ }
5
+ //# sourceMappingURL=createProxyPostController.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../types.js';
3
+ export declare function createProxyPutController(options: Options): Middleware;
@@ -0,0 +1,5 @@
1
+ import { createProxyHandler } from '../../../utils/actions.js';
2
+ export function createProxyPutController(options) {
3
+ return createProxyHandler(true, options);
4
+ }
5
+ //# sourceMappingURL=createProxyPutController.js.map
@@ -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,2 @@
1
+ export * from './actions/index.js';
2
+ export * from './members/index.js';
@@ -0,0 +1,3 @@
1
+ export * from './actions/index.js';
2
+ export * from './members/index.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../../types.js';
3
+ export declare function createGetCurrentAppMemberController({ getCurrentAppMember }: Options): Middleware;
@@ -0,0 +1,6 @@
1
+ export function createGetCurrentAppMemberController({ getCurrentAppMember }) {
2
+ return async (ctx) => {
3
+ ctx.body = await getCurrentAppMember({ context: ctx });
4
+ };
5
+ }
6
+ //# sourceMappingURL=createGetCurrentAppMemberController.js.map
@@ -0,0 +1 @@
1
+ export { createGetCurrentAppMemberController } from './createGetCurrentAppMemberController.js';
@@ -0,0 +1,2 @@
1
+ export { createGetCurrentAppMemberController } from './createGetCurrentAppMemberController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ export * from './current/index.js';
@@ -0,0 +1,2 @@
1
+ export * from './current/index.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../../types.js';
3
+ export declare function createGetAppAssetByIdController({ getApp, getAppAssets }: Options): Middleware;
@@ -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,2 @@
1
+ export { createGetAppAssetByIdController } from './createGetAppAssetByIdController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../../types.js';
3
+ export declare function createGetAppGroupsController({ checkAuthSubjectAppPermissions, getApp, getAppGroups, }: Options): Middleware;
@@ -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';
@@ -0,0 +1,2 @@
1
+ export { createGetAppGroupsController } from './createGetAppGroupsController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,5 @@
1
+ export * from './assets/index.js';
2
+ export * from './groups/index.js';
3
+ export * from './messages/index.js';
4
+ export * from './resources/index.js';
5
+ export * from './variables/index.js';
@@ -0,0 +1,6 @@
1
+ export * from './assets/index.js';
2
+ export * from './groups/index.js';
3
+ export * from './messages/index.js';
4
+ export * from './resources/index.js';
5
+ export * from './variables/index.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,3 @@
1
+ import { type Middleware } from 'koa';
2
+ import { type Options } from '../../../../../index.js';
3
+ export declare function createGetAppMessagesController(options: Options): Middleware;
@@ -1,8 +1,8 @@
1
- import { getMessagesUtil } from '@appsemble/node-utils';
2
- export function createGetMessages(options) {
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=appMessages.js.map
8
+ //# sourceMappingURL=createGetAppMessagesController.js.map
@@ -0,0 +1 @@
1
+ export { createGetAppMessagesController } from './createGetAppMessagesController.js';
@@ -0,0 +1,2 @@
1
+ export { createGetAppMessagesController } from './createGetAppMessagesController.js';
2
+ //# sourceMappingURL=index.js.map
@@ -1,3 +1,3 @@
1
1
  import { type Options } from '@appsemble/node-utils';
2
2
  import { type Middleware } from 'koa';
3
- export declare function createGetMessages(options: Options): Middleware;
3
+ export declare function createCountAppResourcesController(options: Options): Middleware;
@@ -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
@@ -0,0 +1,3 @@
1
+ import { type Options } from '@appsemble/node-utils';
2
+ import { type Middleware } from 'koa';
3
+ export declare function createDeleteAppResourceController(options: Options): Middleware;