@oktis-works/api 0.12.1 → 0.13.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 (45) hide show
  1. package/dist/index.js +14 -1
  2. package/dist/index.js.map +1 -1
  3. package/dist/middleware/rate-limit.d.ts +8 -0
  4. package/dist/middleware/rate-limit.d.ts.map +1 -1
  5. package/dist/middleware/rate-limit.js +23 -0
  6. package/dist/middleware/rate-limit.js.map +1 -1
  7. package/dist/routes/blocks/catalog.d.ts +14 -0
  8. package/dist/routes/blocks/catalog.d.ts.map +1 -0
  9. package/dist/routes/blocks/catalog.js +32 -0
  10. package/dist/routes/blocks/catalog.js.map +1 -0
  11. package/dist/routes/blocks/index.d.ts +4 -0
  12. package/dist/routes/blocks/index.d.ts.map +1 -0
  13. package/dist/routes/blocks/index.js +54 -0
  14. package/dist/routes/blocks/index.js.map +1 -0
  15. package/dist/routes/comments/index.d.ts +4 -0
  16. package/dist/routes/comments/index.d.ts.map +1 -0
  17. package/dist/routes/comments/index.js +157 -0
  18. package/dist/routes/comments/index.js.map +1 -0
  19. package/dist/routes/field-groups/index.d.ts.map +1 -1
  20. package/dist/routes/field-groups/index.js +6 -3
  21. package/dist/routes/field-groups/index.js.map +1 -1
  22. package/dist/routes/field-types/index.js +2 -2
  23. package/dist/routes/field-types/index.js.map +1 -1
  24. package/dist/routes/health/index.d.ts.map +1 -1
  25. package/dist/routes/health/index.js +42 -2
  26. package/dist/routes/health/index.js.map +1 -1
  27. package/dist/routes/patterns/catalog.d.ts +15 -0
  28. package/dist/routes/patterns/catalog.d.ts.map +1 -0
  29. package/dist/routes/patterns/catalog.js +33 -0
  30. package/dist/routes/patterns/catalog.js.map +1 -0
  31. package/dist/routes/patterns/index.d.ts +4 -0
  32. package/dist/routes/patterns/index.d.ts.map +1 -0
  33. package/dist/routes/patterns/index.js +54 -0
  34. package/dist/routes/patterns/index.js.map +1 -0
  35. package/dist/routes/plugins/extensions.d.ts +15 -0
  36. package/dist/routes/plugins/extensions.d.ts.map +1 -0
  37. package/dist/routes/plugins/extensions.js +196 -0
  38. package/dist/routes/plugins/extensions.js.map +1 -0
  39. package/dist/routes/plugins/index.d.ts.map +1 -1
  40. package/dist/routes/plugins/index.js +45 -1
  41. package/dist/routes/plugins/index.js.map +1 -1
  42. package/dist/routes/webhooks/index.d.ts.map +1 -1
  43. package/dist/routes/webhooks/index.js +46 -0
  44. package/dist/routes/webhooks/index.js.map +1 -1
  45. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/field-types/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;AAE1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AAEhC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAW,CAAC;IAE9C,0CAA0C;IAC1C,MAAM,yBAAyB,CAAC,cAAc,EAAE,CAAC;IAEjD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,QAAgC,CAAC;QAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE,qBAAqB;QACjC,KAAK;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/field-types/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACpG,OAAO,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7E,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;AAE1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AAEhC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChE,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAW,CAAC;IAE9C,sEAAsE;IACtE,MAAM,yBAAyB,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,wBAAwB,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,QAAgC,CAAC;QAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE,qBAAqB;QACjC,KAAK;KACN,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/health/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,YAAY,4EAAa,CAAC;AAmChC,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/health/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,QAAA,MAAM,YAAY,4EAAa,CAAC;AAuFhC,eAAe,YAAY,CAAC"}
@@ -1,18 +1,58 @@
1
1
  // @oktis-works/api - Health Check Route
2
+ //
3
+ // Item 14: plugin health checks (api.health.register, permission
4
+ // health:register) run aggregated here with a 2s budget each — failure,
5
+ // throw or timeout is reported as 'error' and never breaks the endpoint.
2
6
  import { Hono } from 'hono';
3
7
  import { healthCheck } from '@oktis-works/database';
