managarten/services/mana-analytics/src/routes/feedback.ts
Till JS 753c685ef7 feat(services): create mana-analytics, remove feedback/analytics/ai from auth
Extract feedback, analytics, and AI modules from mana-core-auth into
standalone mana-analytics service (Hono + Bun, Port 3064).

New service (services/mana-analytics/):
- User feedback CRUD with voting
- AI-powered feedback title generation via mana-llm
- Simplified from DuckDB analytics to pure PostgreSQL
- ~550 LOC

Removed from mana-core-auth:
- feedback/ module (6 files)
- analytics/ module (4 files)
- ai/ module (3 files)
- db/schema/feedback.schema.ts

mana-core-auth now contains ONLY pure auth:
- Better Auth (JWT, Sessions, 2FA, Passkeys, OIDC, Magic Links)
- Organizations/Guilds (membership management)
- API Keys, Security, Me (GDPR), Health, Metrics
- Ready for Phase 5: Hono rewrite

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 02:29:24 +01:00

34 lines
1.3 KiB
TypeScript

import { Hono } from 'hono';
import type { FeedbackService } from '../services/feedback';
import type { AuthUser } from '../middleware/jwt-auth';
export function createFeedbackRoutes(feedbackService: FeedbackService) {
return new Hono<{ Variables: { user: AuthUser } }>()
.post('/', async (c) => {
const user = c.get('user');
const body = await c.req.json();
return c.json(await feedbackService.createFeedback(user.userId, body), 201);
})
.get('/public', async (c) => {
const appId = c.req.query('appId');
const limit = parseInt(c.req.query('limit') || '50', 10);
const offset = parseInt(c.req.query('offset') || '0', 10);
return c.json(await feedbackService.getPublicFeedback(appId, limit, offset));
})
.get('/me', async (c) => {
const user = c.get('user');
return c.json(await feedbackService.getMyFeedback(user.userId));
})
.post('/:id/vote', async (c) => {
const user = c.get('user');
return c.json(await feedbackService.vote(c.req.param('id'), user.userId));
})
.delete('/:id/vote', async (c) => {
const user = c.get('user');
return c.json(await feedbackService.unvote(c.req.param('id'), user.userId));
})
.delete('/:id', async (c) => {
const user = c.get('user');
return c.json(await feedbackService.deleteFeedback(c.req.param('id'), user.userId));
});
}