Schema: - teams table (name unique, description) - team_members table (team_id, user_id, unique constraint) - team_id column on dashboards API: - GET/POST/PATCH/DELETE /teams - POST /teams/:id/members (add user) - DELETE /teams/:id/members/:userId (remove user) - dashboards support team_id on create/update Frontend: - Teams tab in admin: CRUD + member management with add/remove - Sidebar: dashboards filtered to user's teams (unassigned dashboards visible to all) - Compact dashboard picker dropdown in sidebar Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
58 lines
2.0 KiB
TypeScript
58 lines
2.0 KiB
TypeScript
import { Hono } from 'hono';
|
|
import { config } from './config.ts';
|
|
import { createDb } from './db/index.ts';
|
|
import type { Db } from './db/index.ts';
|
|
import { errorHandler } from './middleware/error.ts';
|
|
import { requestLogger } from './middleware/logging.ts';
|
|
import healthRouter from './routes/health.ts';
|
|
import { createTicketsRouter } from './routes/tickets.ts';
|
|
import { createQueuesRouter } from './routes/queues.ts';
|
|
import { createScripsRouter } from './routes/scrips.ts';
|
|
import { createCustomFieldsRouter } from './routes/custom-fields.ts';
|
|
import { createLifecyclesRouter } from './routes/lifecycles.ts';
|
|
import { createUsersRouter } from './routes/users.ts';
|
|
import { createTemplatesRouter } from './routes/templates.ts';
|
|
import { createViewsRouter } from './routes/views.ts';
|
|
import { createDashboardsRouter } from './routes/dashboards.ts';
|
|
import { createTeamsRouter } from './routes/teams.ts';
|
|
|
|
let db: Db | null = null;
|
|
|
|
function getDb(): Db {
|
|
if (!db) {
|
|
db = createDb(config.DATABASE_URL);
|
|
}
|
|
return db;
|
|
}
|
|
|
|
const app = new Hono();
|
|
|
|
app.use('*', requestLogger);
|
|
app.onError(errorHandler);
|
|
|
|
app.route('/health', healthRouter);
|
|
app.route('/tickets', createTicketsRouter(getDb()));
|
|
app.route('/queues', createQueuesRouter(getDb()));
|
|
app.route('/scrips', createScripsRouter(getDb()));
|
|
app.route('/custom-fields', createCustomFieldsRouter(getDb()));
|
|
app.route('/lifecycles', createLifecyclesRouter(getDb()));
|
|
app.route('/users', createUsersRouter(getDb()));
|
|
app.route('/templates', createTemplatesRouter(getDb()));
|
|
app.route('/views', createViewsRouter(getDb()));
|
|
app.route('/dashboards', createDashboardsRouter(getDb()));
|
|
app.route('/teams', createTeamsRouter(getDb()));
|
|
|
|
export default app;
|
|
export { app };
|
|
|
|
// Start server when run directly
|
|
if (Bun.main === import.meta.path) {
|
|
Bun.serve({
|
|
fetch: app.fetch,
|
|
port: config.SERVER_PORT,
|
|
hostname: config.SERVER_HOST,
|
|
development: false,
|
|
});
|
|
console.log(`Server running at http://${config.SERVER_HOST}:${config.SERVER_PORT}`);
|
|
}
|