8
+ import { getPluginHealthChecks } from '@oktis-works/core';
4
9
  const healthRouter = new Hono();
10
+ const PLUGIN_CHECK_TIMEOUT_MS = 2000;
11
+ /** Runs one plugin check with a hard timeout; never throws. */
12
+ async function runPluginCheck(pluginName, name, check) {
13
+ const key = `${pluginName}:${name}`;
14
+ const timeout = new Promise((resolve) => setTimeout(() => resolve([key, { status: 'error', error: `timeout after ${PLUGIN_CHECK_TIMEOUT_MS}ms` }]), PLUGIN_CHECK_TIMEOUT_MS));
15
+ const run = (async () => {
16
+ try {
17
+ const result = (await check());
18
+ return [key, { status: result?.ok ? 'ok' : 'error', details: result?.details }];
19
+ }
20
+ catch (error) {
21
+ return [key, { status: 'error', error: error instanceof Error ? error.message : String(error) }];
22
+ }
23
+ })();
24
+ timeout.unref?.();
25
+ return Promise.race([run, timeout]);
26
+ }
27
+ /** Aggregates every registered plugin check (platform scope). */
28
+ async function runAllPluginChecks() {
29
+ const outcomes = {};
30
+ try {
31
+ const entries = await getPluginHealthChecks(null);
32
+ const results = await Promise.all(entries.flatMap((entry) => entry.checks.map((registered) => runPluginCheck(entry.pluginName, registered.name, registered.check))));
33
+ for (const [key, outcome] of results) {
34
+ outcomes[key] = outcome;
35
+ }
36
+ }
37
+ catch {
38
+ // runtime unavailable — health stays database-only
39
+ }
40
+ return outcomes;
41
+ }
5
42
  // GET /health
