Spaces:
Runtime error
Runtime error
| import { NextRequest, NextResponse } from 'next/server' | |
| import { requireRole } from '@/lib/auth' | |
| import { getDatabase } from '@/lib/db' | |
| import { getMentionTargets } from '@/lib/mentions' | |
| import { logger } from '@/lib/logger' | |
| /** | |
| * GET /api/mentions - autocomplete source for @mentions (users + agents) | |
| * Query: q?, limit?, type? | |
| */ | |
| export async function GET(request: NextRequest) { | |
| const auth = requireRole(request, 'viewer') | |
| if ('error' in auth) return NextResponse.json({ error: auth.error }, { status: auth.status }) | |
| try { | |
| const db = getDatabase() | |
| const workspaceId = auth.user.workspace_id ?? 1 | |
| const { searchParams } = new URL(request.url) | |
| const q = String(searchParams.get('q') || '').trim().toLowerCase() | |
| const typeFilter = String(searchParams.get('type') || '').trim().toLowerCase() | |
| const limitRaw = Number.parseInt(searchParams.get('limit') || '25', 10) | |
| const limit = Math.max(1, Math.min(Number.isFinite(limitRaw) ? limitRaw : 25, 200)) | |
| let targets = getMentionTargets(db, workspaceId) | |
| if (typeFilter === 'user' || typeFilter === 'agent') { | |
| targets = targets.filter((target) => target.type === typeFilter) | |
| } | |
| if (q) { | |
| targets = targets.filter((target) => ( | |
| target.handle.includes(q) || | |
| target.recipient.toLowerCase().includes(q) || | |
| target.display.toLowerCase().includes(q) | |
| )) | |
| } | |
| targets = targets.slice(0, limit) | |
| return NextResponse.json({ | |
| mentions: targets, | |
| total: targets.length, | |
| q, | |
| }) | |
| } catch (error) { | |
| logger.error({ err: error }, 'GET /api/mentions error') | |
| return NextResponse.json({ error: 'Failed to fetch mention targets' }, { status: 500 }) | |
| } | |
| } | |