import { isAdminVerified } from '../../utils/mobileReleases' import { addToBlacklist, randomBlacklistDescription, isValidBlacklistNumber } from '../../utils/telephony/blacklist' /** * POST /api/telephony/blacklist { number, label? } * * Admin-only (server-verified, mirrors recent-calls.get.ts). Adds `number` to * the FreePBX Blacklist so future inbound calls from it are rejected — * effective immediately, see server/utils/telephony/blacklist.ts. FreePBX's * own admin UI treats "Description" as mandatory; we always synthesize a * non-blank one since it's never shown anywhere in this app. */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() if ((config as any).asterisk?.enabled !== true) return { status: 503, message: 'Telefonanlage nicht aktiviert' } const token = await getTokenHelper(event) if (!token) throw createError({ statusCode: 401, statusMessage: 'Unauthorized' }) const admin = await isAdminVerified(event, token) if (!admin) throw createError({ statusCode: 403, statusMessage: 'Nur für Administratoren' }) const body: any = await readBody(event).catch(() => ({})) const number = String(body?.number || '').trim() if (!isValidBlacklistNumber(number)) { return { status: 400, message: 'Ungültige Telefonnummer' } } try { const description = randomBlacklistDescription(String(body?.label || '')) await addToBlacklist(number, description) return { status: 200, number, description } } catch (err: any) { console.warn('[blacklist] add failed:', err?.statusMessage || err?.message || err) return { status: Number(err?.statusCode || 502), message: err?.statusMessage || 'Sperren fehlgeschlagen' } } })