@oktis-works/api 0.0.0-stage → 0.1.0
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,14 @@
|
|
|
1
|
+
// @oktis-works/api - Trace ID middleware (REQ-observability-005)
|
|
2
|
+
import { randomUUID } from 'node:crypto';
|
|
3
|
+
/**
|
|
4
|
+
* REQ-observability-005: todo request pode ser rastreado via trace ID.
|
|
5
|
+
* Propaga X-Trace-ID recebido ou gera um novo; devolve na resposta.
|
|
6
|
+
*/
|
|
7
|
+
export async function traceMiddleware(c, next) {
|
|
8
|
+
const incoming = c.req.header('X-Trace-ID');
|
|
9
|
+
const traceId = incoming && incoming.length <= 128 ? incoming : randomUUID();
|
|
10
|
+
c.set('traceId', traceId);
|
|
11
|
+
await next();
|
|
12
|
+
c.header('X-Trace-ID', traceId);
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=trace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/middleware/trace.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAGjE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,CAAU,EAAE,IAAU;IAC1D,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,QAAQ,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;IAE7E,CAAC,CAAC,GAAG,CAAC,SAAkB,EAAE,OAAgB,CAAC,CAAC;IAC5C,MAAM,IAAI,EAAE,CAAC;IACb,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.test.d.ts","sourceRoot":"","sources":["../../src/middleware/trace.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// @oktis-works/api - REQ-observability-005: request rastreável via X-Trace-ID
|
|
2
|
+
import { describe, it, expect } from 'vitest';
|
|
3
|
+
import { Hono } from 'hono';
|
|
4
|
+
import { traceMiddleware } from './trace.js';
|
|
5
|
+
const app = () => {
|
|
6
|
+
const a = new Hono();
|
|
7
|
+
a.use('*', traceMiddleware);
|
|
8
|
+
return a;
|
|
9
|
+
};
|
|
10
|
+
describe('traceMiddleware — REQ-observability-005', () => {
|
|
11
|
+
it('gera X-Trace-ID quando o request não traz', async () => {
|
|
12
|
+
const a = app();
|
|
13
|
+
a.get('/', (c) => c.json({ ok: true }));
|
|
14
|
+
const res = await a.request('/');
|
|
15
|
+
expect(res.headers.get('X-Trace-ID')).toBeTruthy();
|
|
16
|
+
expect(res.headers.get('X-Trace-ID')).toHaveLength(36); // UUID
|
|
17
|
+
});
|
|
18
|
+
it('propaga X-Trace-ID recebido do cliente', async () => {
|
|
19
|
+
const a = app();
|
|
20
|
+
a.get('/', (c) => c.json({ traceId: c.get('traceId') }));
|
|
21
|
+
const res = await a.request('/', { headers: { 'X-Trace-ID': 'my-trace-123' } });
|
|
22
|
+
const body = (await res.json());
|
|
23
|
+
expect(body.traceId).toBe('my-trace-123');
|
|
24
|
+
expect(res.headers.get('X-Trace-ID')).toBe('my-trace-123');
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=trace.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.test.js","sourceRoot":"","sources":["../../src/middleware/trace.test.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAE9E,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,GAAG,GAAG,GAAG,EAAE;IACf,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;IAC5B,OAAO,CAAC,CAAC;AACX,CAAC,CAAC;AAEF,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAExC,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,CAAC,GAAG,GAAG,EAAE,CAAC;QAChB,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,SAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;QAElE,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAwB,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/audit-logs/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAkB1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
// @oktis-works/api - Audit Logs endpoint (REQ-observability-001/004)
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { auditService } 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', 'audit'), async (c) => {
|
|
8
|
+
const limitRaw = Number(c.req.query('limit') ?? '100');
|
|
9
|
+
const entries = await auditService.list({
|
|
10
|
+
tenantId: c.req.query('tenantId'),
|
|
11
|
+
resourceType: c.req.query('resourceType'),
|
|
12
|
+
action: c.req.query('action'),
|
|
13
|
+
userId: c.req.query('userId'),
|
|
14
|
+
limit: Number.isFinite(limitRaw) ? limitRaw : 100,
|
|
15
|
+
});
|
|
16
|
+
return c.json({ data: entries, count: entries.length });
|
|
17
|
+
});
|
|
18
|
+
export default router;
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/audit-logs/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AAErE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,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,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IAEvD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC;QACtC,QAAQ,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;QACjC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC;QACzC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7B,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC7B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;KAClD,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/auth/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAS5B,QAAA,MAAM,UAAU,iEAAa,CAAC;AAuF9B,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// @oktis-works/api - Auth Routes
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { AuthService } from '@oktis-works/auth';
|
|
4
|
+
import { loadConfig } from '@oktis-works/config';
|
|
5
|
+
import { establishTenantContext } from '@oktis-works/core';
|
|
6
|
+
const config = loadConfig();
|
|
7
|
+
const authService = new AuthService(config.auth);
|
|
8
|
+
const authRouter = new Hono();
|
|
9
|
+
// POST /auth/register
|
|
10
|
+
authRouter.post('/register', async (c) => {
|
|
11
|
+
try {
|
|
12
|
+
const body = await c.req.json();
|
|
13
|
+
const { email, password, name } = body;
|
|
14
|
+
if (!email || !password || !name) {
|
|
15
|
+
return c.json({ error: 'Missing required fields' }, 400);
|
|
16
|
+
}
|
|
17
|
+
const user = await authService.register({ email, password, name });
|
|
18
|
+
return c.json({ user }, 201);
|
|
19
|
+
}
|
|
20
|
+
catch (error) {
|
|
21
|
+
const message = error instanceof Error ? error.message : 'Registration failed';
|
|
22
|
+
return c.json({ error: message }, 400);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
// POST /auth/login
|
|
26
|
+
authRouter.post('/login', async (c) => {
|
|
27
|
+
try {
|
|
28
|
+
const body = await c.req.json();
|
|
29
|
+
const { email, password, tenantId } = body;
|
|
30
|
+
if (!email || !password || !tenantId) {
|
|
31
|
+
return c.json({ error: 'Missing required fields' }, 400);
|
|
32
|
+
}
|
|
33
|
+
await establishTenantContext(tenantId);
|
|
34
|
+
const result = await authService.login({
|
|
35
|
+
email,
|
|
36
|
+
password,
|
|
37
|
+
tenantId,
|
|
38
|
+
ipAddress: c.req.header('x-forwarded-for') ?? c.req.header('x-real-ip'),
|
|
39
|
+
userAgent: c.req.header('user-agent'),
|
|
40
|
+
});
|
|
41
|
+
return c.json(result);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const message = error instanceof Error ? error.message : 'Login failed';
|
|
45
|
+
return c.json({ error: message }, 401);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
// POST /auth/refresh
|
|
49
|
+
authRouter.post('/refresh', async (c) => {
|
|
50
|
+
try {
|
|
51
|
+
const body = await c.req.json();
|
|
52
|
+
const { refreshToken } = body;
|
|
53
|
+
if (!refreshToken) {
|
|
54
|
+
return c.json({ error: 'Missing refresh token' }, 400);
|
|
55
|
+
}
|
|
56
|
+
const tokens = await authService.refreshToken(refreshToken);
|
|
57
|
+
if (!tokens) {
|
|
58
|
+
return c.json({ error: 'Invalid refresh token' }, 401);
|
|
59
|
+
}
|
|
60
|
+
return c.json(tokens);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
const message = error instanceof Error ? error.message : 'Token refresh failed';
|
|
64
|
+
return c.json({ error: message }, 400);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
// POST /auth/logout
|
|
68
|
+
authRouter.post('/logout', async (c) => {
|
|
69
|
+
try {
|
|
70
|
+
const body = await c.req.json();
|
|
71
|
+
const { token } = body;
|
|
72
|
+
if (!token) {
|
|
73
|
+
return c.json({ error: 'Missing token' }, 400);
|
|
74
|
+
}
|
|
75
|
+
await authService.logout(token);
|
|
76
|
+
return c.json({ success: true });
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
const message = error instanceof Error ? error.message : 'Logout failed';
|
|
80
|
+
return c.json({ error: message }, 400);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
export default authRouter;
|
|
84
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/auth/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"me.d.ts","sourceRoot":"","sources":["../../../src/routes/auth/me.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAoB1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
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('/me', async (c) => {
|
|
7
|
+
const userId = c.get('userId');
|
|
8
|
+
const sql = getConnection();
|
|
9
|
+
const result = await sql.unsafe('SELECT id, email, name, avatar, status, last_login_at, created_at, updated_at FROM users WHERE id = $1', [userId]);
|
|
10
|
+
if (result.length === 0) {
|
|
11
|
+
return c.json({ error: 'User not found' }, 404);
|
|
12
|
+
}
|
|
13
|
+
return c.json(result[0]);
|
|
14
|
+
});
|
|
15
|
+
export default router;
|
|
16
|
+
//# sourceMappingURL=me.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"me.js","sourceRoot":"","sources":["../../../src/routes/auth/me.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,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC5B,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,QAAiB,CAAW,CAAC;IAClD,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAC7B,wGAAwG,EACxG,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,gBAAgB,EAAE,EAAE,GAAG,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/categories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAkD1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { categoryService } 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', 'category'), async (c) => {
|
|
7
|
+
const result = await categoryService.list();
|
|
8
|
+
return c.json(result);
|
|
9
|
+
});
|
|
10
|
+
router.post('/', requirePermission('create', 'category'), async (c) => {
|
|
11
|
+
try {
|
|
12
|
+
const body = await c.req.json();
|
|
13
|
+
const result = await categoryService.create({
|
|
14
|
+
name: body.name,
|
|
15
|
+
slug: body.slug,
|
|
16
|
+
description: body.description,
|
|
17
|
+
parentId: body.parentId,
|
|
18
|
+
});
|
|
19
|
+
return c.json(result, 201);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
const message = error instanceof Error ? error.message : 'Failed to create category';
|
|
23
|
+
return c.json({ error: message }, 400);
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
router.put('/:id', requirePermission('update', 'category'), async (c) => {
|
|
27
|
+
try {
|
|
28
|
+
const id = c.req.param('id');
|
|
29
|
+
const body = await c.req.json();
|
|
30
|
+
const result = await categoryService.update(id, {
|
|
31
|
+
name: body.name,
|
|
32
|
+
slug: body.slug,
|
|
33
|
+
description: body.description,
|
|
34
|
+
parentId: body.parentId,
|
|
35
|
+
});
|
|
36
|
+
if (!result)
|
|
37
|
+
return c.json({ error: 'Category not found' }, 404);
|
|
38
|
+
return c.json(result);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const message = error instanceof Error ? error.message : 'Failed to update category';
|
|
42
|
+
return c.json({ error: message }, 400);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
router.delete('/:id', requirePermission('delete', 'category'), async (c) => {
|
|
46
|
+
const id = c.req.param('id');
|
|
47
|
+
const deleted = await categoryService.delete(id);
|
|
48
|
+
if (!deleted)
|
|
49
|
+
return c.json({ error: 'Category not found' }, 404);
|
|
50
|
+
return c.json({ success: true });
|
|
51
|
+
});
|
|
52
|
+
export default router;
|
|
53
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/categories/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/content/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,QAAA,MAAM,aAAa,iEAAa,CAAC;AA+FjC,eAAe,aAAa,CAAC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// @oktis-works/api - Content Routes
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { contentService } from '@oktis-works/core';
|
|
4
|
+
import { authMiddleware, requirePermission } from '../../middleware/auth.js';
|
|
5
|
+
const contentRouter = new Hono();
|
|
6
|
+
contentRouter.use('*', authMiddleware);
|
|
7
|
+
contentRouter.get('/', requirePermission('read', 'content'), async (c) => {
|
|
8
|
+
const page = Number(c.req.query('page') ?? 1);
|
|
9
|
+
const limit = Number(c.req.query('limit') ?? 20);
|
|
10
|
+
const type = c.req.query('type') || undefined;
|
|
11
|
+
const status = (c.req.query('status') || undefined);
|
|
12
|
+
const search = c.req.query('search') || undefined;
|
|
13
|
+
const result = await contentService.list({ page, limit, type, status, search });
|
|
14
|
+
return c.json(result);
|
|
15
|
+
});
|
|
16
|
+
contentRouter.get('/slug/:slug', requirePermission('read', 'content'), async (c) => {
|
|
17
|
+
const slug = c.req.param('slug');
|
|
18
|
+
const type = c.req.query('type') || undefined;
|
|
19
|
+
const content = await contentService.getBySlug(slug, type);
|
|
20
|
+
if (!content) {
|
|
21
|
+
return c.json({ error: 'Content not found' }, 404);
|
|
22
|
+
}
|
|
23
|
+
return c.json(content);
|
|
24
|
+
});
|
|
25
|
+
contentRouter.get('/:id', requirePermission('read', 'content'), async (c) => {
|
|
26
|
+
const id = c.req.param('id');
|
|
27
|
+
const content = await contentService.getById(id);
|
|
28
|
+
if (!content) {
|
|
29
|
+
return c.json({ error: 'Content not found' }, 404);
|
|
30
|
+
}
|
|
31
|
+
return c.json(content);
|
|
32
|
+
});
|
|
33
|
+
contentRouter.post('/', requirePermission('create', 'content'), async (c) => {
|
|
34
|
+
try {
|
|
35
|
+
const body = await c.req.json();
|
|
36
|
+
const userId = c.get('userId');
|
|
37
|
+
const content = await contentService.create({
|
|
38
|
+
...body,
|
|
39
|
+
authorId: userId,
|
|
40
|
+
});
|
|
41
|
+
return c.json(content, 201);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
const message = error instanceof Error ? error.message : 'Failed to create content';
|
|
45
|
+
return c.json({ error: message }, 400);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
contentRouter.put('/:id', requirePermission('update', 'content'), async (c) => {
|
|
49
|
+
try {
|
|
50
|
+
const id = c.req.param('id');
|
|
51
|
+
const body = await c.req.json();
|
|
52
|
+
const content = await contentService.update(id, body);
|
|
53
|
+
if (!content) {
|
|
54
|
+
return c.json({ error: 'Content not found' }, 404);
|
|
55
|
+
}
|
|
56
|
+
return c.json(content);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
const message = error instanceof Error ? error.message : 'Failed to update content';
|
|
60
|
+
return c.json({ error: message }, 400);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
contentRouter.delete('/:id', requirePermission('delete', 'content'), async (c) => {
|
|
64
|
+
try {
|
|
65
|
+
const id = c.req.param('id');
|
|
66
|
+
const deleted = await contentService.delete(id);
|
|
67
|
+
if (!deleted) {
|
|
68
|
+
return c.json({ error: 'Content not found' }, 404);
|
|
69
|
+
}
|
|
70
|
+
return c.json({ success: true });
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
const message = error instanceof Error ? error.message : 'Failed to delete content';
|
|
74
|
+
return c.json({ error: message }, 400);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
contentRouter.get('/:id/versions', requirePermission('read', 'content'), async (c) => {
|
|
78
|
+
const id = c.req.param('id');
|
|
79
|
+
const versions = await contentService.getVersions(id);
|
|
80
|
+
return c.json(versions);
|
|
81
|
+
});
|
|
82
|
+
export default contentRouter;
|
|
83
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/content/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/content-types/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAkE1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// @oktis-works/api - Content Types Routes (Custom Post Types)
|
|
2
|
+
import { Hono } from 'hono';
|
|
3
|
+
import { postTypeRegistry } 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 result = await postTypeRegistry.list();
|
|
9
|
+
return c.json(result);
|
|
10
|
+
});
|
|
11
|
+
router.get('/:slug', requirePermission('read', 'content'), async (c) => {
|
|
12
|
+
const slug = c.req.param('slug');
|
|
13
|
+
const result = await postTypeRegistry.getBySlug(slug);
|
|
14
|
+
if (!result)
|
|
15
|
+
return c.json({ error: 'Content type not found' }, 404);
|
|
16
|
+
return c.json(result);
|
|
17
|
+
});
|
|
18
|
+
router.post('/', requirePermission('create', 'content'), async (c) => {
|
|
19
|
+
try {
|
|
20
|
+
const body = await c.req.json();
|
|
21
|
+
const result = await postTypeRegistry.create({
|
|
22
|
+
name: body.name,
|
|
23
|
+
slug: body.slug,
|
|
24
|
+
pluralLabel: body.pluralLabel,
|
|
25
|
+
singularLabel: body.singularLabel,
|
|
26
|
+
supports: body.supports,
|
|
27
|
+
hasArchive: body.hasArchive,
|
|
28
|
+
menuIcon: body.menuIcon,
|
|
29
|
+
source: 'ADMIN',
|
|
30
|
+
});
|
|
31
|
+
return c.json(result, 201);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
const message = error instanceof Error ? error.message : 'Failed to create content type';
|
|
35
|
+
return c.json({ error: message }, 400);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
router.put('/:slug', requirePermission('update', 'content'), async (c) => {
|
|
39
|
+
try {
|
|
40
|
+
const slug = c.req.param('slug');
|
|
41
|
+
const body = await c.req.json();
|
|
42
|
+
const result = await postTypeRegistry.update(slug, {
|
|
43
|
+
pluralLabel: body.pluralLabel,
|
|
44
|
+
singularLabel: body.singularLabel,
|
|
45
|
+
supports: body.supports,
|
|
46
|
+
hasArchive: body.hasArchive,
|
|
47
|
+
menuIcon: body.menuIcon,
|
|
48
|
+
});
|
|
49
|
+
return c.json(result);
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
const message = error instanceof Error ? error.message : 'Failed to update content type';
|
|
53
|
+
return c.json({ error: message }, 400);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
router.delete('/:slug', requirePermission('delete', 'content'), async (c) => {
|
|
57
|
+
try {
|
|
58
|
+
const slug = c.req.param('slug');
|
|
59
|
+
const deleted = await postTypeRegistry.delete(slug);
|
|
60
|
+
if (!deleted)
|
|
61
|
+
return c.json({ error: 'Content type not found' }, 404);
|
|
62
|
+
return c.json({ success: true });
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
const message = error instanceof Error ? error.message : 'Failed to delete content type';
|
|
66
|
+
return c.json({ error: message }, 400);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
export default router;
|
|
70
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/content-types/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/deployments/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AAoD1B,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { deploymentService } 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', 'deployment'), async (c) => {
|
|
7
|
+
const page = Number(c.req.query('page') ?? 1);
|
|
8
|
+
const limit = Number(c.req.query('limit') ?? 20);
|
|
9
|
+
const status = c.req.query('status') || undefined;
|
|
10
|
+
const result = await deploymentService.list({ page, limit, status });
|
|
11
|
+
return c.json(result);
|
|
12
|
+
});
|
|
13
|
+
router.post('/', requirePermission('create', 'deployment'), async (c) => {
|
|
14
|
+
try {
|
|
15
|
+
const body = await c.req.json();
|
|
16
|
+
const userId = c.get('userId');
|
|
17
|
+
const result = await deploymentService.create({
|
|
18
|
+
buildId: body.buildId,
|
|
19
|
+
coreVersion: body.coreVersion,
|
|
20
|
+
themeVersion: body.themeVersion,
|
|
21
|
+
pluginVersions: body.pluginVersions,
|
|
22
|
+
checksum: body.checksum,
|
|
23
|
+
createdBy: userId,
|
|
24
|
+
});
|
|
25
|
+
return c.json(result, 201);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
const message = error instanceof Error ? error.message : 'Failed to create deployment';
|
|
29
|
+
return c.json({ error: message }, 400);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
router.get('/:id', requirePermission('read', 'deployment'), async (c) => {
|
|
33
|
+
const id = c.req.param('id');
|
|
34
|
+
const result = await deploymentService.getById(id);
|
|
35
|
+
if (!result)
|
|
36
|
+
return c.json({ error: 'Deployment not found' }, 404);
|
|
37
|
+
return c.json(result);
|
|
38
|
+
});
|
|
39
|
+
router.post('/:id/rollback', requirePermission('create', 'deployment'), async (c) => {
|
|
40
|
+
try {
|
|
41
|
+
const id = c.req.param('id');
|
|
42
|
+
const body = await c.req.json();
|
|
43
|
+
const result = await deploymentService.rollback(id, body.rollbackToId);
|
|
44
|
+
return c.json(result);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
const message = error instanceof Error ? error.message : 'Failed to rollback deployment';
|
|
48
|
+
return c.json({ error: message }, 400);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
export default router;
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/deployments/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/docs/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,QAAA,MAAM,MAAM,iEAAa,CAAC;AA0H1B,eAAe,MAAM,CAAC"}
|