@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.
Files changed (154) hide show
  1. package/README.md +3 -0
  2. package/bsb-plugin.json +23 -0
  3. package/bsb-tests.json +14 -0
  4. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts +37 -0
  5. package/lib/.bsb/clients/service-betterportal-config-manager.d.ts.map +1 -0
  6. package/lib/.bsb/clients/service-betterportal-config-manager.js +40 -0
  7. package/lib/.bsb/clients/service-betterportal-config-manager.js.map +1 -0
  8. package/lib/index.d.ts +2 -0
  9. package/lib/index.d.ts.map +1 -0
  10. package/lib/index.js +2 -0
  11. package/lib/index.js.map +1 -0
  12. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts +3 -0
  13. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.d.ts.map +1 -0
  14. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js +235 -0
  15. package/lib/plugins/service-betterportal-config-manager/.bp-generated/registry.js.map +1 -0
  16. package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts +4 -0
  17. package/lib/plugins/service-betterportal-config-manager/adminApi.d.ts.map +1 -0
  18. package/lib/plugins/service-betterportal-config-manager/adminApi.js +2319 -0
  19. package/lib/plugins/service-betterportal-config-manager/adminApi.js.map +1 -0
  20. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts +21 -0
  21. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.d.ts.map +1 -0
  22. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js +269 -0
  23. package/lib/plugins/service-betterportal-config-manager/bootstrapEndpoint.js.map +1 -0
  24. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.d.ts +19 -0
  25. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.d.ts.map +1 -0
  26. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.js +329 -0
  27. package/lib/plugins/service-betterportal-config-manager/bootstrapWizardHtml.js.map +1 -0
  28. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.d.ts +4 -0
  29. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.d.ts.map +1 -0
  30. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.js +38 -0
  31. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/_theme.bootstrap1/index.js.map +1 -0
  32. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.d.ts +96 -0
  33. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.d.ts.map +1 -0
  34. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.js +78 -0
  35. package/lib/plugins/service-betterportal-config-manager/bp-routes/auth/index.js.map +1 -0
  36. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.d.ts +4 -0
  37. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.d.ts.map +1 -0
  38. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.js +62 -0
  39. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.bootstrap1/index.js.map +1 -0
  40. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.d.ts +5 -0
  41. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.d.ts.map +1 -0
  42. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.js +5 -0
  43. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/_theme.embedded.js.map +1 -0
  44. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.d.ts +43 -0
  45. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.d.ts.map +1 -0
  46. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.js +68 -0
  47. package/lib/plugins/service-betterportal-config-manager/bp-routes/config/index.js.map +1 -0
  48. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.d.ts +5 -0
  49. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.d.ts.map +1 -0
  50. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.js +11 -0
  51. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/_theme.bootstrap1/index.js.map +1 -0
  52. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.d.ts +32 -0
  53. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.d.ts.map +1 -0
  54. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.js +32 -0
  55. package/lib/plugins/service-betterportal-config-manager/bp-routes/fragments/index.js.map +1 -0
  56. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.d.ts +4 -0
  57. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.d.ts.map +1 -0
  58. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.js +170 -0
  59. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/_theme.bootstrap1/index.js.map +1 -0
  60. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.d.ts +60 -0
  61. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.d.ts.map +1 -0
  62. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.js +48 -0
  63. package/lib/plugins/service-betterportal-config-manager/bp-routes/menu/index.js.map +1 -0
  64. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.d.ts +4 -0
  65. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.d.ts.map +1 -0
  66. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.js +28 -0
  67. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/_theme.bootstrap1/index.js.map +1 -0
  68. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.d.ts +48 -0
  69. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.d.ts.map +1 -0
  70. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.js +40 -0
  71. package/lib/plugins/service-betterportal-config-manager/bp-routes/preview/index.js.map +1 -0
  72. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.d.ts +5 -0
  73. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.d.ts.map +1 -0
  74. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.js +194 -0
  75. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/_theme.bootstrap1/index.js.map +1 -0
  76. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.d.ts +80 -0
  77. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.d.ts.map +1 -0
  78. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.js +59 -0
  79. package/lib/plugins/service-betterportal-config-manager/bp-routes/routes/index.js.map +1 -0
  80. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.d.ts +5 -0
  81. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.d.ts.map +1 -0
  82. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.js +167 -0
  83. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/_theme.bootstrap1/index.js.map +1 -0
  84. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.d.ts +128 -0
  85. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.d.ts.map +1 -0
  86. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.js +89 -0
  87. package/lib/plugins/service-betterportal-config-manager/bp-routes/services/index.js.map +1 -0
  88. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.d.ts +5 -0
  89. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.d.ts.map +1 -0
  90. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.js +8 -0
  91. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/_theme.bootstrap1/index.js.map +1 -0
  92. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.d.ts +89 -0
  93. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.d.ts.map +1 -0
  94. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.js +93 -0
  95. package/lib/plugins/service-betterportal-config-manager/bp-routes/settings/index.js.map +1 -0
  96. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.d.ts +4 -0
  97. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.d.ts.map +1 -0
  98. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.js +61 -0
  99. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/_theme.bootstrap1/index.js.map +1 -0
  100. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.d.ts +180 -0
  101. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.d.ts.map +1 -0
  102. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.js +405 -0
  103. package/lib/plugins/service-betterportal-config-manager/bp-routes/tenants/index.js.map +1 -0
  104. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts +26 -0
  105. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.d.ts.map +1 -0
  106. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js +58 -0
  107. package/lib/plugins/service-betterportal-config-manager/cpBootstrap.js.map +1 -0
  108. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.d.ts +3 -0
  109. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.d.ts.map +1 -0
  110. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js +365 -0
  111. package/lib/plugins/service-betterportal-config-manager/fragmentsEditor.js.map +1 -0
  112. package/lib/plugins/service-betterportal-config-manager/index.d.ts +143 -0
  113. package/lib/plugins/service-betterportal-config-manager/index.d.ts.map +1 -0
  114. package/lib/plugins/service-betterportal-config-manager/index.js +696 -0
  115. package/lib/plugins/service-betterportal-config-manager/index.js.map +1 -0
  116. package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts +3 -0
  117. package/lib/plugins/service-betterportal-config-manager/menuEditor.d.ts.map +1 -0
  118. package/lib/plugins/service-betterportal-config-manager/menuEditor.js +823 -0
  119. package/lib/plugins/service-betterportal-config-manager/menuEditor.js.map +1 -0
  120. package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts +10 -0
  121. package/lib/plugins/service-betterportal-config-manager/routeContext.d.ts.map +1 -0
  122. package/lib/plugins/service-betterportal-config-manager/routeContext.js +11 -0
  123. package/lib/plugins/service-betterportal-config-manager/routeContext.js.map +1 -0
  124. package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts +18 -0
  125. package/lib/plugins/service-betterportal-config-manager/setupTokens.d.ts.map +1 -0
  126. package/lib/plugins/service-betterportal-config-manager/setupTokens.js +245 -0
  127. package/lib/plugins/service-betterportal-config-manager/setupTokens.js.map +1 -0
  128. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts +41 -0
  129. package/lib/plugins/service-betterportal-config-manager/storage/core.d.ts.map +1 -0
  130. package/lib/plugins/service-betterportal-config-manager/storage/core.js +396 -0
  131. package/lib/plugins/service-betterportal-config-manager/storage/core.js.map +1 -0
  132. package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts +10 -0
  133. package/lib/plugins/service-betterportal-config-manager/storage/file.d.ts.map +1 -0
  134. package/lib/plugins/service-betterportal-config-manager/storage/file.js +30 -0
  135. package/lib/plugins/service-betterportal-config-manager/storage/file.js.map +1 -0
  136. package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts +36 -0
  137. package/lib/plugins/service-betterportal-config-manager/storage/index.d.ts.map +1 -0
  138. package/lib/plugins/service-betterportal-config-manager/storage/index.js +52 -0
  139. package/lib/plugins/service-betterportal-config-manager/storage/index.js.map +1 -0
  140. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts +15 -0
  141. package/lib/plugins/service-betterportal-config-manager/storage/postgres.d.ts.map +1 -0
  142. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js +60 -0
  143. package/lib/plugins/service-betterportal-config-manager/storage/postgres.js.map +1 -0
  144. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts +44 -0
  145. package/lib/plugins/service-betterportal-config-manager/syncApi.d.ts.map +1 -0
  146. package/lib/plugins/service-betterportal-config-manager/syncApi.js +280 -0
  147. package/lib/plugins/service-betterportal-config-manager/syncApi.js.map +1 -0
  148. package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts +6 -0
  149. package/lib/plugins/service-betterportal-config-manager/webhooks.d.ts.map +1 -0
  150. package/lib/plugins/service-betterportal-config-manager/webhooks.js +372 -0
  151. package/lib/plugins/service-betterportal-config-manager/webhooks.js.map +1 -0
  152. package/lib/schemas/service-betterportal-config-manager.json +157 -0
  153. package/lib/schemas/service-betterportal-config-manager.plugin.json +135 -0
  154. 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"}