@balena/pinejs 17.1.0-build-joshbwlng-tasks-e8a81b1d884e0039e67661a25a5cb81d46966640-1 → 17.1.0-build-model-based-typings-86a981c89f828217571c93fa010174529a5345f9-1

Sign up to get free protection for your applications and to get access to all the features.
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]>,
1041
+ ): Promise<Pick<M[TResource]['Read'], 'id'>>; // TODO: This should use the primary key rather than hardcoding `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;