/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/stats.ts (1093B)
import { Hono } from 'hono' import { count, countDistinct, eq } from 'drizzle-orm' import { db } from '../db.js' import { tasks, categories, specialistCards } from '@canhelp/db' import { redis } from '../redis.js' const app = new Hono() const CACHE_KEY = 'public:stats:v2' const CACHE_TTL = 60 * 10 // 10 minutes // GET /stats — public platform statistics app.get('/', async (c) => { const cached = await redis.get(CACHE_KEY).catch(() => null) if (cached) return c.json(JSON.parse(cached)) const [[{ specialistCount }], [{ taskCount }], [{ categoryCount }]] = await Promise.all([ db.select({ specialistCount: countDistinct(specialistCards.specialistId) }).from(specialistCards).where(eq(specialistCards.isActive, true)), db.select({ taskCount: count() }).from(tasks), db.select({ categoryCount: count() }).from(categories).where(eq(categories.isActive, true)), ]) const result = { specialistCount, taskCount, categoryCount } redis.set(CACHE_KEY, JSON.stringify(result), 'EX', CACHE_TTL).catch(() => {}) return c.json(result) }) export default app