@balena/pinejs 17.1.0-build-joshbwlng-tasks-e8a81b1d884e0039e67661a25a5cb81d46966640-1 → 17.1.0-build-model-based-typings-a10277597a28577bcb204b378925c9df795a10e8-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 (64) hide show
  1. package/.pinejs-cache.json +1 -1
  2. package/.versionbot/CHANGELOG.yml +220 -7
  3. package/CHANGELOG.md +65 -2
  4. package/out/config-loader/env.d.ts +0 -4
  5. package/out/config-loader/env.js +1 -5
  6. package/out/config-loader/env.js.map +1 -1
  7. package/out/data-server/sbvr-server.js +3 -2
  8. package/out/data-server/sbvr-server.js.map +1 -1
  9. package/out/database-layer/db.d.ts +0 -3
  10. package/out/database-layer/db.js +0 -17
  11. package/out/database-layer/db.js.map +1 -1
  12. package/out/migrator/migrations.d.ts +113 -0
  13. package/out/migrator/migrations.js +3 -0
  14. package/out/migrator/migrations.js.map +1 -0
  15. package/out/migrator/sync.d.ts +17 -0
  16. package/out/migrator/sync.js +39 -40
  17. package/out/migrator/sync.js.map +1 -1
  18. package/out/sbvr-api/dev.d.ts +41 -0
  19. package/out/sbvr-api/dev.js +3 -0
  20. package/out/sbvr-api/dev.js.map +1 -0
  21. package/out/sbvr-api/hooks.d.ts +26 -26
  22. package/out/sbvr-api/hooks.js.map +1 -1
  23. package/out/sbvr-api/permissions.d.ts +26 -2
  24. package/out/sbvr-api/permissions.js +39 -40
  25. package/out/sbvr-api/permissions.js.map +1 -1
  26. package/out/sbvr-api/sbvr-utils.d.ts +46 -6
  27. package/out/sbvr-api/sbvr-utils.js +44 -44
  28. package/out/sbvr-api/sbvr-utils.js.map +1 -1
  29. package/out/sbvr-api/user.d.ts +467 -0
  30. package/out/sbvr-api/user.js +3 -0
  31. package/out/sbvr-api/user.js.map +1 -0
  32. package/out/server-glue/module.d.ts +0 -1
  33. package/out/server-glue/module.js +1 -4
  34. package/out/server-glue/module.js.map +1 -1
  35. package/package.json +18 -19
  36. package/src/config-loader/env.ts +1 -6
  37. package/src/data-server/sbvr-server.js +3 -2
  38. package/src/database-layer/db.ts +0 -25
  39. package/src/migrator/migrations.ts +120 -0
  40. package/src/migrator/sync.ts +46 -41
  41. package/src/sbvr-api/dev.ts +44 -0
  42. package/src/sbvr-api/hooks.ts +21 -18
  43. package/src/sbvr-api/permissions.ts +50 -44
  44. package/src/sbvr-api/sbvr-utils.ts +90 -53
  45. package/src/sbvr-api/user.ts +421 -0
  46. package/src/server-glue/module.ts +0 -3
  47. package/out/tasks/common.d.ts +0 -4
  48. package/out/tasks/common.js +0 -13
  49. package/out/tasks/common.js.map +0 -1
  50. package/out/tasks/index.d.ts +0 -8
  51. package/out/tasks/index.js +0 -142
  52. package/out/tasks/index.js.map +0 -1
  53. package/out/tasks/tasks.sbvr +0 -60
  54. package/out/tasks/types.d.ts +0 -38
  55. package/out/tasks/types.js +0 -10
  56. package/out/tasks/types.js.map +0 -1
  57. package/out/tasks/worker.d.ts +0 -16
  58. package/out/tasks/worker.js +0 -228
  59. package/out/tasks/worker.js.map +0 -1
  60. package/src/tasks/common.ts +0 -14
  61. package/src/tasks/index.ts +0 -158
  62. package/src/tasks/tasks.sbvr +0 -60
  63. package/src/tasks/types.ts +0 -58
  64. package/src/tasks/worker.ts +0 -281
@@ -2,6 +2,7 @@ import type * as Express from 'express';
2
2
  import type * as Db from '../database-layer/db';
3
3
  import type { Model } from '../config-loader/config-loader';
4
4
  import type { AnyObject, RequiredField } from './common-types';
5
+ import type { Resource } from '@balena/abstract-sql-to-typescript';
5
6
 
6
7
  // Augment the Express typings
