@betterportal/config-manager 10.6.7 → 10.6.9

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 (48) hide show
  1. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts +27 -8
  2. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts.map +1 -1
  3. package/lib/.bsb/clients/service-betterportal-config-manager.js +19 -6
  4. package/lib/.bsb/clients/service-betterportal-config-manager.js.map +1 -1
  5. package/lib/bp-contracts/org.betterportal.config-manager.json +1 -1
  6. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts +3 -3
  7. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts +3 -0
  8. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts.map +1 -1
  9. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js +85 -30
  10. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js.map +1 -1
  11. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/GET.d.ts +1 -1
  12. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_renderer.bootstrap5/GET.d.ts.map +1 -1
  13. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_renderer.bootstrap5/GET.js +11 -5
  14. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_renderer.bootstrap5/GET.js.map +1 -1
  15. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts +3 -1
  16. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts.map +1 -1
  17. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js +17 -9
  18. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js.map +1 -1
  19. package/lib/plugins/service-betterportal-config-manager/index.d.ts +25 -7
  20. package/lib/plugins/service-betterportal-config-manager/index.d.ts.map +1 -1
  21. package/lib/plugins/service-betterportal-config-manager/index.js +98 -25
  22. package/lib/plugins/service-betterportal-config-manager/index.js.map +1 -1
  23. package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts +3 -0
  24. package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts.map +1 -1
  25. package/lib/plugins/service-betterportal-config-manager/setupTokens.js +93 -16
  26. package/lib/plugins/service-betterportal-config-manager/setupTokens.js.map +1 -1
  27. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts +1 -0
  28. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts.map +1 -1
  29. package/lib/plugins/service-betterportal-config-manager/storage/core.js.map +1 -1
  30. package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts +5 -0
  31. package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts.map +1 -1
  32. package/lib/plugins/service-betterportal-config-manager/storage/index.js +5 -2
  33. package/lib/plugins/service-betterportal-config-manager/storage/index.js.map +1 -1
  34. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts +95 -1
  35. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts.map +1 -1
  36. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js +358 -25
  37. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js.map +1 -1
  38. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts +2 -0
  39. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts.map +1 -1
  40. package/lib/plugins/service-betterportal-config-manager/syncApi.js +19 -0
  41. package/lib/plugins/service-betterportal-config-manager/syncApi.js.map +1 -1
  42. package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts +3 -1
  43. package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts.map +1 -1
  44. package/lib/plugins/service-betterportal-config-manager/webhooks.js +41 -44
  45. package/lib/plugins/service-betterportal-config-manager/webhooks.js.map +1 -1
  46. package/lib/schemas/service-betterportal-config-manager.json +32 -15
  47. package/lib/schemas/service-betterportal-config-manager.plugin.json +9 -2
  48. package/package.json +3 -3
@@ -1,61 +1,394 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { randomUUID } from "node:crypto";
1
4
  import { Pool } from "pg";
5
+ import * as yaml from "yaml";
2
6
  import { BetterPortalConfigSchema } from "@betterportal/framework";
3
7
  import { BaseStorage, migrateOfficialPluginIds, migrateRouteOperations, migrateRouteParamSyntax } from "./core.js";
4
8
  function quotePgIdent(identifier) {
5
- if (!/^[a-z_][a-z0-9_]*$/i.test(identifier)) {
9
+ if (!/^[a-z_][a-z0-9_]*$/i.test(identifier))
6
10
  throw new Error(`Invalid PostgreSQL identifier: ${identifier}`);
7
- }
8
11
  return `"${identifier.replace(/"/g, "\"\"")}"`;
9
12
  }
