/opt/canhelp/apps/api/src/routes
NameSizeModeActions
admin.ts950570644editdlrm
auto-match.ts74060644editdlrm
auto-response.ts81110644editdlrm
availability.ts72940644editdlrm
categories.ts18670644editdlrm
chat.ts93770644editdlrm
dashboard.ts51420644editdlrm
favorites.ts44410644editdlrm
fomo.ts68440644editdlrm
google.ts48720644editdlrm
health.ts12140644editdlrm
i18n.ts1670860644editdlrm
locations.ts17810644editdlrm
notifications.ts28620644editdlrm
offers.ts100470644editdlrm
payments.ts211670644editdlrm
plans.ts13520644editdlrm
portfolio.ts66580644editdlrm
price-list.ts144170644editdlrm
reports.ts20070644editdlrm
reviews.ts27830644editdlrm
skill-suggestions.ts10350644editdlrm
specialist-cards.ts186410644editdlrm
stats.ts10930644editdlrm
statuses.ts37310644editdlrm
support.ts84520644editdlrm
tasks.ts300180644editdlrm
uploads.ts15260644editdlrm
users.ts371570644editdlrm
Edit: /opt/canhelp/apps/api/src/routes/reports.ts (2007B)
import { Hono } from 'hono' import { zValidator } from '@hono/zod-validator' import { z } from 'zod' import { eq, desc, count } from 'drizzle-orm' import { db } from '../db.js' import { reports } from '@canhelp/db' import { requireAuth, requireAdmin, type AuthVariables } from '../middleware/auth.js' const app = new Hono<{ Variables: AuthVariables }>() // POST /reports app.post( '/', requireAuth, zValidator( 'json', z.object({ targetType: z.enum(['task', 'user']), targetId: z.string(), reason: z.enum(['spam', 'inappropriate', 'fraud', 'duplicate', 'other']), description: z.string().max(2000).optional(), }), ), async (c) => { const user = c.get('user') const body = c.req.valid('json') const [report] = await db .insert(reports) .values({ reporterId: user.id, ...body, }) .returning() return c.json(report, 201) }, ) // GET /reports — admin only app.get('/', requireAdmin, async (c) => { const page = Number(c.req.query('page') || 1) const limit = Math.min(Number(c.req.query('limit') || 20), 100) const offset = (page - 1) * limit const rows = await db .select() .from(reports) .where(eq(reports.status, 'pending')) .orderBy(desc(reports.createdAt)) .limit(limit) .offset(offset) const [{ total }] = await db .select({ total: count() }) .from(reports) .where(eq(reports.status, 'pending')) return c.json({ data: rows, total, page, limit }) }) // PATCH /reports/:id/status — admin only app.patch( '/:id/status', requireAdmin, zValidator('json', z.object({ status: z.enum(['reviewed', 'dismissed']) })), async (c) => { const body = c.req.valid('json') const [updated] = await db .update(reports) .set({ status: body.status }) .where(eq(reports.id, c.req.param('id'))) .returning() if (!updated) return c.json({ error: 'Not found' }, 404) return c.json(updated) }, ) export default app