7
8
  declare global {
@@ -32,6 +33,7 @@ import {
32
33
  } from '@balena/odata-to-abstract-sql';
33
34
  import sbvrTypes from '@balena/sbvr-types';
34
35
  import deepFreeze = require('deep-freeze');
36
+ import type { AnyResource, Params } from 'pinejs-client-core';
35
37
  import { PinejsClientCore, type PromiseResultTypes } from 'pinejs-client-core';
36
38
 
37
39
  import { ExtendedSBVRParser } from '../extended-sbvr-parser/extended-sbvr-parser';
@@ -40,9 +42,9 @@ import * as asyncMigrator from '../migrator/async';
40
42
  import * as syncMigrator from '../migrator/sync';
41
43
  import { generateODataMetadata } from '../odata-metadata/odata-metadata-generator';
42
44
 
45
+ import type DevModel from './dev';
43
46
  // eslint-disable-next-line @typescript-eslint/no-var-requires
44
47
  const devModel = require('./dev.sbvr');
45
- import * as tasks from '../tasks';
46
48
  import * as permissions from './permissions';
47
49
  import {
48
50
  BadRequestError,
@@ -78,7 +80,6 @@ export {
78
80
  addPureHook,
79
81
  addSideEffectHook,
80
82
  } from './hooks';
81
- export { addTaskHandler } from '../tasks';
82
83
 
83
84
  import memoizeWeak = require('memoizee/weak');
84
85
  import * as controlFlow from './control-flow';
@@ -712,7 +713,7 @@ export const executeModels = async (
712
713
  },
713
714
  });
714
715
  }
715
- const result = (await api.dev.get({
716
+ const result = await api.dev.get({
716
717
  resource: 'model',
717
718
  passthrough: {
718
719
  tx,
@@ -725,7 +726,7 @@ export const executeModels = async (
725
726
  model_type: modelType,
726
727
  },
727
728
  },
728
- })) as Array<{ id: number }>;
729
+ });
729
730
 
730
731
  let method: SupportedMethod = 'POST';
731
732
  let uri = '/dev/model';
@@ -775,7 +776,7 @@ export const postExecuteModels = async (tx: Db.Tx): Promise<void> => {
775
776
  // Hence, skipped migrations from earlier models are not set as executed as the `migration` table is missing
776
777
  // Here the skipped migrations that haven't been set properly are covered
777
778
  // This is mostly an edge case when running on an empty database schema and migrations model hasn't been executed, yet.
778
- // One specific case are tests to run tests against migrated and unmigrated database states
779
+ // One specifc case are tests to run tests against migrated and unmigrated database states
779
780
 
780
781
  for (const modelKey of Object.keys(models)) {
781
782
  const pendingToSetExecutedMigrations =
@@ -785,9 +786,6 @@ export const postExecuteModels = async (tx: Db.Tx): Promise<void> => {
785
786
  await setExecutedMigrations(tx, modelKey, pendingToSetExecutedMigrations);
786
787
  }
787
788
  }
788
-
789
- // Initialize task worker and create required hooks
790
- await tasks.setup(db);
791
789
  };
792
790
 
