/** * GET /api/chat/directory → { records: [{ id, name, email }] } * * Slim, purpose-built colleague list for the chat drawer: only chat-eligible * staff (IsSystemUser + IsChatEnabled + active), only id/name/email. This used * to reuse /api/admin/users, which returns EVERY ad_user row with all fields — * heavy enough that the drawer showed "Keine Kollegen" for seconds on open. * Gated to staff (chatAccess.gateFromEvent). * * Fast path filters on the custom IsChatEnabled column server-side; if that * OData filter is unsupported it falls back to the proven broad query and * filters IsChatEnabled in JS, so the list never comes back empty over a quirk. */ import { string } from 'alga-js' import { gateFromEvent } from '../../utils/chatAccess' const isChatEnabled = (u: any) => u?.IsChatEnabled === true || u?.isChatEnabled === true const fetchDirectory = async (event: any, token: string): Promise => { try { // Fast path: server-side filter to just chat-eligible staff + slim columns. const filter = string.urlEncode('isSystemUser eq true AND isChatEnabled eq true AND isActive eq true') const res: any = await event.context.fetch( `models/ad_user?$filter=${filter}&$select=AD_User_ID,Name,EMail&$orderby=${string.urlEncode('Name asc')}`, 'GET', token, null ) return res?.records || [] } catch { // Fallback: proven broad query (no custom column), filter IsChatEnabled in JS. const filter = string.urlEncode('isActive eq true AND isSystemUser eq true') const res: any = await event.context.fetch( `models/ad_user?$filter=${filter}&$orderby=${string.urlEncode('Name asc')}`, 'GET', token, null ) return (res?.records || []).filter(isChatEnabled) } } export default defineEventHandler(async (event) => { const config = useRuntimeConfig() if (config.chatEnabled !== true) { setResponseStatus(event, 404) return { error: 'chat disabled' } } let token: string try { ({ token } = await gateFromEvent(event)) } catch (err: any) { setResponseStatus(event, err?.statusCode || 403) return { error: 'forbidden' } } let rows: any[] = [] try { rows = await fetchDirectory(event, token) } catch (err: any) { console.error('[chat/directory] fetch failed:', err?.message) rows = [] } const records = rows.map((u: any) => ({ id: Number(u.id), name: u.Name || u.name || ('User ' + u.id), email: u.EMail || u.Email || u.email || '' })) return { records } })