6
43
  healthRouter.get('/', async (c) => {
7
44
  const dbHealthy = await healthCheck();
8
- const status = dbHealthy ? 'healthy' : 'degraded';
9
- const statusCode = dbHealthy ? 200 : 503;
45
+ const pluginChecks = await runAllPluginChecks();
46
+ const pluginsHealthy = Object.values(pluginChecks).every((outcome) => outcome.status === 'ok');
47
+ const status = dbHealthy && pluginsHealthy ? 'healthy' : 'degraded';
48
+ const statusCode = dbHealthy && pluginsHealthy ? 200 : 503;
10
49
  return c.json({
11
50
  status,
12
51
  timestamp: new Date().toISOString(),
13
52
  uptime: process.uptime(),
14
53
  checks: {
15
54
  database: dbHealthy ? 'ok' : 'error',
55
+ plugins: pluginChecks,
16
56
  },
17
57
  }, statusCode);
18
58
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/health/index.ts"],"names":[],"mappings":"AAAA,wCAAwC;AAExC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAEpD,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC;AAEhC,cAAc;AACd,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE;IACzC,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;IAEtC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;IAClD,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEzC,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,MAAM;QACN,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE;QACxB,MAAM,EAAE;YACN,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO;SACrC;KACF,EAAE,UAAU,CAAC,CAAC;AACjB,CAAC,CAAC,CAAC;AAEH,oBAAoB;AACpB,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE;IAC9C,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC;IAEtC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,mBAAmB;AACnB,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAU,EAAE,EAAE;IAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/health/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { PluginPatternManifest } from '@oktis-works/types';
2
+ export interface PatternCatalogEntry extends PluginPatternManifest {
3
+ pluginName: string;
4
+ source: 'manifest' | 'runtime';
5
+ }
6
+ /** `hero-section` → `my-plugin/hero-section`; an already-namespaced `ns/name` stays untouched. */
7
+ export declare function namespacePatternName(pluginName: string, name: string): string;
8
+ /**
9
+ * Adds one plugin's patterns to the catalog with namespacing and dedupe by
10
+ * namespaced name (malformed entries are dropped — the endpoint never
11
+ * breaks). Call manifest sources first so static declarations win over
12
+ * runtime ones.
13
+ */
14
+ export declare function addPluginPatterns(target: PatternCatalogEntry[], patterns: readonly PluginPatternManifest[] | undefined | null, pluginName: string, source: 'manifest' | 'runtime'): void;
15
+ //# sourceMappingURL=catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../src/routes/patterns/catalog.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAE/D,MAAM,WAAW,mBAAoB,SAAQ,qBAAqB;IAChE,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,UAAU,GAAG,SAAS,CAAA;CAC/B;AAED,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7E;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,mBAAmB,EAAE,EAC7B,QAAQ,EAAE,SAAS,qBAAqB,EAAE,GAAG,SAAS,GAAG,IAAI,EAC7D,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,GAAG,SAAS,GAC7B,IAAI,CASN"}
@@ -0,0 +1,33 @@
1
+ // @oktis-works/api - Editor pattern catalog helpers (GET /api/v1/patterns)
2
+ //
3
+ // WordPress-parity item 13 (E4): the pattern catalog is an editor-agnostic
4
+ // data plane with no table — it merges `manifest.patterns` (static
5
+ // declarations of active plugins) with `api.registerPattern` runtime
6
+ // registrations, which only exist while the plugin is loaded. Names are
7
+ // namespaced like WordPress patterns (`namespace/name`): a bare name gets
8
+ // the plugin name as its namespace, so two plugins never collide.
9
+ /** `hero-section` → `my-plugin/hero-section`; an already-namespaced `ns/name` stays untouched. */
10
+ export function namespacePatternName(pluginName, name) {
11
+ return name.includes('/') ? name : `${pluginName}/${name}`;
12
+ }
13
+ /**
14
+ * Adds one plugin's patterns to the catalog with namespacing and dedupe by
15
+ * namespaced name (malformed entries are dropped — the endpoint never
16
+ * breaks). Call manifest sources first so static declarations win over
17
+ * runtime ones.
18
+ */
19
+ export function addPluginPatterns(target, patterns, pluginName, source) {
20
+ for (const pattern of patterns ?? []) {
21
+ if (!pattern || typeof pattern.name !== 'string' || pattern.name.length === 0)
22
+ continue;
23
+ if (typeof pattern.label !== 'string' || pattern.label.length === 0)
24
+ continue;
25
+ if (typeof pattern.content !== 'string' || pattern.content.length === 0)
26
+ continue;
27
+ const name = namespacePatternName(pluginName, pattern.name);
28
+ if (target.some((existing) => existing.name === name))
29
+ continue;
30
+ target.push({ ...pattern, name, pluginName, source });
31
+ }
32
+ }
33
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../src/routes/patterns/catalog.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,qEAAqE;AACrE,wEAAwE;AACxE,0EAA0E;AAC1E,kEAAkE;AASlE,kGAAkG;AAClG,MAAM,UAAU,oBAAoB,CAAC,UAAkB,EAAE,IAAY;IACnE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,UAAU,IAAI,IAAI,EAAE,CAAA;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA6B,EAC7B,QAA6D,EAC7D,UAAkB,EAClB,MAA8B;IAE9B,KAAK,MAAM,OAAO,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QACvF,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QAC7E,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,SAAQ;QACjF,MAAM,IAAI,GAAG,oBAAoB,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;QAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,SAAQ;QAC/D,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;IACvD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ declare const patterns: Hono<import("hono/types").BlankEnv, import("hono/types").BlankSchema, "/">;
3
+ export default patterns;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/patterns/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAO3B,QAAA,MAAM,QAAQ,4EAAa,CAAA;AA4C3B,eAAe,QAAQ,CAAA"}
@@ -0,0 +1,54 @@
1
+ // @oktis-works/api - Editor pattern catalog route (GET /api/v1/patterns)
2
+ //
3
+ // WordPress-parity item 13 (E4) — editor-agnostic data plane endpoint:
4
+ // merges `manifest.patterns` from active plugins with runtime
5
+ // `api.registerPattern` registrations (platform + tenant scopes). No table:
6
+ // entries exist while the plugin is active. RBAC: reading the catalog
7
+ // requires `read content` (same gate as the block catalog).
8
+ import { Hono } from 'hono';
9
+ import { pluginService, ensureTenantPluginsLoaded, getPluginPatterns } from '@oktis-works/core';
10
+ import { authMiddleware, requirePermission } from '../../middleware/auth.js';
11
+ import { isPluginActive } from '../plugins/extensions.js';
12
+ import { addPluginPatterns } from './catalog.js';
13
+ const patterns = new Hono();
14
+ patterns.use('*', authMiddleware);
15
+ // GET /patterns — pattern catalog for the editor (manifest + runtime, no table)
16
+ patterns.get('/', requirePermission('read', 'content'), async (c) => {
17
+ try {
18
+ const userRoles = c.get('userRoles');
19
+ const sessionTenant = c.get('tenantId');
20
+ const tenantId = userRoles.includes('SUPER_ADMIN') ? c.req.query('tenantId') ?? sessionTenant : sessionTenant;
21
+ const catalog = [];
22
+ const rows = await pluginService.list(tenantId);
23
+ for (const row of rows) {
24
+ if (!isPluginActive(row.status))
25
+ continue;
26
+ addPluginPatterns(catalog, row.manifest?.patterns, row.name, 'manifest');
27
+ }
28
+ // Runtime registrations — best-effort: keep serving the manifest when the
29
+ // runtime is unavailable (mirrors GET /plugins/extensions).
30
+ if (tenantId) {
31
+ try {
32
+ await ensureTenantPluginsLoaded(tenantId);
33
+ }
34
+ catch {
35
+ // runtime unavailable — manifest-only catalog
36
+ }
37
+ }
38
+ for (const entry of await getPluginPatterns(null)) {
39
+ addPluginPatterns(catalog, entry.patterns, entry.pluginName, 'runtime');
40
+ }
41
+ if (tenantId) {
42
+ for (const entry of await getPluginPatterns(tenantId)) {
43
+ addPluginPatterns(catalog, entry.patterns, entry.pluginName, 'runtime');
44
+ }
45
+ }
46
+ return c.json({ patterns: catalog });
47
+ }
48
+ catch (error) {
49
+ const message = error instanceof Error ? error.message : 'Failed to collect pattern catalog';
50
+ return c.json({ error: message }, 500);
51
+ }
52
+ });
53
+ export default patterns;
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/patterns/index.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,EAAE;AACF,uEAAuE;AACvE,8DAA8D;AAC9D,4EAA4E;AAC5E,sEAAsE;AACtE,4DAA4D;AAE5D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAC3B,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/F,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAE5E,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,iBAAiB,EAA4B,MAAM,cAAc,CAAA;AAE1E,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAA;AAE3B,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;AAEjC,gFAAgF;AAChF,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,CAAA;QACpC,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,aAAa,CAAA;QAE7G,MAAM,OAAO,GAA0B,EAAE,CAAA;QAEzC,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC/C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,SAAQ;YACzC,iBAAiB,CAAC,OAAO,EAAG,GAAG,CAAC,QAA8C,EAAE,QAAQ,EAAE,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;QACjH,CAAC;QAED,0EAA0E;QAC1E,4DAA4D;QAC5D,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,MAAM,yBAAyB,CAAC,QAAQ,CAAC,CAAA;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClD,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;QACzE,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,KAAK,IAAI,MAAM,iBAAiB,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;QAED,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC,CAAA;QAC5F,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,QAAQ,CAAA"}
@@ -0,0 +1,15 @@
1
+ import type { AdminExtensionsState, PluginManifestAdmin } from '@oktis-works/types';
2
+ /** Statuses where the plugin actually runs (bootstrap enabledStatuses). */
3
+ export declare function isPluginActive(status: string | undefined | null): boolean;
4
+ export declare function emptyAdminExtensionsState(): AdminExtensionsState;
5
+ /**
6
+ * Converts the manifest `admin` block (flat columns/notices/editors form)
7
+ * into the endpoint state format. Namespacing/dedupe happen in the merge.
8
+ */
9
+ export declare function manifestAdminAsState(decl: PluginManifestAdmin): AdminExtensionsState;
10
+ /**
11
+ * Merges ONE plugin's state (normalized manifest or runtime) into the
12
+ * aggregated state, applying namespacing and dedupe by id/slug/key.
13
+ */
14
+ export declare function mergePluginAdminState(target: AdminExtensionsState, source: AdminExtensionsState, pluginName: string): void;
15
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../../src/routes/plugins/extensions.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAEnF,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,OAAO,CAEzE;AAED,wBAAgB,yBAAyB,IAAI,oBAAoB,CAYhE;AAgBD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,mBAAmB,GAAG,oBAAoB,CAoEpF;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,CA4E1H"}
@@ -0,0 +1,196 @@
1
+ // @oktis-works/api - Admin UI extension state (FEAT-098 / DECI-027)
2
+ //
3
+ // `GET /plugins/extensions` merges two sources into a single AdminExtensionsState:
4
+ // 1. `manifest.admin` — static declarations persisted in plugins.manifest;
5
+ // 2. `api.admin.*` — runtime registrations from the plugin bootstrap
6
+ // (platform + tenant scopes).
7
+ //
8
+ // Namespacing: ids/slugs/componentIds get the plugin prefix (`plugin/`,
9
+ // `plugin:`) when the author does not provide one — two plugins never collide
10
+ // in a slot. Manifest validation (plugin-runtime/manifest.ts) requires
11
+ // capability on menus; the same rules are re-applied defensively here (the
12
+ // endpoint must never break on malformed rows coming from the database).
13
+ /** Statuses where the plugin actually runs (bootstrap enabledStatuses). */
14
+ export function isPluginActive(status) {
15
+ return status === 'ACTIVATED' || status === 'RUNNING';
16
+ }
17
+ export function emptyAdminExtensionsState() {
18
+ return {
19
+ menuPages: [],
20
+ submenuPages: [],
21
+ dashboardWidgets: [],
22
+ metaBoxes: [],
23
+ notices: [],
24
+ columns: {},
25
+ columnRenderers: {},
26
+ actionLinks: [],
27
+ editors: [],
28
+ };
29
+ }
30
+ /** `plugin:Component` or full paths (`@/...`, `.../x.tsx`) stay untouched. */
31
+ function componentIdFor(slug, componentId) {
32
+ if (componentId.startsWith('@') || componentId.includes('/'))
33
+ return componentId;
34
+ return componentId.includes(':') ? componentId : `${slug}:${componentId}`;
35
+ }
36
+ function idFor(slug, id) {
37
+ return id.includes(':') ? id : `${slug}:${id}`;
38
+ }
39
+ function menuSlugFor(slug, value) {
40
+ return value.startsWith(`${slug}/`) ? value : `${slug}/${value}`;
41
+ }
42
+ /**
43
+ * Converts the manifest `admin` block (flat columns/notices/editors form)
44
+ * into the endpoint state format. Namespacing/dedupe happen in the merge.
45
+ */
46
+ export function manifestAdminAsState(decl) {
47
+ const state = emptyAdminExtensionsState();
48
+ state.menuPages = (decl.menuPages ?? []).filter((page) => typeof page?.slug === 'string' && typeof page?.label === 'string' && typeof page?.capability === 'string' && page.capability.length > 0);
49
+ state.submenuPages = (decl.submenuPages ?? []).filter((page) => typeof page?.slug === 'string' &&
50
+ typeof page?.label === 'string' &&
51
+ typeof page?.parentSlug === 'string' &&
52
+ typeof page?.capability === 'string' &&
53
+ page.capability.length > 0);
54
+ state.dashboardWidgets = (decl.dashboardWidgets ?? [])
55
+ .filter((widget) => typeof widget?.id === 'string' && typeof widget?.title === 'string' && typeof widget?.componentId === 'string')
56
+ .map((widget) => ({ ...widget, render: 'component' }));
57
+ state.metaBoxes = (decl.metaBoxes ?? [])
58
+ .filter((box) => typeof box?.id === 'string' &&
59
+ typeof box?.title === 'string' &&
60
+ typeof box?.componentId === 'string' &&
61
+ Array.isArray(box.screens) &&
62
+ box.screens.length > 0)
63
+ .map((box) => ({
64
+ ...box,
65
+ context: box.context ?? 'normal',
66
+ priority: box.priority ?? 'default',
67
+ }));
68
+ state.notices = (decl.notices ?? [])
69
+ .filter((notice) => typeof notice?.message === 'string')
70
+ .map((notice, index) => ({
71
+ level: notice.level ?? 'info',
72
+ message: notice.message,
73
+ dismissible: notice.dismissible,
74
+ id: notice.id ?? `m${index}`,
75
+ }));
76
+ state.editors = (decl.editors ?? []).filter((editor) => typeof editor?.id === 'string' &&
77
+ typeof editor?.componentId === 'string' &&
78
+ Array.isArray(editor.screens) &&
79
+ editor.screens.length > 0 &&
80
+ (editor.mode === 'replace-body' || editor.mode === 'below'));
81
+ for (const column of decl.columns ?? []) {
82
+ if (typeof column?.contentType !== 'string' || typeof column?.key !== 'string' || typeof column?.label !== 'string')
83
+ continue;
84
+ const list = state.columns[column.contentType] ?? [];
85
+ if (!list.some((existing) => existing.key === column.key)) {
86
+ list.push({ key: column.key, label: column.label, position: column.position });
87
+ state.columns[column.contentType] = list;
88
+ }
89
+ }
90
+ for (const renderer of decl.columnRenderers ?? []) {
91
+ if (typeof renderer?.contentType !== 'string' || typeof renderer?.key !== 'string' || typeof renderer?.componentId !== 'string')
92
+ continue;
93
+ state.columnRenderers[renderer.contentType] = {
94
+ ...(state.columnRenderers[renderer.contentType] ?? {}),
95
+ [renderer.key]: renderer.componentId,
96
+ };
97
+ }
98
+ state.actionLinks = (decl.actionLinks ?? []).filter((link) => typeof link?.label === 'string' && typeof link?.url === 'string');
99
+ return state;
100
+ }
101
+ /**
102
+ * Merges ONE plugin's state (normalized manifest or runtime) into the
103
+ * aggregated state, applying namespacing and dedupe by id/slug/key.
104
+ */
105
+ export function mergePluginAdminState(target, source, pluginName) {
106
+ const slug = pluginName;
107
+ for (const page of source.menuPages) {
108
+ if (!page?.capability)
109
+ continue;
110
+ const prefixed = menuSlugFor(slug, page.slug);
111
+ if (!target.menuPages.some((existing) => existing.slug === prefixed)) {
112
+ target.menuPages.push({ ...page, slug: prefixed });
113
+ }
114
+ }
115
+ for (const page of source.submenuPages) {
116
+ if (!page?.capability)
117
+ continue;
118
+ const parentSlug = menuSlugFor(slug, page.parentSlug);
119
+ const prefixed = menuSlugFor(slug, page.slug);
120
+ if (!target.submenuPages.some((existing) => existing.slug === prefixed)) {
121
+ target.submenuPages.push({ ...page, parentSlug, slug: prefixed });
122
+ }
123
+ }
124
+ for (const widget of source.dashboardWidgets) {
125
+ if (!widget?.id || !widget?.title || !widget?.componentId)
126
+ continue;
127
+ const id = idFor(slug, widget.id);
128
+ if (target.dashboardWidgets.some((existing) => existing.id === id))
129
+ continue;
130
+ target.dashboardWidgets.push({
131
+ ...widget,
132
+ id,
133
+ render: 'component',
134
+ componentId: componentIdFor(slug, widget.componentId),
135
+ });
136
+ }
137
+ for (const box of source.metaBoxes) {
138
+ if (!box?.id || !box?.title || !box?.componentId || !Array.isArray(box.screens) || box.screens.length === 0)
139
+ continue;
140
+ const id = idFor(slug, box.id);
141
+ if (target.metaBoxes.some((existing) => existing.id === id))
142
+ continue;
143
+ target.metaBoxes.push({
144
+ ...box,
145
+ id,
146
+ context: box.context ?? 'normal',
147
+ priority: box.priority ?? 'default',
148
+ componentId: componentIdFor(slug, box.componentId),
149
+ });
150
+ }
151
+ for (const notice of source.notices) {
152
+ if (!notice?.message || !notice?.id)
153
+ continue;
154
+ const id = idFor(slug, notice.id);
155
+ if (target.notices.some((existing) => existing.id === id))
156
+ continue;
157
+ target.notices.push({ ...notice, id });
158
+ }
159
+ for (const editor of source.editors ?? []) {
160
+ if (!editor?.id || !editor?.componentId || !Array.isArray(editor.screens) || editor.screens.length === 0)
161
+ continue;
162
+ if (editor.mode !== 'replace-body' && editor.mode !== 'below')
163
+ continue;
164
+ const id = idFor(slug, editor.id);
165
+ if (target.editors.some((existing) => existing.id === id))
166
+ continue;
167
+ target.editors.push({ ...editor, id, componentId: componentIdFor(slug, editor.componentId) });
168
+ }
169
+ for (const [contentType, columns] of Object.entries(source.columns ?? {})) {
170
+ const list = target.columns[contentType] ?? [];
171
+ for (const column of columns) {
172
+ if (!column?.key || !column?.label)
173
+ continue;
174
+ if (!list.some((existing) => existing.key === column.key))
175
+ list.push(column);
176
+ }
177
+ target.columns[contentType] = list;
178
+ }
179
+ for (const [contentType, renderers] of Object.entries(source.columnRenderers ?? {})) {
180
+ const merged = { ...(target.columnRenderers[contentType] ?? {}) };
181
+ for (const [key, componentId] of Object.entries(renderers)) {
182
+ if (!componentId)
183
+ continue;
184
+ merged[key] = componentIdFor(slug, componentId);
185
+ }
186
+ target.columnRenderers[contentType] = merged;
187
+ }
188
+ for (const link of source.actionLinks ?? []) {
189
+ if (!link?.label || !link?.url)
190
+ continue;
191
+ if (!target.actionLinks.some((existing) => existing.url === link.url && existing.label === link.label)) {
192
+ target.actionLinks.push(link);
193
+ }
194
+ }
195
+ }
196
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../src/routes/plugins/extensions.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/plugins/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAK3B,QAAA,MAAM,OAAO,4EAAa,CAAA;AAoK1B,eAAe,OAAO,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/plugins/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAO3B,QAAA,MAAM,OAAO,4EAAa,CAAA;AAgN1B,eAAe,OAAO,CAAA"}
@@ -6,9 +6,10 @@
6
6
  // - Só SUPER_ADMIN instala/ativa/desativa/desinstala; TENANT_ADMIN só lê
7
7
  // - Operações de vínculo correm em runWithTenantTransaction(tenantId) p/ RLS
8
8
  import { Hono } from 'hono';
9
- import { pluginService, syncEnabledPlugins, ensureTenantPluginsLoaded, getPluginsRuntimeState } from '@oktis-works/core';
9
+ import { pluginService, syncEnabledPlugins, ensureTenantPluginsLoaded, getPluginsRuntimeState, getPluginAdminExtensions } from '@oktis-works/core';
10
10
  import { authMiddleware, requirePermission } from '../../middleware/auth.js';
11
11
  import { runWithTenantTransaction } from '@oktis-works/database';
12
+ import { emptyAdminExtensionsState, isPluginActive, manifestAdminAsState, mergePluginAdminState } from './extensions.js';
12
13
  const plugins = new Hono();
13
14
  plugins.use('*', authMiddleware);
14
15
  // GET /plugins — lista artefatos com flag `enabled` do tenant da sessão
@@ -37,6 +38,49 @@ plugins.get('/runtime', requirePermission('read', 'plugin'), async (c) => {
37
38
  return c.json({ error: message }, 500);
38
39
  }
39
40
  });
41
+ // GET /plugins/extensions — estado declarativo agregado dos slots de admin
42
+ // (FEAT-098 / DECI-027): manifest.admin (ativo para o tenant) + api.admin.*
43
+ // registrado em runtime (escopo platform + tenant). O admin renderiza os slots
44
+ // a partir deste payload; capability gating de menu acontece no cliente.
45
+ plugins.get('/extensions', requirePermission('read', 'plugin'), async (c) => {
46
+ try {
47
+ const userRoles = c.get('userRoles');
48
+ const sessionTenant = c.get('tenantId');
49
+ const tenantId = userRoles.includes('SUPER_ADMIN') ? c.req.query('tenantId') ?? sessionTenant : sessionTenant;
50
+ const state = emptyAdminExtensionsState();
51
+ const rows = await pluginService.list(tenantId);
52
+ for (const row of rows) {
53
+ if (!isPluginActive(row.status))
54
+ continue;
55
+ const adminDecl = row.manifest?.admin;
56
+ if (adminDecl)
57
+ mergePluginAdminState(state, manifestAdminAsState(adminDecl), row.name);
58
+ }
59
+ // Runtime (api.admin.*): best-effort — garante o escopo do tenant carregado;
60
+ // falha não derruba o endpoint (o manifesto segue válido sozinho).
61
+ if (tenantId) {
62
+ try {
63
+ await ensureTenantPluginsLoaded(tenantId);
64
+ }
65
+ catch {
66
+ // runtime indisponível — segue só com o manifesto
67
+ }
68
+ }
69
+ for (const entry of await getPluginAdminExtensions(null)) {
70
+ mergePluginAdminState(state, entry.state, entry.pluginName);
71
+ }
72
+ if (tenantId) {
73
+ for (const entry of await getPluginAdminExtensions(tenantId)) {
74
+ mergePluginAdminState(state, entry.state, entry.pluginName);
75
+ }
76
+ }
77
+ return c.json(state);
78
+ }
79
+ catch (error) {
80
+ const message = error instanceof Error ? error.message : 'Failed to collect admin extensions';
81
+ return c.json({ error: message }, 500);
82
+ }
83
+ });
40
84
  // POST /plugins/:id/tenants/:tenantId — habilita plugin para um tenant (SUPER_ADMIN)
41
85
  plugins.post('/:id/tenants/:tenantId', requirePermission('update', 'plugin'), async (c) => {
42
86
  const userRoles = c.get('userRoles');
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/plugins/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/plugins/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/webhooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAM5B,QAAA,MAAM,MAAM,4EAAa,CAAC;AA6J1B,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/webhooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,QAAA,MAAM,MAAM,4EAAa,CAAC;AA0M1B,eAAe,MAAM,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { Hono } from 'hono';
2
2
  import { randomUUID } from 'node:crypto';
3
3
  import { getConnection } from '@oktis-works/database';
4
+ import { webhookSecretService } from '@oktis-works/core';
4
5
  import { WEBHOOK_EVENT_TYPES } from '@oktis-works/types';
5
6
  import { authMiddleware, requirePermission } from '../../middleware/auth.js';
6
7
  const router = new Hono();
@@ -128,6 +129,51 @@ router.put('/:id', requirePermission('update', 'webhook'), async (c) => {
128
129
  return c.json({ error: message }, 400);
129
130
  }
130
131
  });
132
+ // POST /webhooks/:id/rotate — Item 19: nova versão de secret; a anterior fica
133
+ // registrada com rotated_at (janela de graça de 24h para o consumidor trocar
134
+ // a chave). O novo secret é devolvido EXATAMENTE uma vez nesta resposta.
135
+ router.post('/:id/rotate', requirePermission('update', 'webhook'), async (c) => {
136
+ try {
137
+ const id = c.req.param('id');
138
+ const tenantId = String(c.get('tenantId') ?? 'default');
139
+ const sql = getConnection();
140
+ const owned = await sql.unsafe('SELECT id FROM webhooks WHERE id = $1 AND tenant_id = $2', [id, tenantId]);
141
+ if (!owned[0])
142
+ return c.json({ error: 'Webhook not found' }, 404);
143
+ const rotated = await webhookSecretService.rotate(id);
144
+ if (!rotated)
145
+ return c.json({ error: 'Webhook not found' }, 404);
146
+ return c.json({
147
+ id: rotated.id,
148
+ webhookId: rotated.webhookId,
149
+ version: rotated.version,
150
+ secret: rotated.secret,
151
+ graceHours: 24,
152
+ note: 'Store this secret now — it is never listed again. The previous version stays valid for consumers during the 24h grace window.',
153
+ }, 201);
154
+ }
155
+ catch (error) {
156
+ const message = error instanceof Error ? error.message : 'Failed to rotate webhook secret';
157
+ return c.json({ error: message }, 500);
158
+ }
159
+ });
160
+ // GET /webhooks/:id/secrets — histórico de versões SEM os segredos
161
+ router.get('/:id/secrets', requirePermission('read', 'webhook'), async (c) => {
162
+ try {
163
+ const id = c.req.param('id');
164
+ const tenantId = String(c.get('tenantId') ?? 'default');
165
+ const sql = getConnection();
166
+ const owned = await sql.unsafe('SELECT id FROM webhooks WHERE id = $1 AND tenant_id = $2', [id, tenantId]);
167
+ if (!owned[0])
168
+ return c.json({ error: 'Webhook not found' }, 404);
169
+ const versions = await webhookSecretService.listVersions(id);
170
+ return c.json({ versions });
171
+ }
172
+ catch (error) {
173
+ const message = error instanceof Error ? error.message : 'Failed to list webhook secret versions';
174
+ return c.json({ error: message }, 500);
175
+ }
176
+ });
131
177
  router.delete('/:id', requirePermission('delete', 'webhook'), async (c) => {
132
178
  const id = c.req.param('id');
133
179
  const sql = getConnection();