793
791
  const cleanupModel = (vocab: string) => {
@@ -1007,7 +1005,16 @@ export type Passthrough = AnyObject & {
1007
1005
  tx?: Db.Tx;
1008
1006
  };
1009
1007
 
1010
- export class PinejsClient extends PinejsClientCore {
1008
+ export class PinejsClient<
1009
+ M extends {
1010
+ [key in keyof M]: Resource;
1011
+ } = {
1012
+ [key in string]: {
1013
+ Read: AnyObject;
1014
+ Write: AnyObject;
1015
+ };
1016
+ },
1017
+ > extends PinejsClientCore<unknown, M> {
1011
1018
  public async _request({
1012
1019
  method,
1013
1020
  url,
@@ -1025,11 +1032,37 @@ export class PinejsClient extends PinejsClientCore {
1025
1032
  }) {
1026
1033
  return (await runURI(method, url, body, tx, req, custom)) as object;
1027
1034
  }
1035
+
1036
+ public post<TResource extends keyof M & string>(
1037
+ params: {
1038
+ resource: TResource;
1039
+ options: Params<M[TResource]>['options'] & { returnResource: false };
1040
+ } & Params<M[TResource]>, // TODO: This should use the primary key rather than hardcoding `id`
1041
+ ): Promise<Pick<M[TResource]['Read'], 'id'>>;
1042
+ public post<TResource extends keyof M & string>(
1043
+ params: {
1044
+ resource: TResource;
1045
+ options?: Params<M[TResource]>['options'] & { returnResource?: true };
1046
+ } & Params<M[TResource]>,
1047
+ ): Promise<M[TResource]['Read']>;
1048
+ /**
1049
+ * @deprecated POSTing via `url` is deprecated
1050
+ */
1051
+ public post<T extends Resource = AnyResource>(
1052
+ params: {
1053
+ resource?: undefined;
1054
+ url: NonNullable<Params<T>['url']>;
1055
+ } & Params<T>,
1056
+ ): Promise<T>;
1057
+ public post(params: Params<AnyResource>): Promise<AnyObject> {
1058
+ return super.post(params as Parameters<PinejsClient['post']>[0]);
1059
+ }
1028
1060
  }
1029
1061
 
1030
- export const api: {
1062
+ export interface API {
1031
1063
  [vocab: string]: PinejsClient;
1032
- } = {};
1064
+ }
1065
+ export const api = {} as API;
1033
1066
  export const logger: {
1034
1067
  [vocab: string]: Console;
1035
1068
  } = {};
@@ -1136,8 +1169,8 @@ const getIdField = (
1136
1169
  // TODO: Should resolveSynonym also be using the finalAbstractSqlModel?
1137
1170
  getFinalAbstractSqlModel(request).tables[resolveSynonym(request)].idField;
1138
1171
 
1139
- export const getAffectedIds = async (
1140
- args: HookArgs & {
1172
+ export const getAffectedIds = async <Vocab extends string>(
1173
+ args: HookArgs<Vocab> & {
1141
1174
  tx: Db.Tx;
1142
1175
  },
1143
1176
  ): Promise<number[]> => {
@@ -1159,11 +1192,11 @@ export const getAffectedIds = async (
1159
1192
  return request.affectedIds;
1160
1193
  };
1161
1194
 
1162
- const $getAffectedIds = async ({
1195
+ const $getAffectedIds = async <Vocab extends string>({
1163
1196
  req,
1164
1197
  request,
1165
1198
  tx,
1166
- }: HookArgs & {
1199
+ }: HookArgs<Vocab> & {
1167
1200
  tx: Db.Tx;
1168
1201
  }): Promise<number[]> => {
1169
1202
  if (!['PATCH', 'DELETE'].includes(request.method)) {
@@ -1947,47 +1980,51 @@ const runDelete = async (
1947
1980
  return undefined;
1948
1981
  };
1949
1982
 
1983
+ export interface API {
1984
+ [devModelConfig.apiRoot]: PinejsClient<DevModel>;
1985
+ }
1986
+ const devModelConfig = {
1987
+ apiRoot: 'dev',
1988
+ modelText: devModel,
1989
+ logging: {
1990
+ log: false,
1991
+ },
1992
+ migrations: {
1993
+ '11.0.0-modified-at': `
1994
+ ALTER TABLE "model"
1995
+ ADD COLUMN IF NOT EXISTS "modified at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
1996
+ `,
1997
+ '15.0.0-data-types': async ($tx, sbvrUtils) => {
1998
+ switch (sbvrUtils.db.engine) {
1999
+ case 'mysql':
2000
+ await $tx.executeSql(`\
2001
+ ALTER TABLE "model"
2002
+ MODIFY "model value" JSON NOT NULL;
2003
+
2004
+ UPDATE "model"
2005
+ SET "model value" = CAST('{"value":' || CAST("model value" AS CHAR) || '}' AS JSON)
2006
+ WHERE "model type" IN ('se', 'odataMetadata')
2007
+ AND CAST("model value" AS CHAR) LIKE '"%';`);
2008
+ break;
2009
+ case 'postgres':
2010
+ await $tx.executeSql(`\
2011
+ ALTER TABLE "model"
2012
+ ALTER COLUMN "model value" SET DATA TYPE JSONB USING "model value"::JSONB;
2013
+
2014
+ UPDATE "model"
2015
+ SET "model value" = CAST('{"value":' || CAST("model value" AS TEXT) || '}' AS JSON)
2016
+ WHERE "model type" IN ('se', 'odataMetadata')
2017
+ AND CAST("model value" AS TEXT) LIKE '"%';`);
2018
+ break;
2019
+ // No need to migrate for websql
2020
+ }
2021
+ },
2022
+ },
2023
+ } as const satisfies ExecutableModel;
1950
2024
  export const executeStandardModels = async (tx: Db.Tx): Promise<void> => {
1951
2025
  try {
1952
2026
  // dev model must run first
1953
- await executeModel(tx, {
1954
- apiRoot: 'dev',
1955
- modelText: devModel,
1956
- logging: {
1957
- log: false,
1958
- },
1959
- migrations: {
1960
- '11.0.0-modified-at': `
1961
- ALTER TABLE "model"
1962
- ADD COLUMN IF NOT EXISTS "modified at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL;
1963
- `,
1964
- '15.0.0-data-types': async ($tx, sbvrUtils) => {
1965
- switch (sbvrUtils.db.engine) {
1966
- case 'mysql':
1967
- await $tx.executeSql(`\
1968
- ALTER TABLE "model"
1969
- MODIFY "model value" JSON NOT NULL;
1970
-
1971
- UPDATE "model"
1972
- SET "model value" = CAST('{"value":' || CAST("model value" AS CHAR) || '}' AS JSON)
1973
- WHERE "model type" IN ('se', 'odataMetadata')
1974
- AND CAST("model value" AS CHAR) LIKE '"%';`);
1975
- break;
1976
- case 'postgres':
1977
- await $tx.executeSql(`\
1978
- ALTER TABLE "model"
1979
- ALTER COLUMN "model value" SET DATA TYPE JSONB USING "model value"::JSONB;
1980
-
1981
- UPDATE "model"
1982
- SET "model value" = CAST('{"value":' || CAST("model value" AS TEXT) || '}' AS JSON)
1983
- WHERE "model type" IN ('se', 'odataMetadata')
1984
- AND CAST("model value" AS TEXT) LIKE '"%';`);
1985
- break;
1986
- // No need to migrate for websql
1987
- }
1988
- },
1989
- },
1990
- });
2027
+ await executeModel(tx, devModelConfig);
1991
2028
  await executeModels(tx, permissions.config.models);
1992
2029
  console.info('Successfully executed standard models.');
1993
2030
  } catch (err: any) {
@@ -0,0 +1,421 @@
1
+ import type { Types } from '@balena/abstract-sql-to-typescript';
2
+
3
+ export interface Permission {
4
+ Read: {
5
+ created_at: Types['Date Time']['Read'];
6
+ modified_at: Types['Date Time']['Read'];
7
+ id: Types['Serial']['Read'];
8
+ name: Types['Text']['Read'];
9
+ is_of__role?: Array<RoleHasPermission['Read']>;
10
+ is_of__user?: Array<UserHasPermission['Read']>;
11
+ is_of__api_key?: Array<ApiKeyHasPermission['Read']>;
12
+ user__has__permission?: Array<UserHasPermission['Read']>;
13
+ user_permission?: Array<UserHasPermission['Read']>;
14
+ };
15
+ Write: {
16
+ created_at: Types['Date Time']['Write'];
17
+ modified_at: Types['Date Time']['Write'];
18
+ id: Types['Serial']['Write'];
19
+ name: Types['Text']['Write'];
20
+ };
21
+ }
22
+
23
+ export interface Role {
24
+ Read: {
25
+ created_at: Types['Date Time']['Read'];
26
+ modified_at: Types['Date Time']['Read'];
27
+ id: Types['Serial']['Read'];
28
+ name: Types['Text']['Read'];
29
+ role__has__permission?: Array<RoleHasPermission['Read']>;
30
+ user__has__role?: Array<UserHasRole['Read']>;
31
+ user_role?: Array<UserHasRole['Read']>;
32
+ is_of__user?: Array<UserHasRole['Read']>;
33
+ is_of__api_key?: Array<ApiKeyHasRole['Read']>;
34
+ };
35
+ Write: {
36
+ created_at: Types['Date Time']['Write'];
37
+ modified_at: Types['Date Time']['Write'];
38
+ id: Types['Serial']['Write'];
39
+ name: Types['Text']['Write'];
40
+ };
41
+ }
42
+
43
+ export interface RoleHasPermission {
44
+ Read: {
45
+ created_at: Types['Date Time']['Read'];
46
+ modified_at: Types['Date Time']['Read'];
47
+ role: { __id: Role['Read']['id'] } | [Role['Read']];
48
+ permission: { __id: Permission['Read']['id'] } | [Permission['Read']];
49
+ id: Types['Serial']['Read'];
50
+ is_of__role: { __id: Role['Read']['id'] } | [Role['Read']];
51
+ };
52
+ Write: {
53
+ created_at: Types['Date Time']['Write'];
54
+ modified_at: Types['Date Time']['Write'];
55
+ role: Role['Write']['id'];
56
+ permission: Permission['Write']['id'];
57
+ id: Types['Serial']['Write'];
58
+ };
59
+ }
60
+
61
+ export interface Actor {
62
+ Read: {
63
+ created_at: Types['Date Time']['Read'];
64
+ modified_at: Types['Date Time']['Read'];
65
+ id: Types['Serial']['Read'];
66
+ is_of__user?: Array<User['Read']>;
67
+ api_key?: Array<ApiKey['Read']>;
68
+ };
69
+ Write: {
70
+ created_at: Types['Date Time']['Write'];
71
+ modified_at: Types['Date Time']['Write'];
72
+ id: Types['Serial']['Write'];
73
+ };
74
+ }
75
+
76
+ export interface User {
77
+ Read: {
78
+ created_at: Types['Date Time']['Read'];
79
+ modified_at: Types['Date Time']['Read'];
80
+ id: Types['Serial']['Read'];
81
+ actor: { __id: Actor['Read']['id'] } | [Actor['Read']];
82
+ username: Types['Short Text']['Read'];
83
+ password: Types['Hashed']['Read'];
84
+ user__has__role?: Array<UserHasRole['Read']>;
85
+ user_role?: Array<UserHasRole['Read']>;
86
+ user__has__permission?: Array<UserHasPermission['Read']>;
87
+ user_permission?: Array<UserHasPermission['Read']>;
88
+ };
89
+ Write: {
90
+ created_at: Types['Date Time']['Write'];
91
+ modified_at: Types['Date Time']['Write'];
92
+ id: Types['Serial']['Write'];
93
+ actor: Actor['Write']['id'];
94
+ username: Types['Short Text']['Write'];
95
+ password: Types['Hashed']['Write'];
96
+ };
97
+ }
98
+
99
+ export interface UserHasRole {
100
+ Read: {
101
+ created_at: Types['Date Time']['Read'];
102
+ modified_at: Types['Date Time']['Read'];
103
+ user: { __id: User['Read']['id'] } | [User['Read']];
104
+ role: { __id: Role['Read']['id'] } | [Role['Read']];
105
+ id: Types['Serial']['Read'];
106
+ expiry_date: Types['Date Time']['Read'] | null;
107
+ is_of__user: { __id: User['Read']['id'] } | [User['Read']];
108
+ };
109
+ Write: {
110
+ created_at: Types['Date Time']['Write'];
111
+ modified_at: Types['Date Time']['Write'];
112
+ user: User['Write']['id'];
113
+ role: Role['Write']['id'];
114
+ id: Types['Serial']['Write'];
115
+ expiry_date: Types['Date Time']['Write'] | null;
116
+ };
117
+ }
118
+
119
+ export interface UserHasPermission {
120
+ Read: {
121
+ created_at: Types['Date Time']['Read'];
122
+ modified_at: Types['Date Time']['Read'];
123
+ user: { __id: User['Read']['id'] } | [User['Read']];
124
+ permission: { __id: Permission['Read']['id'] } | [Permission['Read']];
125
+ id: Types['Serial']['Read'];
126
+ expiry_date: Types['Date Time']['Read'] | null;
127
+ is_of__user: { __id: User['Read']['id'] } | [User['Read']];
128
+ };
129
+ Write: {
130
+ created_at: Types['Date Time']['Write'];
131
+ modified_at: Types['Date Time']['Write'];
132
+ user: User['Write']['id'];
133
+ permission: Permission['Write']['id'];
134
+ id: Types['Serial']['Write'];
135
+ expiry_date: Types['Date Time']['Write'] | null;
136
+ };
137
+ }
138
+
139
+ export interface ApiKey {
140
+ Read: {
141
+ created_at: Types['Date Time']['Read'];
142
+ modified_at: Types['Date Time']['Read'];
143
+ id: Types['Serial']['Read'];
144
+ key: Types['Short Text']['Read'];
145
+ expiry_date: Types['Date Time']['Read'] | null;
146
+ is_of__actor: { __id: Actor['Read']['id'] } | [Actor['Read']];
147
+ name: Types['Text']['Read'] | null;
148
+ description: Types['Text']['Read'] | null;
149
+ api_key__has__role?: Array<ApiKeyHasRole['Read']>;
150
+ api_key__has__permission?: Array<ApiKeyHasPermission['Read']>;
151
+ };
152
+ Write: {
153
+ created_at: Types['Date Time']['Write'];
154
+ modified_at: Types['Date Time']['Write'];
155
+ id: Types['Serial']['Write'];
156
+ key: Types['Short Text']['Write'];
157
+ expiry_date: Types['Date Time']['Write'] | null;
158
+ is_of__actor: Actor['Write']['id'];
159
+ name: Types['Text']['Write'] | null;
160
+ description: Types['Text']['Write'] | null;
161
+ };
162
+ }
163
+
164
+ export interface ApiKeyHasRole {
165
+ Read: {
166
+ created_at: Types['Date Time']['Read'];
167
+ modified_at: Types['Date Time']['Read'];
168
+ api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
169
+ role: { __id: Role['Read']['id'] } | [Role['Read']];
170
+ id: Types['Serial']['Read'];
171
+ is_of__api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
172
+ };
173
+ Write: {
174
+ created_at: Types['Date Time']['Write'];
175
+ modified_at: Types['Date Time']['Write'];
176
+ api_key: ApiKey['Write']['id'];
177
+ role: Role['Write']['id'];
178
+ id: Types['Serial']['Write'];
179
+ };
180
+ }
181
+
182
+ export interface ApiKeyHasPermission {
183
+ Read: {
184
+ created_at: Types['Date Time']['Read'];
185
+ modified_at: Types['Date Time']['Read'];
186
+ api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
187
+ permission: { __id: Permission['Read']['id'] } | [Permission['Read']];
188
+ id: Types['Serial']['Read'];
189
+ is_of__api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
190
+ };
191
+ Write: {
192
+ created_at: Types['Date Time']['Write'];
193
+ modified_at: Types['Date Time']['Write'];
194
+ api_key: ApiKey['Write']['id'];
195
+ permission: Permission['Write']['id'];
196
+ id: Types['Serial']['Write'];
197
+ };
198
+ }
199
+
200
+ export interface Permission {
201
+ Read: {
202
+ created_at: Types['Date Time']['Read'];
203
+ modified_at: Types['Date Time']['Read'];
204
+ id: Types['Serial']['Read'];
205
+ name: Types['Text']['Read'];
206
+ is_of__role?: Array<RoleHasPermission['Read']>;
207
+ is_of__user?: Array<UserHasPermission['Read']>;
208
+ is_of__api_key?: Array<ApiKeyHasPermission['Read']>;
209
+ user__has__permission?: Array<UserHasPermission['Read']>;
210
+ user_permission?: Array<UserHasPermission['Read']>;
211
+ };
212
+ Write: {
213
+ created_at: Types['Date Time']['Write'];
214
+ modified_at: Types['Date Time']['Write'];
215
+ id: Types['Serial']['Write'];
216
+ name: Types['Text']['Write'];
217
+ };
218
+ }
219
+
220
+ export interface Role {
221
+ Read: {
222
+ created_at: Types['Date Time']['Read'];
223
+ modified_at: Types['Date Time']['Read'];
224
+ id: Types['Serial']['Read'];
225
+ name: Types['Text']['Read'];
226
+ role__has__permission?: Array<RoleHasPermission['Read']>;
227
+ user__has__role?: Array<UserHasRole['Read']>;
228
+ user_role?: Array<UserHasRole['Read']>;
229
+ is_of__user?: Array<UserHasRole['Read']>;
230
+ is_of__api_key?: Array<ApiKeyHasRole['Read']>;
231
+ };
232
+ Write: {
233
+ created_at: Types['Date Time']['Write'];
234
+ modified_at: Types['Date Time']['Write'];
235
+ id: Types['Serial']['Write'];
236
+ name: Types['Text']['Write'];
237
+ };
238
+ }
239
+
240
+ export interface RoleHasPermission {
241
+ Read: {
242
+ created_at: Types['Date Time']['Read'];
243
+ modified_at: Types['Date Time']['Read'];
244
+ role: { __id: Role['Read']['id'] } | [Role['Read']];
245
+ permission: { __id: Permission['Read']['id'] } | [Permission['Read']];
246
+ id: Types['Serial']['Read'];
247
+ is_of__role: { __id: Role['Read']['id'] } | [Role['Read']];
248
+ };
249
+ Write: {
250
+ created_at: Types['Date Time']['Write'];
251
+ modified_at: Types['Date Time']['Write'];
252
+ role: Role['Write']['id'];
253
+ permission: Permission['Write']['id'];
254
+ id: Types['Serial']['Write'];
255
+ };
256
+ }
257
+
258
+ export interface Actor {
259
+ Read: {
260
+ created_at: Types['Date Time']['Read'];
261
+ modified_at: Types['Date Time']['Read'];
262
+ id: Types['Serial']['Read'];
263
+ is_of__user?: Array<User['Read']>;
264
+ api_key?: Array<ApiKey['Read']>;
265
+ };
266
+ Write: {
267
+ created_at: Types['Date Time']['Write'];
268
+ modified_at: Types['Date Time']['Write'];
269
+ id: Types['Serial']['Write'];
270
+ };
271
+ }
272
+
273
+ export interface User {
274
+ Read: {
275
+ created_at: Types['Date Time']['Read'];
276
+ modified_at: Types['Date Time']['Read'];
277
+ id: Types['Serial']['Read'];
278
+ actor: { __id: Actor['Read']['id'] } | [Actor['Read']];
279
+ username: Types['Short Text']['Read'];
280
+ password: Types['Hashed']['Read'];
281
+ user__has__role?: Array<UserHasRole['Read']>;
282
+ user_role?: Array<UserHasRole['Read']>;
283
+ user__has__permission?: Array<UserHasPermission['Read']>;
284
+ user_permission?: Array<UserHasPermission['Read']>;
285
+ };
286
+ Write: {
287
+ created_at: Types['Date Time']['Write'];
288
+ modified_at: Types['Date Time']['Write'];
289
+ id: Types['Serial']['Write'];
290
+ actor: Actor['Write']['id'];
291
+ username: Types['Short Text']['Write'];
292
+ password: Types['Hashed']['Write'];
293
+ };
294
+ }
295
+
296
+ export interface UserHasRole {
297
+ Read: {
298
+ created_at: Types['Date Time']['Read'];
299
+ modified_at: Types['Date Time']['Read'];
300
+ user: { __id: User['Read']['id'] } | [User['Read']];
301
+ role: { __id: Role['Read']['id'] } | [Role['Read']];
302
+ id: Types['Serial']['Read'];
303
+ expiry_date: Types['Date Time']['Read'] | null;
304
+ is_of__user: { __id: User['Read']['id'] } | [User['Read']];
305
+ };
306
+ Write: {
307
+ created_at: Types['Date Time']['Write'];
308
+ modified_at: Types['Date Time']['Write'];
309
+ user: User['Write']['id'];
310
+ role: Role['Write']['id'];
311
+ id: Types['Serial']['Write'];
312
+ expiry_date: Types['Date Time']['Write'] | null;
313
+ };
314
+ }
315
+
316
+ export interface UserHasPermission {
317
+ Read: {
318
+ created_at: Types['Date Time']['Read'];
319
+ modified_at: Types['Date Time']['Read'];
320
+ user: { __id: User['Read']['id'] } | [User['Read']];
321
+ permission: { __id: Permission['Read']['id'] } | [Permission['Read']];
322
+ id: Types['Serial']['Read'];
323
+ expiry_date: Types['Date Time']['Read'] | null;
324
+ is_of__user: { __id: User['Read']['id'] } | [User['Read']];
325
+ };
326
+ Write: {
327
+ created_at: Types['Date Time']['Write'];
328
+ modified_at: Types['Date Time']['Write'];
329
+ user: User['Write']['id'];
330
+ permission: Permission['Write']['id'];
331
+ id: Types['Serial']['Write'];
332
+ expiry_date: Types['Date Time']['Write'] | null;
333
+ };
334
+ }
335
+
336
+ export interface ApiKey {
337
+ Read: {
338
+ created_at: Types['Date Time']['Read'];
339
+ modified_at: Types['Date Time']['Read'];
340
+ id: Types['Serial']['Read'];
341
+ key: Types['Short Text']['Read'];
342
+ expiry_date: Types['Date Time']['Read'] | null;
343
+ is_of__actor: { __id: Actor['Read']['id'] } | [Actor['Read']];
344
+ name: Types['Text']['Read'] | null;
345
+ description: Types['Text']['Read'] | null;
346
+ api_key__has__role?: Array<ApiKeyHasRole['Read']>;
347
+ api_key__has__permission?: Array<ApiKeyHasPermission['Read']>;
348
+ };
349
+ Write: {
350
+ created_at: Types['Date Time']['Write'];
351
+ modified_at: Types['Date Time']['Write'];
352
+ id: Types['Serial']['Write'];
353
+ key: Types['Short Text']['Write'];
354
+ expiry_date: Types['Date Time']['Write'] | null;
355
+ is_of__actor: Actor['Write']['id'];
356
+ name: Types['Text']['Write'] | null;
357
+ description: Types['Text']['Write'] | null;
358
+ };
359
+ }
360
+
361
+ export interface ApiKeyHasRole {
362
+ Read: {
363
+ created_at: Types['Date Time']['Read'];
364
+ modified_at: Types['Date Time']['Read'];
365
+ api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
366
+ role: { __id: Role['Read']['id'] } | [Role['Read']];
367
+ id: Types['Serial']['Read'];
368
+ is_of__api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
369
+ };
370
+ Write: {
371
+ created_at: Types['Date Time']['Write'];
372
+ modified_at: Types['Date Time']['Write'];
373
+ api_key: ApiKey['Write']['id'];
374
+ role: Role['Write']['id'];
375
+ id: Types['Serial']['Write'];
376
+ };
377
+ }
378
+
379
+ export interface ApiKeyHasPermission {
380
+ Read: {
381
+ created_at: Types['Date Time']['Read'];
382
+ modified_at: Types['Date Time']['Read'];
383
+ api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
384
+ permission: { __id: Permission['Read']['id'] } | [Permission['Read']];
385
+ id: Types['Serial']['Read'];
386
+ is_of__api_key: { __id: ApiKey['Read']['id'] } | [ApiKey['Read']];
387
+ };
388
+ Write: {
389
+ created_at: Types['Date Time']['Write'];
390
+ modified_at: Types['Date Time']['Write'];
391
+ api_key: ApiKey['Write']['id'];
392
+ permission: Permission['Write']['id'];
393
+ id: Types['Serial']['Write'];
394
+ };
395
+ }
396
+
397
+ export default interface $Model {
398
+ permission: Permission;
399
+ role: Role;
400
+ role__has__permission: RoleHasPermission;
401
+ actor: Actor;
402
+ user: User;
403
+ user__has__role: UserHasRole;
404
+ user__has__permission: UserHasPermission;
405
+ api_key: ApiKey;
406
+ api_key__has__role: ApiKeyHasRole;
407
+ api_key__has__permission: ApiKeyHasPermission;
408
+ permission$sbvr__compiler: Permission;
409
+ role$sbvr__compiler: Role;
410
+ role__has__permission$sbvr__compiler: RoleHasPermission;
411
+ actor$sbvr__compiler: Actor;
412
+ user$sbvr__compiler: User;
413
+ user__has__role$sbvr__compiler: UserHasRole;
414
+ user__has__permission$sbvr__compiler: UserHasPermission;
415
+ api_key$sbvr__compiler: ApiKey;
416
+ api_key__has__role$sbvr__compiler: ApiKeyHasRole;
417
+ api_key__has__permission$sbvr__compiler: ApiKeyHasPermission;
418
+ // Synonyms
419
+ user_role: UserHasRole;
420
+ user_permission: UserHasPermission;
421
+ }
@@ -6,7 +6,6 @@ import * as dbModule from '../database-layer/db';
6
6
  import * as configLoader from '../config-loader/config-loader';
7
7
  import * as migrator from '../migrator/sync';
8
8
  import type * as migratorUtils from '../migrator/utils';
9
- import * as tasks from '../tasks';
10
9
 
11
10
  import * as sbvrUtils from '../sbvr-api/sbvr-utils';
12
11
  import { PINEJS_ADVISORY_LOCK } from '../config-loader/env';
@@ -20,7 +19,6 @@ export * as errors from '../sbvr-api/errors';
20
19
  export * as env from '../config-loader/env';
21
20
  export * as types from '../sbvr-api/common-types';
22
21
  export * as hooks from '../sbvr-api/hooks';
23
- export * as tasks from '../tasks';
24
22
  export * as webResourceHandler from '../webresource-handler';
25
23
  export type { configLoader as ConfigLoader };
26
24
  export type { migratorUtils as Migrator };
@@ -65,7 +63,6 @@ export const init = async <T extends string>(
65
63
  await sbvrUtils.setup(app, db);
66
64
  const cfgLoader = await configLoader.setup(app);
67
65
  await cfgLoader.loadConfig(migrator.config);
68
- await cfgLoader.loadConfig(tasks.config);
69
66
 
70
67
  const promises: Array<Promise<void>> = [];
71
68
  if (process.env.SBVR_SERVER_ENABLED) {
@@ -1,4 +0,0 @@
1
- import Ajv from 'ajv';
2
- export declare const apiRoot = "tasks";
3
- export declare const channel = "pinejs$task_insert";
4
- export declare const ajv: Ajv;