@oktis-works/api 0.0.0-stage → 0.1.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +170 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/auth.d.ts +8 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/auth.js +32 -0
- package/dist/middleware/auth.js.map +1 -0
- package/dist/middleware/csrf.d.ts +13 -0
- package/dist/middleware/csrf.d.ts.map +1 -0
- package/dist/middleware/csrf.js +64 -0
- package/dist/middleware/csrf.js.map +1 -0
- package/dist/middleware/csrf.test.d.ts +2 -0
- package/dist/middleware/csrf.test.d.ts.map +1 -0
- package/dist/middleware/csrf.test.js +94 -0
- package/dist/middleware/csrf.test.js.map +1 -0
- package/dist/middleware/rate-limit.d.ts +18 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/rate-limit.js +58 -0
- package/dist/middleware/rate-limit.js.map +1 -0
- package/dist/middleware/rate-limit.test.d.ts +2 -0
- package/dist/middleware/rate-limit.test.d.ts.map +1 -0
- package/dist/middleware/rate-limit.test.js +58 -0
- package/dist/middleware/rate-limit.test.js.map +1 -0
- package/dist/middleware/trace.d.ts +7 -0
- package/dist/middleware/trace.d.ts.map +1 -0
- package/dist/middleware/trace.js +14 -0
- package/dist/middleware/trace.js.map +1 -0
- package/dist/middleware/trace.test.d.ts +2 -0
- package/dist/middleware/trace.test.d.ts.map +1 -0
- package/dist/middleware/trace.test.js +27 -0
- package/dist/middleware/trace.test.js.map +1 -0
- package/dist/routes/audit-logs/index.d.ts +4 -0
- package/dist/routes/audit-logs/index.d.ts.map +1 -0
- package/dist/routes/audit-logs/index.js +19 -0
- package/dist/routes/audit-logs/index.js.map +1 -0
- package/dist/routes/auth/index.d.ts +4 -0
- package/dist/routes/auth/index.d.ts.map +1 -0
- package/dist/routes/auth/index.js +84 -0
- package/dist/routes/auth/index.js.map +1 -0
- package/dist/routes/auth/me.d.ts +4 -0
- package/dist/routes/auth/me.d.ts.map +1 -0
- package/dist/routes/auth/me.js +16 -0
- package/dist/routes/auth/me.js.map +1 -0
- package/dist/routes/categories/index.d.ts +4 -0
- package/dist/routes/categories/index.d.ts.map +1 -0
- package/dist/routes/categories/index.js +53 -0
- package/dist/routes/categories/index.js.map +1 -0
- package/dist/routes/content/index.d.ts +4 -0
- package/dist/routes/content/index.d.ts.map +1 -0
- package/dist/routes/content/index.js +83 -0
- package/dist/routes/content/index.js.map +1 -0
- package/dist/routes/content-types/index.d.ts +4 -0
- package/dist/routes/content-types/index.d.ts.map +1 -0
- package/dist/routes/content-types/index.js +70 -0
- package/dist/routes/content-types/index.js.map +1 -0
- package/dist/routes/deployments/index.d.ts +4 -0
- package/dist/routes/deployments/index.d.ts.map +1 -0
- package/dist/routes/deployments/index.js +52 -0
- package/dist/routes/deployments/index.js.map +1 -0
- package/dist/routes/docs/index.d.ts +4 -0
- package/dist/routes/docs/index.d.ts.map +1 -0
- package/dist/routes/docs/index.js +120 -0
- package/dist/routes/docs/index.js.map +1 -0
- package/dist/routes/events/index.d.ts +4 -0
- package/dist/routes/events/index.d.ts.map +1 -0
- package/dist/routes/events/index.js +28 -0
- package/dist/routes/events/index.js.map +1 -0
- package/dist/routes/field-groups/index.d.ts +4 -0
- package/dist/routes/field-groups/index.d.ts.map +1 -0
- package/dist/routes/field-groups/index.js +77 -0
- package/dist/routes/field-groups/index.js.map +1 -0
- package/dist/routes/field-types/index.d.ts +4 -0
- package/dist/routes/field-types/index.d.ts.map +1 -0
- package/dist/routes/field-types/index.js +21 -0
- package/dist/routes/field-types/index.js.map +1 -0
- package/dist/routes/health/index.d.ts +4 -0
- package/dist/routes/health/index.d.ts.map +1 -0
- package/dist/routes/health/index.js +32 -0
- package/dist/routes/health/index.js.map +1 -0
- package/dist/routes/hooks/index.d.ts +4 -0
- package/dist/routes/hooks/index.d.ts.map +1 -0
- package/dist/routes/hooks/index.js +11 -0
- package/dist/routes/hooks/index.js.map +1 -0
- package/dist/routes/media/index.d.ts +4 -0
- package/dist/routes/media/index.d.ts.map +1 -0
- package/dist/routes/media/index.js +51 -0
- package/dist/routes/media/index.js.map +1 -0
- package/dist/routes/menus/index.d.ts +4 -0
- package/dist/routes/menus/index.d.ts.map +1 -0
- package/dist/routes/menus/index.js +58 -0
- package/dist/routes/menus/index.js.map +1 -0
- package/dist/routes/metrics/index.d.ts +4 -0
- package/dist/routes/metrics/index.d.ts.map +1 -0
- package/dist/routes/metrics/index.js +31 -0
- package/dist/routes/metrics/index.js.map +1 -0
- package/dist/routes/metrics/index.test.d.ts +2 -0
- package/dist/routes/metrics/index.test.d.ts.map +1 -0
- package/dist/routes/metrics/index.test.js +64 -0
- package/dist/routes/metrics/index.test.js.map +1 -0
- package/dist/routes/pages/index.d.ts +3 -0
- package/dist/routes/pages/index.d.ts.map +1 -0
- package/dist/routes/pages/index.js +6 -0
- package/dist/routes/pages/index.js.map +1 -0
- package/dist/routes/plugins/index.d.ts +4 -0
- package/dist/routes/plugins/index.d.ts.map +1 -0
- package/dist/routes/plugins/index.js +65 -0
- package/dist/routes/plugins/index.js.map +1 -0
- package/dist/routes/posts/index.d.ts +3 -0
- package/dist/routes/posts/index.d.ts.map +1 -0
- package/dist/routes/posts/index.js +6 -0
- package/dist/routes/posts/index.js.map +1 -0
- package/dist/routes/posts/revisions.test.d.ts +2 -0
- package/dist/routes/posts/revisions.test.d.ts.map +1 -0
- package/dist/routes/posts/revisions.test.js +57 -0
- package/dist/routes/posts/revisions.test.js.map +1 -0
- package/dist/routes/roles/index.d.ts +4 -0
- package/dist/routes/roles/index.d.ts.map +1 -0
- package/dist/routes/roles/index.js +56 -0
- package/dist/routes/roles/index.js.map +1 -0
- package/dist/routes/settings/index.d.ts +4 -0
- package/dist/routes/settings/index.d.ts.map +1 -0
- package/dist/routes/settings/index.js +29 -0
- package/dist/routes/settings/index.js.map +1 -0
- package/dist/routes/shared/content-collection.d.ts +9 -0
- package/dist/routes/shared/content-collection.d.ts.map +1 -0
- package/dist/routes/shared/content-collection.js +104 -0
- package/dist/routes/shared/content-collection.js.map +1 -0
- package/dist/routes/tags/index.d.ts +4 -0
- package/dist/routes/tags/index.d.ts.map +1 -0
- package/dist/routes/tags/index.js +32 -0
- package/dist/routes/tags/index.js.map +1 -0
- package/dist/routes/taxonomies/index.d.ts +4 -0
- package/dist/routes/taxonomies/index.d.ts.map +1 -0
- package/dist/routes/taxonomies/index.js +114 -0
- package/dist/routes/taxonomies/index.js.map +1 -0
- package/dist/routes/tenants/index.d.ts +4 -0
- package/dist/routes/tenants/index.d.ts.map +1 -0
- package/dist/routes/tenants/index.js +66 -0
- package/dist/routes/tenants/index.js.map +1 -0
- package/dist/routes/themes/index.d.ts +4 -0
- package/dist/routes/themes/index.d.ts.map +1 -0
- package/dist/routes/themes/index.js +54 -0
- package/dist/routes/themes/index.js.map +1 -0
- package/dist/routes/users/index.d.ts +4 -0
- package/dist/routes/users/index.d.ts.map +1 -0
- package/dist/routes/users/index.js +66 -0
- package/dist/routes/users/index.js.map +1 -0
- package/dist/routes/webhooks/index.d.ts +4 -0
- package/dist/routes/webhooks/index.d.ts.map +1 -0
- package/dist/routes/webhooks/index.js +30 -0
- package/dist/routes/webhooks/index.js.map +1 -0
- package/package.json +43 -4
- package/README.md +0 -3
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
// @oktis-works/api - OpenAPI 3.1 document (rest-api-004 / maintainability-003)
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { CMS_VERSION } from '@oktis-works/validation';
|
|
4
|
+
const router = new Hono();
|
|
5
|
+
const RESOURCES = [
|
|
6
|
+
['auth', 'Autenticação e sessões'],
|
|
7
|
+
['users', 'Usuários'],
|
|
8
|
+
['tenants', 'Tenants (multi-tenant isolation)'],
|
|
9
|
+
['roles', 'Papéis e permissões (RBAC)'],
|
|
10
|
+
['media', 'Biblioteca de mídia'],
|
|
11
|
+
['content', 'Conteúdo polimórfico'],
|
|
12
|
+
['posts', 'Posts'],
|
|
13
|
+
['pages', 'Páginas'],
|
|
14
|
+
['categories', 'Categorias'],
|
|
15
|
+
['tags', 'Tags'],
|
|
16
|
+
['menus', 'Menus de navegação'],
|
|
17
|
+
['settings', 'Configurações agrupadas'],
|
|
18
|
+
['plugins', 'Plugins — ciclo de vida'],
|
|
19
|
+
['themes', 'Temas — ciclo de vida'],
|
|
20
|
+
['deployments', 'Deployments (build & deploy)'],
|
|
21
|
+
['events', 'Eventos de domínio'],
|
|
22
|
+
['webhooks', 'Webhooks assináveis'],
|
|
23
|
+
['content-types', 'Content Types'],
|
|
24
|
+
['taxonomies', 'Taxonomias'],
|
|
25
|
+
['field-groups', 'Field Groups + location rules'],
|
|
26
|
+
['field-types', 'Field Types do builder'],
|
|
27
|
+
['health', 'Health checks'],
|
|
28
|
+
['metrics', 'Métricas Prometheus'],
|
|
29
|
+
['audit-logs', 'Trilha de auditoria imutável'],
|
|
30
|
+
];
|
|
31
|
+
function buildOpenApiDocument(origin) {
|
|
32
|
+
const paths = {
|
|
33
|
+
'/api/v1/docs': {
|
|
34
|
+
get: {
|
|
35
|
+
summary: 'Este documento (OpenAPI 3.1)',
|
|
36
|
+
tags: ['meta'],
|
|
37
|
+
responses: { '200': { description: 'Documento OpenAPI' } },
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
'/api/v1/hooks/catalog': {
|
|
41
|
+
get: {
|
|
42
|
+
summary: 'Catálogo de hooks gerado a partir do registry',
|
|
43
|
+
tags: ['meta'],
|
|
44
|
+
responses: { '200': { description: 'Lista de hooks conhecidos e registrados' } },
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
for (const [resource, description] of RESOURCES) {
|
|
49
|
+
paths[`/api/v1/${resource}`] = {
|
|
50
|
+
get: {
|
|
51
|
+
summary: `Listar ${description}`,
|
|
52
|
+
tags: [resource],
|
|
53
|
+
parameters: [
|
|
54
|
+
{ name: 'X-Tenant-ID', in: 'header', schema: { type: 'string' }, description: 'Escopo multi-tenant' },
|
|
55
|
+
],
|
|
56
|
+
responses: {
|
|
57
|
+
'200': { description: 'Coleção retornada' },
|
|
58
|
+
'401': { description: 'Não autenticado' },
|
|
59
|
+
'429': { description: 'Rate limit excedido (Retry-After)' },
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
post: {
|
|
63
|
+
summary: `Criar em ${resource}`,
|
|
64
|
+
tags: [resource],
|
|
65
|
+
security: [{ bearerAuth: [] }],
|
|
66
|
+
responses: {
|
|
67
|
+
'201': { description: 'Criado' },
|
|
68
|
+
'403': { description: 'Sem permissão ou CSRF inválido' },
|
|
69
|
+
'429': { description: 'Rate limit excedido' },
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
paths[`/api/v1/${resource}/{id}`] = {
|
|
74
|
+
parameters: [{ name: 'id', in: 'path', required: true, schema: { type: 'string' } }],
|
|
75
|
+
get: {
|
|
76
|
+
summary: `Detalhar ${description}`,
|
|
77
|
+
tags: [resource],
|
|
78
|
+
responses: { '200': { description: 'Registro' }, '404': { description: 'Não encontrado' } },
|
|
79
|
+
},
|
|
80
|
+
put: {
|
|
81
|
+
summary: `Substituir registro em ${resource}`,
|
|
82
|
+
tags: [resource],
|
|
83
|
+
security: [{ bearerAuth: [] }],
|
|
84
|
+
responses: { '200': { description: 'Atualizado' }, '403': { description: 'Proibido' } },
|
|
85
|
+
},
|
|
86
|
+
delete: {
|
|
87
|
+
summary: `Remover registro em ${resource}`,
|
|
88
|
+
tags: [resource],
|
|
89
|
+
security: [{ bearerAuth: [] }],
|
|
90
|
+
responses: { '204': { description: 'Removido' }, '403': { description: 'Proibido' } },
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
openapi: '3.1.0',
|
|
96
|
+
info: {
|
|
97
|
+
title: 'OkCMS API',
|
|
98
|
+
version: CMS_VERSION,
|
|
99
|
+
description: 'CMS híbrido, modular e API-first. Autenticação JWT Bearer; clientes browser também devem enviar o par CSRF (cookie bl_csrf + header X-CSRF-Token). Rate limit padrão: 300 req/min por tenant+IP.',
|
|
100
|
+
},
|
|
101
|
+
servers: [{ url: origin }],
|
|
102
|
+
components: {
|
|
103
|
+
securitySchemes: {
|
|
104
|
+
bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'JWT' },
|
|
105
|
+
csrfHeader: { type: 'apiKey', in: 'header', name: 'X-CSRF-Token' },
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
tags: [
|
|
109
|
+
...RESOURCES.map(([resource, description]) => ({ name: resource, description })),
|
|
110
|
+
{ name: 'meta', description: 'Descoberta (docs, catálogo de hooks)' },
|
|
111
|
+
],
|
|
112
|
+
paths,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
router.get('/', (c) => {
|
|
116
|
+
const origin = new URL(c.req.url).origin;
|
|
117
|
+
return c.json(buildOpenApiDocument(origin));
|
|
118
|
+
});
|
|
119
|
+
export default router;
|
|
120
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/docs/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AA8B1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { getConnection } from '@oktis-works/database';
|
|
3
|
+
import { authMiddleware } from '../../middleware/auth.js';
|
|
4
|
+
const router = new Hono();
|
|
5
|
+
router.use('*', authMiddleware);
|
|
6
|
+
router.get('/', async (c) => {
|
|
7
|
+
const page = Number(c.req.query('page') ?? 1);
|
|
8
|
+
const limit = Number(c.req.query('limit') ?? 50);
|
|
9
|
+
const type = c.req.query('type') || undefined;
|
|
10
|
+
const offset = (page - 1) * limit;
|
|
11
|
+
const sql = getConnection();
|
|
12
|
+
let whereClause = 'WHERE 1=1';
|
|
13
|
+
const params = [];
|
|
14
|
+
if (type) {
|
|
15
|
+
whereClause += ` AND type = $${params.length + 1}`;
|
|
16
|
+
params.push(type);
|
|
17
|
+
}
|
|
18
|
+
const [data, countData] = await Promise.all([
|
|
19
|
+
sql.unsafe(`SELECT * FROM events ${whereClause} ORDER BY created_at DESC LIMIT ${limit} OFFSET ${offset}`, params),
|
|
20
|
+
sql.unsafe(`SELECT COUNT(*) as total FROM events ${whereClause}`, params),
|
|
21
|
+
]);
|
|
22
|
+
return c.json({
|
|
23
|
+
data,
|
|
24
|
+
total: Number(countData[0]?.['total'] ?? 0),
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
export default router;
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;AAE1B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;AAEhC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;IAC9C,MAAM,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;IAElC,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAE5B,IAAI,WAAW,GAAG,WAAW,CAAC;IAC9B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,IAAI,EAAE,CAAC;QACT,WAAW,IAAI,gBAAgB,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1C,GAAG,CAAC,MAAM,CAAC,wBAAwB,WAAW,mCAAmC,KAAK,WAAW,MAAM,EAAE,EAAE,MAAM,CAAC;QAClH,GAAG,CAAC,MAAM,CAAC,wCAAwC,WAAW,EAAE,EAAE,MAAM,CAAC;KAC1E,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,IAAI;QACJ,KAAK,EAAE,MAAM,CAAE,SAAS,CAAC,CAAC,CAA6B,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KACzE,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/field-groups/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAyE1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// @oktis-works/api - Field Groups Routes (Builder + Location Rules)
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { fieldGroupService } from '@oktis-works/core';
|
|
4
|
+
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
5
|
+
const router = new Hono();
|
|
6
|
+
router.use('*', authMiddleware);
|
|
7
|
+
router.get('/', requirePermission('read', 'content'), async (c) => {
|
|
8
|
+
const type = c.req.query('type');
|
|
9
|
+
if (type) {
|
|
10
|
+
const resolved = await fieldGroupService.resolveGroupsByLocation({
|
|
11
|
+
contentType: type,
|
|
12
|
+
taxonomy: c.req.query('taxonomy') || undefined,
|
|
13
|
+
termSlug: c.req.query('term') || undefined,
|
|
14
|
+
userRole: c.req.query('userRole') || undefined,
|
|
15
|
+
pageTemplate: c.req.query('template') || undefined,
|
|
16
|
+
postStatus: c.req.query('status') || undefined,
|
|
17
|
+
});
|
|
18
|
+
return c.json(resolved);
|
|
19
|
+
}
|
|
20
|
+
const result = await fieldGroupService.list();
|
|
21
|
+
return c.json(result);
|
|
22
|
+
});
|
|
23
|
+
router.get('/:id', requirePermission('read', 'content'), async (c) => {
|
|
24
|
+
const id = c.req.param('id');
|
|
25
|
+
const result = await fieldGroupService.getById(id);
|
|
26
|
+
if (!result)
|
|
27
|
+
return c.json({ error: 'Field group not found' }, 404);
|
|
28
|
+
return c.json(result);
|
|
29
|
+
});
|
|
30
|
+
router.post('/', requirePermission('create', 'content'), async (c) => {
|
|
31
|
+
try {
|
|
32
|
+
const body = await c.req.json();
|
|
33
|
+
const result = await fieldGroupService.create({
|
|
34
|
+
title: body.title,
|
|
35
|
+
key: body.key,
|
|
36
|
+
locationRules: body.locationRules,
|
|
37
|
+
position: body.position,
|
|
38
|
+
displayStyle: body.displayStyle,
|
|
39
|
+
active: body.active,
|
|
40
|
+
fields: body.fields,
|
|
41
|
+
});
|
|
42
|
+
return c.json(result, 201);
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
const message = error instanceof Error ? error.message : 'Failed to create field group';
|
|
46
|
+
return c.json({ error: message }, 400);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
router.put('/:id', requirePermission('update', 'content'), async (c) => {
|
|
50
|
+
try {
|
|
51
|
+
const id = c.req.param('id');
|
|
52
|
+
const body = await c.req.json();
|
|
53
|
+
const result = await fieldGroupService.update(id, {
|
|
54
|
+
title: body.title,
|
|
55
|
+
locationRules: body.locationRules,
|
|
56
|
+
position: body.position,
|
|
57
|
+
displayStyle: body.displayStyle,
|
|
58
|
+
active: body.active,
|
|
59
|
+
});
|
|
60
|
+
if (!result)
|
|
61
|
+
return c.json({ error: 'Field group not found' }, 404);
|
|
62
|
+
return c.json(result);
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : 'Failed to update field group';
|
|
66
|
+
return c.json({ error: message }, 400);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
router.delete('/:id', requirePermission('delete', 'content'), async (c) => {
|
|
70
|
+
const id = c.req.param('id');
|
|
71
|
+
const deleted = await fieldGroupService.delete(id);
|
|
72
|
+
if (!deleted)
|
|
73
|
+
return c.json({ error: 'Field group not found' }, 404);
|
|
74
|
+
return c.json({ success: true });
|
|
75
|
+
});
|
|
76
|
+
export default router;
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/field-groups/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/field-types/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAoB1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// @oktis-works/api - Field Types Catalog Routes
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { listFieldTypes, listFieldTypesByCategory, FIELD_TYPE_CATEGORIES } from '@oktis-works/core';
|
|
4
|
+
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
5
|
+
const router = new Hono();
|
|
6
|
+
router.use('*', authMiddleware);
|
|
7
|
+
router.get('/', requirePermission('read', 'content'), async (c) => {
|
|
8
|
+
const category = c.req.query('category');
|
|
9
|
+
if (category) {
|
|
10
|
+
const grouped = listFieldTypesByCategory();
|
|
11
|
+
const key = category;
|
|
12
|
+
return c.json(grouped[key] ?? []);
|
|
13
|
+
}
|
|
14
|
+
const types = listFieldTypes();
|
|
15
|
+
return c.json({
|
|
16
|
+
categories: FIELD_TYPE_CATEGORIES,
|
|
17
|
+
types,
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
export default router;
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,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;IAEzC,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"}
|
|
@@ -0,0 +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,iEAAa,CAAC;AAmChC,eAAe,YAAY,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
// @oktis-works/api - Health Check Route
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { healthCheck } from '@oktis-works/database';
|
|
4
|
+
const healthRouter = new Hono();
|
|
5
|
+
// GET /health
|
|
6
|
+
healthRouter.get('/', async (c) => {
|
|
7
|
+
const dbHealthy = await healthCheck();
|
|
8
|
+
const status = dbHealthy ? 'healthy' : 'degraded';
|
|
9
|
+
const statusCode = dbHealthy ? 200 : 503;
|
|
10
|
+
return c.json({
|
|
11
|
+
status,
|
|
12
|
+
timestamp: new Date().toISOString(),
|
|
13
|
+
uptime: process.uptime(),
|
|
14
|
+
checks: {
|
|
15
|
+
database: dbHealthy ? 'ok' : 'error',
|
|
16
|
+
},
|
|
17
|
+
}, statusCode);
|
|
18
|
+
});
|
|
19
|
+
// GET /health/ready
|
|
20
|
+
healthRouter.get('/ready', async (c) => {
|
|
21
|
+
const dbHealthy = await healthCheck();
|
|
22
|
+
if (!dbHealthy) {
|
|
23
|
+
return c.json({ ready: false }, 503);
|
|
24
|
+
}
|
|
25
|
+
return c.json({ ready: true });
|
|
26
|
+
});
|
|
27
|
+
// GET /health/live
|
|
28
|
+
healthRouter.get('/live', async (c) => {
|
|
29
|
+
return c.json({ alive: true });
|
|
30
|
+
});
|
|
31
|
+
export default healthRouter;
|
|
32
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/hooks/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAQ1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// @oktis-works/api - Catálogo de hooks (REQU-035-002)
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { getHookCatalog } from '@oktis-works/core';
|
|
4
|
+
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
5
|
+
const router = new Hono();
|
|
6
|
+
router.use('*', authMiddleware);
|
|
7
|
+
router.get('/', requirePermission('read', 'system'), async (c) => {
|
|
8
|
+
return c.json(getHookCatalog());
|
|
9
|
+
});
|
|
10
|
+
export default router;
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/hooks/index.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,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,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/D,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;AAClC,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/media/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAmD1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { mediaService } from '@oktis-works/core';
|
|
3
|
+
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
4
|
+
const router = new Hono();
|
|
5
|
+
router.use('*', authMiddleware);
|
|
6
|
+
router.get('/', requirePermission('read', 'media'), async (c) => {
|
|
7
|
+
const page = Number(c.req.query('page') ?? 1);
|
|
8
|
+
const limit = Number(c.req.query('limit') ?? 20);
|
|
9
|
+
const mimeType = c.req.query('mimeType') || undefined;
|
|
10
|
+
const search = c.req.query('search') || undefined;
|
|
11
|
+
const result = await mediaService.list({ page, limit, mimeType, search });
|
|
12
|
+
return c.json(result);
|
|
13
|
+
});
|
|
14
|
+
router.post('/', requirePermission('upload', 'media'), async (c) => {
|
|
15
|
+
try {
|
|
16
|
+
const body = await c.req.json();
|
|
17
|
+
const userId = c.get('userId');
|
|
18
|
+
const result = await mediaService.create({
|
|
19
|
+
filename: body.filename,
|
|
20
|
+
mimeType: body.mimeType,
|
|
21
|
+
size: body.size,
|
|
22
|
+
path: body.path,
|
|
23
|
+
url: body.url,
|
|
24
|
+
alt: body.alt,
|
|
25
|
+
caption: body.caption,
|
|
26
|
+
metadata: body.metadata,
|
|
27
|
+
uploadedBy: userId,
|
|
28
|
+
});
|
|
29
|
+
return c.json(result, 201);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const message = error instanceof Error ? error.message : 'Failed to upload media';
|
|
33
|
+
return c.json({ error: message }, 400);
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
router.get('/:id', requirePermission('read', 'media'), async (c) => {
|
|
37
|
+
const id = c.req.param('id');
|
|
38
|
+
const result = await mediaService.getById(id);
|
|
39
|
+
if (!result)
|
|
40
|
+
return c.json({ error: 'Media not found' }, 404);
|
|
41
|
+
return c.json(result);
|
|
42
|
+
});
|
|
43
|
+
router.delete('/:id', requirePermission('delete', 'media'), async (c) => {
|
|
44
|
+
const id = c.req.param('id');
|
|
45
|
+
const deleted = await mediaService.delete(id);
|
|
46
|
+
if (!deleted)
|
|
47
|
+
return c.json({ error: 'Media not found' }, 404);
|
|
48
|
+
return c.json({ success: true });
|
|
49
|
+
});
|
|
50
|
+
export default router;
|
|
51
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/media/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/menus/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAuD1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { menuService } from '@oktis-works/core';
|
|
3
|
+
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
4
|
+
const router = new Hono();
|
|
5
|
+
router.use('*', authMiddleware);
|
|
6
|
+
router.get('/', requirePermission('read', 'menu'), async (c) => {
|
|
7
|
+
const result = await menuService.list();
|
|
8
|
+
return c.json(result);
|
|
9
|
+
});
|
|
10
|
+
router.post('/', requirePermission('create', 'menu'), async (c) => {
|
|
11
|
+
try {
|
|
12
|
+
const body = await c.req.json();
|
|
13
|
+
const result = await menuService.create({
|
|
14
|
+
name: body.name,
|
|
15
|
+
slug: body.slug,
|
|
16
|
+
items: body.items,
|
|
17
|
+
});
|
|
18
|
+
return c.json(result, 201);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const message = error instanceof Error ? error.message : 'Failed to create menu';
|
|
22
|
+
return c.json({ error: message }, 400);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
router.get('/:id', requirePermission('read', 'menu'), async (c) => {
|
|
26
|
+
const id = c.req.param('id');
|
|
27
|
+
const result = await menuService.getById(id);
|
|
28
|
+
if (!result)
|
|
29
|
+
return c.json({ error: 'Menu not found' }, 404);
|
|
30
|
+
return c.json(result);
|
|
31
|
+
});
|
|
32
|
+
router.put('/:id', requirePermission('update', 'menu'), async (c) => {
|
|
33
|
+
try {
|
|
34
|
+
const id = c.req.param('id');
|
|
35
|
+
const body = await c.req.json();
|
|
36
|
+
const result = await menuService.update(id, {
|
|
37
|
+
name: body.name,
|
|
38
|
+
slug: body.slug,
|
|
39
|
+
items: body.items,
|
|
40
|
+
});
|
|
41
|
+
if (!result)
|
|
42
|
+
return c.json({ error: 'Menu not found' }, 404);
|
|
43
|
+
return c.json(result);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
const message = error instanceof Error ? error.message : 'Failed to update menu';
|
|
47
|
+
return c.json({ error: message }, 400);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
router.delete('/:id', requirePermission('delete', 'menu'), async (c) => {
|
|
51
|
+
const id = c.req.param('id');
|
|
52
|
+
const deleted = await menuService.delete(id);
|
|
53
|
+
if (!deleted)
|
|
54
|
+
return c.json({ error: 'Menu not found' }, 404);
|
|
55
|
+
return c.json({ success: true });
|
|
56
|
+
});
|
|
57
|
+
export default router;
|
|
58
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/menus/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,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,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC7D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChE,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC;YACtC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;QACjF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAW,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAClE,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAW,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,EAAE;YAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC,CAAC;QACH,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,CAAC;QACjF,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,CAAC,CAAC;IACzC,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACrE,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAW,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;IAC9D,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/metrics/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAkC1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// @oktis-works/api - Metrics endpoint (REQ-observability-003)
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { metrics } from '@oktis-works/core';
|
|
4
|
+
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
5
|
+
const router = new Hono();
|
|
6
|
+
router.use('*', authMiddleware);
|
|
7
|
+
const prometheusEscape = (value) => value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
8
|
+
const labelString = (labels) => Object.entries(labels)
|
|
9
|
+
.map(([k, v]) => `${k}="${prometheusEscape(v)}"`)
|
|
10
|
+
.join(',');
|
|
11
|
+
const toPrometheus = (snapshot) => {
|
|
12
|
+
const lines = [];
|
|
13
|
+
for (const counter of snapshot.counters) {
|
|
14
|
+
const labels = labelString(counter.labels);
|
|
15
|
+
lines.push(`# TYPE ${counter.name} counter`, `${counter.name}{${labels}} ${counter.value}`);
|
|
16
|
+
}
|
|
17
|
+
for (const gauge of snapshot.gauges) {
|
|
18
|
+
const labels = labelString(gauge.labels);
|
|
19
|
+
lines.push(`# TYPE ${gauge.name} gauge`, `${gauge.name}{${labels}} ${gauge.value}`);
|
|
20
|
+
}
|
|
21
|
+
return lines.join('\n') + '\n';
|
|
22
|
+
};
|
|
23
|
+
router.get('/', requirePermission('read', 'system'), async (c) => {
|
|
24
|
+
const snapshot = metrics.snapshot();
|
|
25
|
+
if (c.req.query('format') === 'json') {
|
|
26
|
+
return c.json(snapshot);
|
|
27
|
+
}
|
|
28
|
+
return c.text(toPrometheus(snapshot), 200, { 'Content-Type': 'text/plain; version=0.0.4' });
|
|
29
|
+
});
|
|
30
|
+
export default router;
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/metrics/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,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,gBAAgB,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAEtG,MAAM,WAAW,GAAG,CAAC,MAA8B,EAAU,EAAE,CAC7D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACnB,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC;KAChD,IAAI,CAAC,GAAG,CAAC,CAAC;AAEf,MAAM,YAAY,GAAG,CAAC,QAA6C,EAAU,EAAE;IAC7E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,IAAI,UAAU,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,QAAQ,EAAE,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC,CAAC;AAEF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC/D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAEpC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,cAAc,EAAE,2BAA2B,EAAE,CAAC,CAAC;AAC9F,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../../../src/routes/metrics/index.test.ts"],"names":[],"mappings":""}
|