All checks were successful
build-and-deploy / build-and-deploy (push) Successful in 2m37s
- 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
87 lines
2.1 KiB
TypeScript
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'
|
|
})
|
|
}
|
|
})
|