13
+ export class ConfigRevisionConflictError extends Error {
14
+ constructor(expected, actual) {
15
+ super(`Platform config changed concurrently (loaded revision ${expected}, current revision ${actual})`);
16
+ this.name = "ConfigRevisionConflictError";
17
+ }
18
+ }
19
+ const SCHEMA_VERSION = 1;
10
20
  export class PostgresStorage extends BaseStorage {
21
+ backend = "postgres";
11
22
  connectionString;
12
23
  tableName;
24
+ quotedTableName;
13
25
  rowId;
26
+ migrationsTable;
27
+ identityTable;
28
+ actionsTable;
29
+ deliveriesTable;
30
+ outboxTable;
14
31
  pool = null;
32
+ schemaReady = null;
33
+ legacyPaths = {};
34
+ snapshots = new WeakMap();
15
35
  constructor(options) {
16
36
  super();
17
37
  this.connectionString = options.connectionString;
18
- this.tableName = quotePgIdent(options.tableName ?? "bp_platform_config");
38
+ this.tableName = options.tableName ?? "bp_platform_config";
39
+ this.quotedTableName = quotePgIdent(this.tableName);
19
40
  this.rowId = options.rowId ?? "default";
41
+ this.migrationsTable = quotePgIdent(`${this.tableName}_migrations`);
42
+ this.identityTable = quotePgIdent(`${this.tableName}_identity`);
43
+ this.actionsTable = quotePgIdent(`${this.tableName}_actions`);
44
+ this.deliveriesTable = quotePgIdent(`${this.tableName}_webhook_deliveries`);
45
+ this.outboxTable = quotePgIdent(`${this.tableName}_outbox`);
46
+ }
47
+ async initialize(paths = {}) {
48
+ this.legacyPaths = paths;
49
+ await this.ensureSchema();
20
50
  }
21
51
  async loadConfig() {
22
52
  await this.ensureSchema();
23
- const pool = await this.getPool();
24
- const result = await pool.query(`select config from ${this.tableName} where id = $1`, [this.rowId]);
25
- if (result.rows.length === 0) {
26
- const empty = this.canonicalizeConfig(BetterPortalConfigSchema.parse({}));
27
- await this.saveConfig(empty);
28
- return empty;
29
- }
30
- return this.canonicalizeConfig(migrateRouteParamSyntax(BetterPortalConfigSchema.parse(migrateRouteOperations(migrateOfficialPluginIds(result.rows[0].config)))));
53
+ const result = await this.getPool().query(`select config, revision from ${this.quotedTableName} where id = $1`, [this.rowId]);
54
+ if (!result.rows[0])
55
+ throw new Error(`Platform config row ${this.rowId} was not initialized`);
56
+ const config = this.parseConfig(result.rows[0].config);
57
+ this.snapshots.set(config, Number(result.rows[0].revision));
58
+ return config;
31
59
  }
32
60
  async saveConfig(config, options) {
33
61
  await this.ensureSchema();
34
- const validated = this.canonicalizeConfig(BetterPortalConfigSchema.parse(migrateOfficialPluginIds(config)));
62
+ const validated = this.parseConfig(config);
35
63
  this.validateConfigReferences(validated);
36
- const pool = await this.getPool();
37
- await pool.query(`insert into ${this.tableName} (id, config)
38
- values ($1, $2::jsonb)
39
- on conflict (id) do update set config = excluded.config, updated_at = now()`, [this.rowId, JSON.stringify(validated)]);
40
- if (options?.notify !== false)
41
- this.notifyListeners();
64
+ const expectedRevision = this.snapshots.get(config);
65
+ const client = await this.getPool().connect();
66
+ try {
67
+ await client.query("begin");
68
+ const current = await client.query(`select revision from ${this.quotedTableName} where id = $1 for update`, [this.rowId]);
69
+ if (!current.rows[0])
70
+ throw new Error(`Platform config row ${this.rowId} was not initialized`);
71
+ const currentRevision = Number(current.rows[0].revision);
72
+ if (expectedRevision !== undefined && expectedRevision !== currentRevision) {
73
+ throw new ConfigRevisionConflictError(expectedRevision, currentRevision);
74
+ }
75
+ const revision = currentRevision + 1;
76
+ await client.query(`update ${this.quotedTableName} set config = $2::jsonb, revision = $3, updated_at = now() where id = $1`, [this.rowId, JSON.stringify(validated), revision]);
77
+ if (options?.notify !== false)
78
+ await this.insertOutbox(client, "broadcast", "platform-config.changed", { revision });
79
+ await client.query("commit");
80
+ this.snapshots.set(config, revision);
81
+ this.snapshots.set(validated, revision);
82
+ }
83
+ catch (error) {
84
+ await client.query("rollback").catch(() => undefined);
85
+ throw error;
86
+ }
87
+ finally {
88
+ client.release();
89
+ }
90
+ }
91
+ async loadOrCreateIdentity(create) {
92
+ await this.ensureSchema();
93
+ const existing = await this.getPool().query(`select identity from ${this.identityTable} where scope_id = $1`, [this.rowId]);
94
+ if (existing.rows[0])
95
+ return existing.rows[0].identity;
96
+ const candidate = create();
97
+ await this.getPool().query(`insert into ${this.identityTable} (scope_id, identity) values ($1, $2::jsonb) on conflict (scope_id) do nothing`, [this.rowId, JSON.stringify(candidate)]);
98
+ const result = await this.getPool().query(`select identity from ${this.identityTable} where scope_id = $1`, [this.rowId]);
99
+ if (!result.rows[0])
100
+ throw new Error("Control-plane identity was not initialized");
101
+ return result.rows[0].identity;
102
+ }
103
+ async createPendingAction(input) {
104
+ await this.ensureSchema();
105
+ const result = await this.getPool().query(`insert into ${this.actionsTable} (scope_id, kind, action_key, secret_hash, payload, expires_at)
106
+ values ($1, $2, $3, $4, $5::jsonb, $6::timestamptz)
107
+ on conflict (scope_id, kind, action_key) do update
108
+ set secret_hash = excluded.secret_hash, payload = excluded.payload, expires_at = excluded.expires_at,
109
+ status = 'pending', result = null, lease_owner = null, lease_until = null, created_at = now()
110
+ where ${this.actionsTable}.expires_at <= now()`, [this.rowId, input.kind, input.key, input.secretHash, JSON.stringify(input.payload), input.expiresAt]);
111
+ return (result.rowCount ?? 0) > 0;
112
+ }
113
+ async isPendingActionAvailable(kind, key) {
114
+ await this.ensureSchema();
115
+ const result = await this.getPool().query(`select 1 from ${this.actionsTable}
116
+ where scope_id = $1 and kind = $2 and action_key = $3 and status <> 'completed' and expires_at > now()`, [this.rowId, kind, key]);
117
+ return result.rows.length > 0;
118
+ }
119
+ async claimPendingAction(input) {
120
+ await this.ensureSchema();
121
+ const client = await this.getPool().connect();
122
+ try {
123
+ await client.query("begin");
124
+ const result = await client.query(`select payload, expires_at, status, result, lease_until from ${this.actionsTable}
125
+ where scope_id = $1 and kind = $2 and action_key = $3 and secret_hash = $4 for update`, [this.rowId, input.kind, input.key, input.secretHash]);
126
+ const row = result.rows[0];
127
+ if (!row) {
128
+ await client.query("commit");
129
+ return { state: "missing" };
130
+ }
131
+ if (row.expires_at.getTime() <= Date.now()) {
132
+ await client.query(`delete from ${this.actionsTable} where scope_id = $1 and kind = $2 and action_key = $3`, [this.rowId, input.kind, input.key]);
133
+ await client.query("commit");
134
+ return { state: "expired" };
135
+ }
136
+ const action = {
137
+ kind: input.kind,
138
+ key: input.key,
139
+ payload: row.payload,
140
+ expiresAt: row.expires_at.toISOString(),
141
+ status: row.status,
142
+ ...(row.result ? { result: row.result } : {})
143
+ };
144
+ if (row.status === "completed") {
145
+ await client.query("commit");
146
+ return { state: "completed", action };
147
+ }
148
+ if (row.status === "processing" && row.lease_until && row.lease_until.getTime() > Date.now()) {
149
+ await client.query("commit");
150
+ return { state: "busy" };
151
+ }
152
+ await client.query(`update ${this.actionsTable} set status = 'processing', lease_owner = $4,
153
+ lease_until = now() + ($5::int * interval '1 millisecond')
154
+ where scope_id = $1 and kind = $2 and action_key = $3`, [this.rowId, input.kind, input.key, input.owner, input.leaseMs ?? 30_000]);
155
+ await client.query("commit");
156
+ return { state: "claimed", action: { ...action, status: "processing" } };
157
+ }
158
+ catch (error) {
159
+ await client.query("rollback").catch(() => undefined);
160
+ throw error;
161
+ }
162
+ finally {
163
+ client.release();
164
+ }
165
+ }
166
+ async completePendingAction(input) {
167
+ await this.ensureSchema();
168
+ await this.getPool().query(`update ${this.actionsTable} set status = 'completed', result = $5::jsonb,
169
+ lease_owner = null, lease_until = null
170
+ where scope_id = $1 and kind = $2 and action_key = $3 and lease_owner = $4`, [this.rowId, input.kind, input.key, input.owner, JSON.stringify(input.result)]);
171
+ }
172
+ async releasePendingAction(kind, key, owner) {
173
+ await this.ensureSchema();
174
+ await this.getPool().query(`update ${this.actionsTable} set status = 'pending', lease_owner = null, lease_until = null
175
+ where scope_id = $1 and kind = $2 and action_key = $3 and lease_owner = $4 and status = 'processing'`, [this.rowId, kind, key, owner]);
176
+ }
177
+ async enqueueWebhookDeliveries(records) {
178
+ if (records.length === 0)
179
+ return;
180
+ await this.ensureSchema();
181
+ const client = await this.getPool().connect();
182
+ try {
183
+ await client.query("begin");
184
+ for (const record of records)
185
+ await this.insertWebhookDelivery(client, record);
186
+ await this.insertOutbox(client, "event", "webhook.delivery.available", {});
187
+ await client.query("commit");
188
+ }
189
+ catch (error) {
190
+ await client.query("rollback").catch(() => undefined);
191
+ throw error;
192
+ }
193
+ finally {
194
+ client.release();
195
+ }
196
+ }
197
+ async claimWebhookDeliveries(owner, limit = 25, leaseMs = 60_000) {
198
+ await this.ensureSchema();
199
+ const result = await this.getPool().query(`with due as (
200
+ select id from ${this.deliveriesTable}
201
+ where scope_id = $1 and status = 'pending' and next_attempt_at <= now()
202
+ and (lease_until is null or lease_until <= now())
203
+ order by next_attempt_at, created_at for update skip locked limit $3
204
+ )
205
+ update ${this.deliveriesTable} d
206
+ set lease_owner = $2, lease_until = now() + ($4::int * interval '1 millisecond')
207
+ from due where d.scope_id = $1 and d.id = due.id returning d.*`, [this.rowId, owner, limit, leaseMs]);
208
+ return result.rows.map((row) => ({
209
+ id: row.id,
210
+ targetId: row.target_id,
211
+ serviceId: row.service_id,
212
+ eventId: row.event_id,
213
+ tenantId: row.tenant_id,
214
+ ...(row.app_id ? { appId: row.app_id } : {}),
215
+ payload: row.payload,
216
+ attempts: row.attempts,
217
+ maxAttempts: row.max_attempts,
218
+ nextAttemptAt: row.next_attempt_at.toISOString(),
219
+ createdAt: row.created_at.toISOString(),
220
+ status: row.status,
221
+ ...(row.last_status === null ? {} : { lastStatus: row.last_status }),
222
+ ...(row.last_error === null ? {} : { lastError: row.last_error })
223
+ }));
224
+ }
225
+ async finishWebhookDelivery(owner, record) {
226
+ await this.ensureSchema();
227
+ await this.getPool().query(`update ${this.deliveriesTable} set attempts = $4, next_attempt_at = $5::timestamptz,
228
+ status = $6, last_status = $7, last_error = $8, lease_owner = null, lease_until = null
229
+ where scope_id = $1 and id = $2 and lease_owner = $3`, [this.rowId, record.id, owner, record.attempts, record.nextAttemptAt, record.status,
230
+ record.lastStatus ?? null, record.lastError ?? null]);
231
+ }
232
+ async cleanupWebhookDeliveries() {
233
+ await this.ensureSchema();
234
+ await this.getPool().query(`delete from ${this.deliveriesTable}
235
+ where scope_id = $1 and status <> 'pending' and created_at < now() - interval '7 days'`, [this.rowId]);
236
+ }
237
+ async cleanupExpiredActions() {
238
+ await this.ensureSchema();
239
+ await this.getPool().query(`delete from ${this.actionsTable} where scope_id = $1 and expires_at <= now()`, [this.rowId]);
240
+ }
241
+ async tryRunExclusive(name, run) {
242
+ await this.ensureSchema();
243
+ const client = await this.getPool().connect();
244
+ const lockName = `${this.tableName}:${this.rowId}:${name}`;
245
+ try {
246
+ const result = await client.query("select pg_try_advisory_lock(hashtext($1)) as locked", [lockName]);
247
+ if (!result.rows[0]?.locked)
248
+ return false;
249
+ try {
250
+ await run();
251
+ return true;
252
+ }
253
+ finally {
254
+ await client.query("select pg_advisory_unlock(hashtext($1))", [lockName]);
255
+ }
256
+ }
257
+ finally {
258
+ client.release();
259
+ }
260
+ }
261
+ async claimOutbox(owner, limit = 25, leaseMs = 30_000) {
262
+ await this.ensureSchema();
263
+ const result = await this.getPool().query(`with due as (
264
+ select id from ${this.outboxTable}
265
+ where scope_id = $1 and available_at <= now() and (lease_until is null or lease_until <= now())
266
+ order by created_at for update skip locked limit $3
267
+ )
268
+ update ${this.outboxTable} o
269
+ set lease_owner = $2, lease_until = now() + ($4::int * interval '1 millisecond'), attempts = attempts + 1
270
+ from due where o.scope_id = $1 and o.id = due.id
271
+ returning o.id, o.delivery, o.event_name, o.payload`, [this.rowId, owner, limit, leaseMs]);
272
+ return result.rows.map((row) => ({ id: row.id, delivery: row.delivery, eventName: row.event_name, payload: row.payload }));
273
+ }
274
+ async completeOutbox(id, owner) {
275
+ await this.ensureSchema();
276
+ await this.getPool().query(`delete from ${this.outboxTable} where scope_id = $1 and id = $2 and lease_owner = $3`, [this.rowId, id, owner]);
277
+ }
278
+ async releaseOutbox(id, owner, retryMs = 1_000) {
279
+ await this.ensureSchema();
280
+ await this.getPool().query(`update ${this.outboxTable} set lease_owner = null, lease_until = null,
281
+ available_at = now() + ($4::int * interval '1 millisecond')
282
+ where scope_id = $1 and id = $2 and lease_owner = $3`, [this.rowId, id, owner, retryMs]);
42
283
  }
43
284
  async dispose() {
44
285
  this.listeners.clear();
45
286
  await this.pool?.end();
46
287
  this.pool = null;
288
+ this.schemaReady = null;
289
+ }
290
+ parseConfig(value) {
291
+ return this.canonicalizeConfig(migrateRouteParamSyntax(BetterPortalConfigSchema.parse(migrateRouteOperations(migrateOfficialPluginIds(value)))));
47
292
  }
48
293
  getPool() {
49
294
  this.pool ??= new Pool({ connectionString: this.connectionString });
50
295
  return this.pool;
51
296
  }
52
- async ensureSchema() {
53
- const pool = await this.getPool();
54
- await pool.query(`create table if not exists ${this.tableName} (
55
- id text primary key,
56
- config jsonb not null,
57
- updated_at timestamptz not null default now()
58
- )`);
297
+ ensureSchema() {
298
+ this.schemaReady ??= this.migrate();
299
+ return this.schemaReady;
300
+ }
301
+ async migrate() {
302
+ const client = await this.getPool().connect();
303
+ const lockName = `${this.tableName}:${this.rowId}:migrations`;
304
+ try {
305
+ await client.query("select pg_advisory_lock(hashtext($1))", [lockName]);
306
+ await client.query("begin");
307
+ await client.query(`create table if not exists ${this.migrationsTable} (
308
+ scope_id text not null, version integer not null, applied_at timestamptz not null default now(),
309
+ primary key (scope_id, version))`);
310
+ await client.query(`create table if not exists ${this.quotedTableName} (
311
+ id text primary key, config jsonb not null, revision bigint not null default 0,
312
+ updated_at timestamptz not null default now())`);
313
+ await client.query(`alter table ${this.quotedTableName} add column if not exists revision bigint not null default 0`);
314
+ await client.query(`create table if not exists ${this.identityTable} (
315
+ scope_id text primary key, identity jsonb not null, created_at timestamptz not null default now())`);
316
+ await client.query(`create table if not exists ${this.actionsTable} (
317
+ scope_id text not null, kind text not null, action_key text not null, secret_hash text not null,
318
+ payload jsonb not null, expires_at timestamptz not null, status text not null default 'pending',
319
+ result jsonb, lease_owner text, lease_until timestamptz, created_at timestamptz not null default now(),
320
+ primary key (scope_id, kind, action_key))`);
321
+ await client.query(`create table if not exists ${this.deliveriesTable} (
322
+ scope_id text not null, id text not null, target_id text not null, service_id text not null,
323
+ event_id text not null, tenant_id text not null, app_id text, payload jsonb not null,
324
+ attempts integer not null, max_attempts integer not null, next_attempt_at timestamptz not null,
325
+ created_at timestamptz not null, status text not null, last_status integer, last_error text,
326
+ lease_owner text, lease_until timestamptz, primary key (scope_id, id))`);
327
+ await client.query(`create index if not exists ${quotePgIdent(`${this.tableName}_webhook_due_idx`)}
328
+ on ${this.deliveriesTable} (scope_id, status, next_attempt_at)`);
329
+ await client.query(`create table if not exists ${this.outboxTable} (
330
+ scope_id text not null, id text not null, delivery text not null, event_name text not null,
331
+ payload jsonb not null, attempts integer not null default 0, available_at timestamptz not null default now(),
332
+ lease_owner text, lease_until timestamptz, created_at timestamptz not null default now(),
333
+ primary key (scope_id, id))`);
334
+ const applied = await client.query(`select 1 from ${this.migrationsTable} where scope_id = $1 and version = $2`, [this.rowId, SCHEMA_VERSION]);
335
+ if (applied.rows.length === 0) {
336
+ await this.importLegacyFiles(client);
337
+ await client.query(`insert into ${this.migrationsTable} (scope_id, version) values ($1, $2)`, [this.rowId, SCHEMA_VERSION]);
338
+ }
339
+ await client.query("commit");
340
+ }
341
+ catch (error) {
342
+ await client.query("rollback").catch(() => undefined);
343
+ throw error;
344
+ }
345
+ finally {
346
+ await client.query("select pg_advisory_unlock(hashtext($1))", [lockName]).catch(() => undefined);
347
+ client.release();
348
+ }
349
+ }
350
+ async importLegacyFiles(client) {
351
+ const existingConfig = await client.query(`select 1 from ${this.quotedTableName} where id = $1`, [this.rowId]);
352
+ if (existingConfig.rows.length === 0) {
353
+ const configPath = this.legacyPaths.configPath ? resolve(this.legacyPaths.configPath) : undefined;
354
+ const initial = configPath && existsSync(configPath)
355
+ ? this.parseConfig(yaml.parse(readFileSync(configPath, "utf8")))
356
+ : this.parseConfig({});
357
+ await client.query(`insert into ${this.quotedTableName} (id, config, revision) values ($1, $2::jsonb, 0)`, [this.rowId, JSON.stringify(initial)]);
358
+ }
359
+ const identityPath = this.legacyPaths.cpKeyPath ? resolve(this.legacyPaths.cpKeyPath) : undefined;
360
+ if (identityPath && existsSync(identityPath)) {
361
+ const identity = JSON.parse(readFileSync(identityPath, "utf8"));
362
+ await client.query(`insert into ${this.identityTable} (scope_id, identity) values ($1, $2::jsonb)
363
+ on conflict (scope_id) do nothing`, [this.rowId, JSON.stringify(identity)]);
364
+ }
365
+ const deliveryPath = this.legacyPaths.webhookDeliveryPath ? resolve(this.legacyPaths.webhookDeliveryPath) : undefined;
366
+ if (deliveryPath && existsSync(deliveryPath)) {
367
+ const parsed = JSON.parse(readFileSync(deliveryPath, "utf8"));
368
+ if (Array.isArray(parsed)) {
369
+ for (const value of parsed) {
370
+ if (!value || typeof value !== "object")
371
+ continue;
372
+ const record = value;
373
+ if (record.id && record.targetId && record.serviceId && record.eventId && record.tenantId) {
374
+ await this.insertWebhookDelivery(client, record);
375
+ }
376
+ }
377
+ }
378
+ }
379
+ }
380
+ async insertWebhookDelivery(client, record) {
381
+ await client.query(`insert into ${this.deliveriesTable}
382
+ (scope_id, id, target_id, service_id, event_id, tenant_id, app_id, payload,
383
+ attempts, max_attempts, next_attempt_at, created_at, status, last_status, last_error)
384
+ values ($1, $2, $3, $4, $5, $6, $7, $8::jsonb, $9, $10, $11::timestamptz,
385
+ $12::timestamptz, $13, $14, $15) on conflict (scope_id, id) do nothing`, [this.rowId, record.id, record.targetId, record.serviceId, record.eventId, record.tenantId,
386
+ record.appId ?? null, JSON.stringify(record.payload), record.attempts, record.maxAttempts,
387
+ record.nextAttemptAt, record.createdAt, record.status, record.lastStatus ?? null, record.lastError ?? null]);
388
+ }
389
+ async insertOutbox(client, delivery, eventName, payload) {
390
+ await client.query(`insert into ${this.outboxTable} (scope_id, id, delivery, event_name, payload)
391
+ values ($1, $2, $3, $4, $5::jsonb)`, [this.rowId, randomUUID(), delivery, eventName, JSON.stringify(payload)]);
59
392
  }
60
393
  }
61
394
  //# sourceMappingURL=postgres.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../../src/plugins/service-betterportal-config-manager/storage/postgres.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../../src/plugins/service-betterportal-config-manager/storage/postgres.ts"],"names":[],"mappings":"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"}
@@ -93,6 +93,8 @@ export declare function deriveRolePermissions(auth: AppAuthConfig, routes: Bette
93
93
  };
94
94
  /** Read-only accessor for the manifest cache. */
95
95
  export declare function getManifestCache(): ReadonlyMap<string, CachedManifest>;
96
+ /** Rebuild this replica's hot cache from the shared persisted cache. */
97
+ export declare function hydrateManifestCache(config: BetterPortalConfig): void;
96
98
  /** Resolve manifests for service instances, including shared-service activation aliases. */
97
99
  export declare function getCachedManifestForService(config: BetterPortalConfig, serviceInstanceId: string, cache?: ReadonlyMap<string, CachedManifest>): CachedManifest | undefined;
98
100
  export declare function reconcileServiceRegistry(store: PlatformConfigStore, serviceId: string, registry: BetterPortalRegistry, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"syncApi.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-config-manager/syncApi.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACvB,2BAA2B,EAC3B,iBAAiB,EAEjB,oBAAoB,EACpB,mBAAmB,EACnB,SAAS,EACT,oBAAoB,EAEpB,uBAAuB,EACvB,sBAAsB,EACtB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAsCjC;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACzC,UAAU,EAAE,uBAAuB,EAAE,CAAC;IACtC,SAAS,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC,CAAC;CAC9H;AAED,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,WAAW,EAAE,UAAU,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,UAAU,CAAC;QACtD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,CAAC;QAC5F,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,MAAM,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,OAAO,GAAG,UAAU,CAAC;QAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/F,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,YAAY,EAAE,mBAAmB,EAAE,CAAC;IACpC,8EAA8E;IAC9E,WAAW,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,uBAAuB,EAAE,CAAA;KAAE,CAAC,CAAC;IAClG,wFAAwF;IACxF,UAAU,EAAE,OAAO,CAAC;IACpB,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,+EAA+E;IAC/E,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,8CAA8C;IAC9C,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,wDAAwD;IACxD,aAAa,EAAE,gBAAgB,EAAE,CAAC;CACnC;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,IAAI,CAAC,uBAAuB,EAAE,QAAQ,GAAG,aAAa,CAAC,GAAG,OAAO,CAE3G;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,YAAY,EAAE,qBAAqB,EAAE,CAAC;IACtC,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;IACxC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC9C,aAAa,EAAE,sBAAsB,EAAE,CAAC;IACxC,QAAQ,EAAE,sBAAsB,EAAE,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,uBAAuB,EAAE,CAAC;IACvC,UAAU,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAA;KAAE,CAAC,CAAC;CAC1G;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,sBAAsB,EAAE,EAChC,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,cAAc,GAAG,SAAS,GACjE;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,qBAAqB,EAAE,CAAA;CAAE,CAmF3D;AAID,iDAAiD;AACjD,wBAAgB,gBAAgB,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAEtE;AAED,4FAA4F;AAC5F,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,kBAAkB,EAC1B,iBAAiB,EAAE,MAAM,EACzB,KAAK,GAAE,WAAW,CAAC,MAAM,EAAE,cAAc,CAAiB,GACzD,cAAc,GAAG,SAAS,CAyB5B;AA0GD,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,GAAE;IACP,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACzC,QAAQ,CAAC,EAAE,sBAAsB,EAAE,CAAC;IACpC,YAAY,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACvC,WAAW,CAAC,EAAE,oBAAoB,EAAE,CAAC;IACrC,kBAAkB,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACzC,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,YAAY,CAAC,EAAE,2BAA2B,CAAC;CACvC,GACL,OAAO,CAAC,cAAc,CAAC,CAqGzB;AA6DD,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvF;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,iBAAiB,EACtB,KAAK,EAAE,mBAAmB,EAC1B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CA0NN;AAYD,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAChD,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,EAAE,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAChD,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,kBAAkB,EAC1B,GAAG,EAAE,eAAe,GACnB,wBAAwB,EAAE,CAkC5B"}
1
+ {"version":3,"file":"syncApi.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-config-manager/syncApi.ts"],"names":[],"mappings":"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"}
@@ -123,6 +123,25 @@ const manifestCache = new Map();
123
123
  export function getManifestCache() {
124
124
  return manifestCache;
125
125
  }
