import { readFile, writeFile, mkdir } from 'fs/promises' import { existsSync } from 'fs' import { join } from 'path' /** * API endpoint para actualizar el alias de un contacto * PUT /api/contacts/aliases/:id */ export default defineEventHandler(async (event) => { const config = useRuntimeConfig() const headers = getRequestHeaders(event) // Verificar autenticación const uid = headers['x-authentik-uid'] if (!uid) { throw createError({ statusCode: 401, message: 'Usuario no autenticado' }) } // Obtener ID del contacto desde la ruta const contactId = getRouterParam(event, 'id') if (!contactId) { throw createError({ statusCode: 400, message: 'ID de contacto requerido' }) } // Leer body const body = await readBody(event) const alias = body?.alias?.toString().trim() || '' // Validar alias (max 50 caracteres) if (alias.length > 50) { throw createError({ statusCode: 400, message: 'El alias no puede tener más de 50 caracteres' }) } // Sanitizar UID para usar como nombre de archivo const safeUid = uid.replace(/[^a-zA-Z0-9-_]/g, '_') // Ruta del archivo de aliases const dataDir = config.dataDir || './data' const aliasesDir = join(dataDir, 'contact-aliases') const aliasesFile = join(aliasesDir, `${safeUid}.json`) try { // Crear directorio si no existe if (!existsSync(aliasesDir)) { await mkdir(aliasesDir, { recursive: true }) } // Leer aliases existentes let aliases: Record = {} if (existsSync(aliasesFile)) { const content = await readFile(aliasesFile, 'utf-8') aliases = JSON.parse(content) } // Actualizar o eliminar alias if (alias) { aliases[contactId] = alias } else { delete aliases[contactId] } // Guardar archivo await writeFile(aliasesFile, JSON.stringify(aliases, null, 2), 'utf-8') return { success: true, contactId, alias: alias || null } } catch (error: any) { console.error('Error al actualizar alias:', error) throw createError({ statusCode: 500, message: 'Error al actualizar el alias' }) } })