@betterportal/config-manager 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/bsb-plugin.json +23 -0
- package/bsb-tests.json +14 -0
- package/lib/.bsb/clients/service-betterportal-config-manager.d.ts +37 -0
- package/lib/.bsb/clients/service-betterportal-config-manager.d.ts.map +1 -0
- package/lib/.bsb/clients/service-betterportal-config-manager.js +40 -0
- package/lib/.bsb/clients/service-betterportal-config-manager.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts +3 -0
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js +235 -0
- package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts +4 -0
- package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/adminApi.js +2319 -0
- package/lib/plugins/service-betterportal-config-manager/adminApi.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts +21 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js +269 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.d.ts +19 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.js +329 -0
- package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.d.ts +4 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.js +38 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.d.ts +96 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.js +78 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.d.ts +4 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.js +62 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.d.ts +5 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.js +5 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.d.ts +43 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.js +68 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.js +11 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.d.ts +32 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.js +32 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.d.ts +4 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.js +170 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.d.ts +60 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.js +48 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.d.ts +4 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.js +28 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.d.ts +48 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.js +40 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.js +194 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.d.ts +80 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.js +59 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.js +167 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.d.ts +128 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.js +89 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.d.ts +5 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.js +8 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.d.ts +89 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.js +93 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.d.ts +4 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.js +61 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.d.ts +180 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.js +405 -0
- package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts +26 -0
- package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js +58 -0
- package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.d.ts +3 -0
- package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js +365 -0
- package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/index.d.ts +143 -0
- package/lib/plugins/service-betterportal-config-manager/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/index.js +696 -0
- package/lib/plugins/service-betterportal-config-manager/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts +3 -0
- package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/menuEditor.js +823 -0
- package/lib/plugins/service-betterportal-config-manager/menuEditor.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts +10 -0
- package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/routeContext.js +11 -0
- package/lib/plugins/service-betterportal-config-manager/routeContext.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts +18 -0
- package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/setupTokens.js +245 -0
- package/lib/plugins/service-betterportal-config-manager/setupTokens.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts +41 -0
- package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/core.js +396 -0
- package/lib/plugins/service-betterportal-config-manager/storage/core.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts +10 -0
- package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/file.js +30 -0
- package/lib/plugins/service-betterportal-config-manager/storage/file.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts +36 -0
- package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/index.js +52 -0
- package/lib/plugins/service-betterportal-config-manager/storage/index.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts +15 -0
- package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/storage/postgres.js +60 -0
- package/lib/plugins/service-betterportal-config-manager/storage/postgres.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts +44 -0
- package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/syncApi.js +280 -0
- package/lib/plugins/service-betterportal-config-manager/syncApi.js.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts +6 -0
- package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts.map +1 -0
- package/lib/plugins/service-betterportal-config-manager/webhooks.js +372 -0
- package/lib/plugins/service-betterportal-config-manager/webhooks.js.map +1 -0
- package/lib/schemas/service-betterportal-config-manager.json +157 -0
- package/lib/schemas/service-betterportal-config-manager.plugin.json +135 -0
- package/package.json +69 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Pool } from "pg";
|
|
2
|
+
import { BetterPortalConfigSchema } from "@betterportal/framework";
|
|
3
|
+
import { BaseStorage } from "./core.js";
|
|
4
|
+
function quotePgIdent(identifier) {
|
|
5
|
+
if (!/^[a-z_][a-z0-9_]*$/i.test(identifier)) {
|
|
6
|
+
throw new Error(`Invalid PostgreSQL identifier: ${identifier}`);
|
|
7
|
+
}
|
|
8
|
+
return `"${identifier.replace(/"/g, "\"\"")}"`;
|
|
9
|
+
}
|
|
10
|
+
export class PostgresStorage extends BaseStorage {
|
|
11
|
+
connectionString;
|
|
12
|
+
tableName;
|
|
13
|
+
rowId;
|
|
14
|
+
pool = null;
|
|
15
|
+
constructor(options) {
|
|
16
|
+
super();
|
|
17
|
+
this.connectionString = options.connectionString;
|
|
18
|
+
this.tableName = quotePgIdent(options.tableName ?? "bp_platform_config");
|
|
19
|
+
this.rowId = options.rowId ?? "default";
|
|
20
|
+
}
|
|
21
|
+
async loadConfig() {
|
|
22
|
+
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(BetterPortalConfigSchema.parse(result.rows[0].config));
|
|
31
|
+
}
|
|
32
|
+
async saveConfig(config) {
|
|
33
|
+
await this.ensureSchema();
|
|
34
|
+
const validated = this.canonicalizeConfig(BetterPortalConfigSchema.parse(config));
|
|
35
|
+
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
|
+
this.notifyListeners();
|
|
41
|
+
}
|
|
42
|
+
async dispose() {
|
|
43
|
+
this.listeners.clear();
|
|
44
|
+
await this.pool?.end();
|
|
45
|
+
this.pool = null;
|
|
46
|
+
}
|
|
47
|
+
getPool() {
|
|
48
|
+
this.pool ??= new Pool({ connectionString: this.connectionString });
|
|
49
|
+
return this.pool;
|
|
50
|
+
}
|
|
51
|
+
async ensureSchema() {
|
|
52
|
+
const pool = await this.getPool();
|
|
53
|
+
await pool.query(`create table if not exists ${this.tableName} (
|
|
54
|
+
id text primary key,
|
|
55
|
+
config jsonb not null,
|
|
56
|
+
updated_at timestamptz not null default now()
|
|
57
|
+
)`);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=postgres.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"postgres.js","sourceRoot":"","sources":["../../../../src/plugins/service-betterportal-config-manager/storage/postgres.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { ConfigSchemaDescriptor, BetterPortalH3App, PlatformConfigStore, JsonValue, BetterPortalRouteChrome, WebhookEventDescriptor } from "@betterportal/framework";
|
|
2
|
+
/**
|
|
3
|
+
* In-memory manifest cache per service. Populated by POST sync/poll bodies.
|
|
4
|
+
* Used to inject resolvedServicePath into app.routes before delivery, and to
|
|
5
|
+
* surface per-view permission requirements to the admin role editor.
|
|
6
|
+
*
|
|
7
|
+
* Lifetime: process. Lost on CP restart; services will re-push on next poll.
|
|
8
|
+
*/
|
|
9
|
+
export interface CachedManifestView {
|
|
10
|
+
viewId: string;
|
|
11
|
+
path: string;
|
|
12
|
+
methods: string[];
|
|
13
|
+
role?: string;
|
|
14
|
+
chrome?: BetterPortalRouteChrome;
|
|
15
|
+
dependencies: string[];
|
|
16
|
+
/** Per-view permission requirements from the service's auth.permissions[]. */
|
|
17
|
+
permissions: Array<{
|
|
18
|
+
serviceId: string;
|
|
19
|
+
viewId: string;
|
|
20
|
+
permissions: string[];
|
|
21
|
+
}>;
|
|
22
|
+
/** True if any theme renderer exists (page/fragment/component). API-only views = false. */
|
|
23
|
+
renderable: boolean;
|
|
24
|
+
/** JSON schema documents for request/query/header/response/multipart contracts. */
|
|
25
|
+
schemas?: Record<string, JsonValue>;
|
|
26
|
+
/** True when the service route returns a raw/file Response and is API-only. */
|
|
27
|
+
raw?: boolean;
|
|
28
|
+
/** Example payloads advertised by the service route. */
|
|
29
|
+
demoScenarios: JsonValue[];
|
|
30
|
+
}
|
|
31
|
+
export interface CachedManifest {
|
|
32
|
+
serviceId: string;
|
|
33
|
+
manifestVersion: string;
|
|
34
|
+
title?: string;
|
|
35
|
+
capabilities: string[];
|
|
36
|
+
viewIndex: Record<string, CachedManifestView>;
|
|
37
|
+
configSchemas: ConfigSchemaDescriptor[];
|
|
38
|
+
webhooks: WebhookEventDescriptor[];
|
|
39
|
+
fetchedAt: number;
|
|
40
|
+
}
|
|
41
|
+
/** Read-only accessor for the manifest cache. */
|
|
42
|
+
export declare function getManifestCache(): ReadonlyMap<string, CachedManifest>;
|
|
43
|
+
export declare function registerSyncEndpoint(app: BetterPortalH3App, store: PlatformConfigStore): void;
|
|
44
|
+
//# sourceMappingURL=syncApi.d.ts.map
|
|
@@ -0,0 +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,iBAAiB,EAEjB,mBAAmB,EACnB,SAAS,EAET,uBAAuB,EAEvB,sBAAsB,EACvB,MAAM,yBAAyB,CAAC;AAKjC;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,uBAAuB,CAAC;IACjC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,8EAA8E;IAC9E,WAAW,EAAE,KAAK,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACjF,2FAA2F;IAC3F,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,wDAAwD;IACxD,aAAa,EAAE,SAAS,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,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;AAID,iDAAiD;AACjD,wBAAgB,gBAAgB,IAAI,WAAW,CAAC,MAAM,EAAE,cAAc,CAAC,CAEtE;AAoCD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,mBAAmB,GAAG,IAAI,CA+K7F"}
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { createEventStream } from "h3";
|
|
2
|
+
import { eventObservability, jsonResponse, uuidv7 } from "@betterportal/framework";
|
|
3
|
+
const SYNC_PATH = "/.well-known/bp/sync";
|
|
4
|
+
const manifestCache = new Map();
|
|
5
|
+
/** Read-only accessor for the manifest cache. */
|
|
6
|
+
export function getManifestCache() {
|
|
7
|
+
return manifestCache;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Inject resolvedServicePath onto each app route using the manifest cache.
|
|
11
|
+
* Routes whose target service hasn't published a manifest yet are left
|
|
12
|
+
* with resolvedServicePath undefined - client treats as unresolved.
|
|
13
|
+
*/
|
|
14
|
+
function injectResolvedServicePaths(scoped) {
|
|
15
|
+
const serviceManifestKeys = new Map();
|
|
16
|
+
for (const tenant of scoped.tenants) {
|
|
17
|
+
for (const service of tenant.services) {
|
|
18
|
+
if (service.serviceId)
|
|
19
|
+
serviceManifestKeys.set(service.id, service.serviceId);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
const apps = scoped.apps.map((app) => ({
|
|
23
|
+
...app,
|
|
24
|
+
routes: app.routes.map((route) => {
|
|
25
|
+
const cached = manifestCache.get(route.serviceId)
|
|
26
|
+
?? manifestCache.get(serviceManifestKeys.get(route.serviceId) ?? "");
|
|
27
|
+
if (!cached)
|
|
28
|
+
return route;
|
|
29
|
+
const view = cached.viewIndex[route.viewId];
|
|
30
|
+
if (!view)
|
|
31
|
+
return route;
|
|
32
|
+
const chrome = view.chrome || route.chrome
|
|
33
|
+
? { ...(view.chrome ?? {}), ...(route.chrome ?? {}) }
|
|
34
|
+
: undefined;
|
|
35
|
+
return {
|
|
36
|
+
...route,
|
|
37
|
+
resolvedServicePath: view.path,
|
|
38
|
+
...(chrome ? { chrome } : {})
|
|
39
|
+
};
|
|
40
|
+
})
|
|
41
|
+
}));
|
|
42
|
+
return { ...scoped, apps };
|
|
43
|
+
}
|
|
44
|
+
export function registerSyncEndpoint(app, store) {
|
|
45
|
+
app.get(SYNC_PATH, async (event) => {
|
|
46
|
+
const obs = eventObservability(event);
|
|
47
|
+
const authHeader = event.req.headers.get("authorization");
|
|
48
|
+
const apiKey = authHeader?.startsWith("Bearer ") ? authHeader.slice(7) : null;
|
|
49
|
+
if (!apiKey) {
|
|
50
|
+
obs?.logger.warn("BP SYNC: rejected missing bearer token");
|
|
51
|
+
return jsonResponse({ error: "Bearer token required" }, 401);
|
|
52
|
+
}
|
|
53
|
+
const validated = await store.validateApiKey(apiKey);
|
|
54
|
+
if (!validated) {
|
|
55
|
+
obs?.logger.warn("BP SYNC: rejected invalid API key");
|
|
56
|
+
return jsonResponse({ error: "Invalid API key" }, 403);
|
|
57
|
+
}
|
|
58
|
+
if (!validated.serviceId) {
|
|
59
|
+
obs?.logger.warn("BP SYNC: rejected unlinked service scope={scope} tenant={tenantId}", {
|
|
60
|
+
scope: validated.scope,
|
|
61
|
+
tenantId: validated.tenantId ?? ""
|
|
62
|
+
});
|
|
63
|
+
return jsonResponse({ error: "Service not yet linked - serviceId unknown" }, 412);
|
|
64
|
+
}
|
|
65
|
+
const serviceId = validated.serviceId;
|
|
66
|
+
obs?.logger.info("BP SYNC: accepted service={serviceId} scope={scope} tenant={tenantId}", {
|
|
67
|
+
serviceId,
|
|
68
|
+
scope: validated.scope,
|
|
69
|
+
tenantId: validated.tenantId ?? ""
|
|
70
|
+
});
|
|
71
|
+
const stream = createEventStream(event);
|
|
72
|
+
const sendScopedConfig = async () => {
|
|
73
|
+
const scoped = await store.getScopedConfig(serviceId, validated.scope, validated.tenantId);
|
|
74
|
+
const resolved = injectResolvedServicePaths(scoped);
|
|
75
|
+
obs?.logger.info("BP SYNC: sending config service={serviceId} tenants={tenants} apps={apps}", {
|
|
76
|
+
serviceId,
|
|
77
|
+
tenants: resolved.tenants.length,
|
|
78
|
+
apps: resolved.apps.length
|
|
79
|
+
});
|
|
80
|
+
await stream.push({
|
|
81
|
+
event: "config",
|
|
82
|
+
data: JSON.stringify(resolved)
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
const unsubscribe = store.onChange(() => {
|
|
86
|
+
sendScopedConfig().catch((error) => {
|
|
87
|
+
obs?.logger.warn("BP SYNC: failed sending config service={serviceId}: {msg}", {
|
|
88
|
+
serviceId,
|
|
89
|
+
msg: error instanceof Error ? error.message : String(error)
|
|
90
|
+
});
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
stream.onClosed(() => {
|
|
94
|
+
obs?.logger.info("BP SYNC: stream closed service={serviceId}", {
|
|
95
|
+
serviceId
|
|
96
|
+
});
|
|
97
|
+
unsubscribe();
|
|
98
|
+
});
|
|
99
|
+
const response = stream.send();
|
|
100
|
+
sendScopedConfig().catch((error) => {
|
|
101
|
+
obs?.logger.warn("BP SYNC: failed sending initial config service={serviceId}: {msg}", {
|
|
102
|
+
serviceId,
|
|
103
|
+
msg: error instanceof Error ? error.message : String(error)
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
return response;
|
|
107
|
+
});
|
|
108
|
+
const pollHandler = async (event) => {
|
|
109
|
+
const obs = eventObservability(event);
|
|
110
|
+
const authHeader = event.req.headers.get("authorization");
|
|
111
|
+
const apiKey = authHeader?.startsWith("Bearer ") ? authHeader.slice(7) : null;
|
|
112
|
+
if (!apiKey) {
|
|
113
|
+
obs?.logger.warn("BP SYNC POLL: rejected missing bearer token");
|
|
114
|
+
return jsonResponse({ error: "Bearer token required" }, 401);
|
|
115
|
+
}
|
|
116
|
+
const validated = await store.validateApiKey(apiKey);
|
|
117
|
+
if (!validated) {
|
|
118
|
+
obs?.logger.warn("BP SYNC POLL: rejected invalid API key");
|
|
119
|
+
return jsonResponse({ error: "Invalid API key" }, 403);
|
|
120
|
+
}
|
|
121
|
+
if (!validated.serviceId) {
|
|
122
|
+
obs?.logger.warn("BP SYNC POLL: rejected unlinked service scope={scope} tenant={tenantId}", {
|
|
123
|
+
scope: validated.scope,
|
|
124
|
+
tenantId: validated.tenantId ?? ""
|
|
125
|
+
});
|
|
126
|
+
return jsonResponse({ error: "Service not yet linked" }, 412);
|
|
127
|
+
}
|
|
128
|
+
const serviceId = validated.serviceId;
|
|
129
|
+
// POST: extract manifest push if present and cache.
|
|
130
|
+
if (event.req.method === "POST") {
|
|
131
|
+
const body = await event.req.json().catch(() => null);
|
|
132
|
+
if (body && (body.viewIndex || body.configSchemas)) {
|
|
133
|
+
const normalizedViews = {};
|
|
134
|
+
for (const [vid, v] of Object.entries(body.viewIndex ?? {})) {
|
|
135
|
+
normalizedViews[vid] = {
|
|
136
|
+
viewId: v.viewId,
|
|
137
|
+
path: v.path,
|
|
138
|
+
methods: v.methods ?? [],
|
|
139
|
+
...(v.role ? { role: v.role } : {}),
|
|
140
|
+
...(v.chrome ? { chrome: v.chrome } : {}),
|
|
141
|
+
dependencies: Array.isArray(v.dependencies) ? v.dependencies.filter((value) => typeof value === "string" && value.length > 0) : [],
|
|
142
|
+
permissions: v.permissions ?? [],
|
|
143
|
+
renderable: v.renderable ?? true,
|
|
144
|
+
...(v.schemas && typeof v.schemas === "object" ? { schemas: v.schemas } : {}),
|
|
145
|
+
...(v.raw === true ? { raw: true } : {}),
|
|
146
|
+
demoScenarios: Array.isArray(v.demoScenarios) ? v.demoScenarios : []
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const cachedManifest = {
|
|
150
|
+
serviceId,
|
|
151
|
+
manifestVersion: body.manifestVersion ?? "unknown",
|
|
152
|
+
title: body.title,
|
|
153
|
+
capabilities: Array.isArray(body.capabilities) ? body.capabilities.filter((value) => typeof value === "string") : [],
|
|
154
|
+
viewIndex: normalizedViews,
|
|
155
|
+
configSchemas: Array.isArray(body.configSchemas) ? body.configSchemas : [],
|
|
156
|
+
webhooks: Array.isArray(body.webhooks) ? body.webhooks : [],
|
|
157
|
+
fetchedAt: Date.now()
|
|
158
|
+
};
|
|
159
|
+
manifestCache.set(serviceId, cachedManifest);
|
|
160
|
+
await updateServiceMetadata(store, serviceId, cachedManifest);
|
|
161
|
+
obs?.logger.info("BP SYNC POLL: cached manifest service={serviceId} version={version} views={count} configSchemas={configSchemas}", {
|
|
162
|
+
serviceId,
|
|
163
|
+
version: body.manifestVersion ?? "unknown",
|
|
164
|
+
count: Object.keys(normalizedViews).length,
|
|
165
|
+
configSchemas: Array.isArray(body.configSchemas) ? body.configSchemas.length : 0
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
const scoped = await store.getScopedConfig(serviceId, validated.scope, validated.tenantId);
|
|
170
|
+
const resolved = injectResolvedServicePaths(scoped);
|
|
171
|
+
obs?.logger.info("BP SYNC POLL: sending config service={serviceId} scope={scope} tenant={tenantId} tenants={tenants} apps={apps}", {
|
|
172
|
+
serviceId,
|
|
173
|
+
scope: validated.scope,
|
|
174
|
+
tenantId: validated.tenantId ?? "",
|
|
175
|
+
tenants: resolved.tenants.length,
|
|
176
|
+
apps: resolved.apps.length
|
|
177
|
+
});
|
|
178
|
+
return jsonResponse(resolved);
|
|
179
|
+
};
|
|
180
|
+
app.get(`${SYNC_PATH}/poll`, pollHandler);
|
|
181
|
+
app.post(`${SYNC_PATH}/poll`, pollHandler);
|
|
182
|
+
}
|
|
183
|
+
function normalizeMethods(methods) {
|
|
184
|
+
return methods.filter((method) => method === "GET" || method === "POST" || method === "PUT" || method === "PATCH" || method === "DELETE" || method === "OPTIONS");
|
|
185
|
+
}
|
|
186
|
+
function sameMethods(left, right) {
|
|
187
|
+
if (left.length !== right.length)
|
|
188
|
+
return false;
|
|
189
|
+
const rightSet = new Set(right);
|
|
190
|
+
return left.every((method) => rightSet.has(method));
|
|
191
|
+
}
|
|
192
|
+
function addMissingDependencyRoutes(app, sourceRoute, manifest) {
|
|
193
|
+
const sourceView = manifest.viewIndex[sourceRoute.viewId];
|
|
194
|
+
if (!sourceView)
|
|
195
|
+
return false;
|
|
196
|
+
let changed = false;
|
|
197
|
+
for (const dependencyViewId of sourceView.dependencies) {
|
|
198
|
+
const dependency = manifest.viewIndex[dependencyViewId];
|
|
199
|
+
if (!dependency)
|
|
200
|
+
continue;
|
|
201
|
+
if (app.routes.some((route) => route.serviceId === sourceRoute.serviceId && route.viewId === dependencyViewId))
|
|
202
|
+
continue;
|
|
203
|
+
const methods = normalizeMethods(dependency.methods);
|
|
204
|
+
app.routes.push({
|
|
205
|
+
id: uuidv7(),
|
|
206
|
+
path: dependency.path,
|
|
207
|
+
serviceId: sourceRoute.serviceId,
|
|
208
|
+
viewId: dependencyViewId,
|
|
209
|
+
targetPath: dependency.path,
|
|
210
|
+
title: dependency.viewId,
|
|
211
|
+
enabled: true,
|
|
212
|
+
methods: methods.length ? methods : ["GET"]
|
|
213
|
+
});
|
|
214
|
+
changed = true;
|
|
215
|
+
}
|
|
216
|
+
return changed;
|
|
217
|
+
}
|
|
218
|
+
async function updateServiceMetadata(store, serviceInstanceId, manifest) {
|
|
219
|
+
const config = await store.loadConfig();
|
|
220
|
+
let changed = false;
|
|
221
|
+
const routeServiceIds = new Set([serviceInstanceId]);
|
|
222
|
+
for (const tenant of config.tenants) {
|
|
223
|
+
const service = tenant.services.find((candidate) => candidate.id === serviceInstanceId || candidate.serviceId === serviceInstanceId);
|
|
224
|
+
if (!service)
|
|
225
|
+
continue;
|
|
226
|
+
routeServiceIds.add(service.id);
|
|
227
|
+
service.capabilities = manifest.capabilities;
|
|
228
|
+
if (manifest.title && (!service.title || service.title === service.serviceId))
|
|
229
|
+
service.title = manifest.title;
|
|
230
|
+
changed = true;
|
|
231
|
+
}
|
|
232
|
+
const platform = config.platformServices.find((candidate) => candidate.id === serviceInstanceId || candidate.serviceId === serviceInstanceId);
|
|
233
|
+
if (platform) {
|
|
234
|
+
routeServiceIds.add(platform.id);
|
|
235
|
+
platform.capabilities = manifest.capabilities;
|
|
236
|
+
if (manifest.title && (!platform.title || platform.title === platform.serviceId))
|
|
237
|
+
platform.title = manifest.title;
|
|
238
|
+
changed = true;
|
|
239
|
+
}
|
|
240
|
+
const shared = config.sharedServiceCatalog.find((candidate) => candidate.id === serviceInstanceId || candidate.serviceId === serviceInstanceId);
|
|
241
|
+
if (shared) {
|
|
242
|
+
for (const activation of config.sharedServiceActivations.filter((candidate) => candidate.enabled && candidate.sharedServiceId === shared.id)) {
|
|
243
|
+
routeServiceIds.add(activation.id);
|
|
244
|
+
}
|
|
245
|
+
shared.tags = [...new Set([...(shared.tags ?? []), ...manifest.capabilities])];
|
|
246
|
+
if (manifest.title && (!shared.title || shared.title === shared.id || shared.title === shared.serviceId))
|
|
247
|
+
shared.title = manifest.title;
|
|
248
|
+
changed = true;
|
|
249
|
+
}
|
|
250
|
+
for (const app of config.apps) {
|
|
251
|
+
for (const route of app.routes.filter((candidate) => routeServiceIds.has(candidate.serviceId))) {
|
|
252
|
+
const view = manifest.viewIndex[route.viewId];
|
|
253
|
+
if (!view) {
|
|
254
|
+
if (route.enabled !== false) {
|
|
255
|
+
route.enabled = false;
|
|
256
|
+
changed = true;
|
|
257
|
+
}
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const methods = normalizeMethods(view.methods);
|
|
261
|
+
if (methods.length > 0 && !sameMethods(route.methods, methods)) {
|
|
262
|
+
route.methods = methods;
|
|
263
|
+
changed = true;
|
|
264
|
+
}
|
|
265
|
+
if (route.targetPath !== view.path) {
|
|
266
|
+
route.targetPath = view.path;
|
|
267
|
+
changed = true;
|
|
268
|
+
}
|
|
269
|
+
if (!route.title && view.viewId) {
|
|
270
|
+
route.title = view.viewId;
|
|
271
|
+
changed = true;
|
|
272
|
+
}
|
|
273
|
+
if (addMissingDependencyRoutes(app, route, manifest))
|
|
274
|
+
changed = true;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
if (changed)
|
|
278
|
+
await store.saveConfig(config);
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=syncApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syncApi.js","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-config-manager/syncApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { type BetterPortalH3App, type PlatformConfigStore } from "@betterportal/framework";
|
|
2
|
+
export declare function registerWebhookRoutes(app: BetterPortalH3App, store: PlatformConfigStore): {
|
|
3
|
+
start(): void;
|
|
4
|
+
stop(): void;
|
|
5
|
+
};
|
|
6
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../../src/plugins/service-betterportal-config-manager/webhooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,iBAAiB,EAEtB,KAAK,mBAAmB,EAEzB,MAAM,yBAAyB,CAAC;AA8KjC,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,EAAE,KAAK,EAAE,mBAAmB,GAAG;IAAE,KAAK,IAAI,IAAI,CAAC;IAAC,IAAI,IAAI,IAAI,CAAA;CAAE,CAqOzH"}
|