126
+ /** Rebuild this replica's hot cache from the shared persisted cache. */
127
+ export function hydrateManifestCache(config) {
128
+ manifestCache.clear();
129
+ for (const stored of config.manifestCache ?? []) {
130
+ const manifest = normalizeManifest(stored);
131
+ cacheManifest(stored.serviceId, manifest);
132
+ for (const tenant of config.tenants) {
133
+ for (const service of tenant.services.filter((candidate) => candidate.id === stored.serviceId || candidate.serviceId === stored.serviceId))
134
+ cacheManifest(service.id, manifest);
135
+ }
136
+ for (const service of config.platformServices.filter((candidate) => candidate.id === stored.serviceId || candidate.serviceId === stored.serviceId))
137
+ cacheManifest(service.id, manifest);
138
+ for (const service of config.sharedServiceCatalog.filter((candidate) => candidate.id === stored.serviceId || candidate.serviceId === stored.serviceId)) {
139
+ cacheManifest(service.id, manifest);
140
+ for (const activation of config.sharedServiceActivations.filter((candidate) => candidate.enabled && candidate.sharedServiceId === service.id))
141
+ cacheManifest(activation.id, manifest);
142
+ }
143
+ }
144
+ }
126
145
  /** Resolve manifests for service instances, including shared-service activation aliases. */
127
146
  export function getCachedManifestForService(config, serviceInstanceId, cache = manifestCache) {
128
147
  const read = (key) => {