Files
perfil/nuxt4/server/api/contacts/aliases/[id].put.ts
josedario87 59f25adabe
All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 2m37s
Agregar sección Contactos con UTabs y conexión a Metabase
- Implementar UTabs (Contactos, Aplicaciones, Perfil) en app.vue
- Crear componentes ContactsList, ContactsFilters, ContactItem
- Agregar server routes para obtener contactos via Metabase API
- Sistema de aliases por usuario guardados en archivos JSON
- Filtros: nombre (fuzzy search), ID, teléfono, empleado
- Click en contacto abre WhatsApp
- Estilo glassmorphism consistente con la app
2025-12-05 11:41:26 -06:00

87 lines
2.1 KiB
TypeScript

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<string, string> = {}
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'
})
}
})