'use server' import { Client, Account } from 'node-appwrite'; import { cookies } from 'next/headers'; import { redirect } from 'next/navigation'; const ENDPOINT = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT || 'https://nyc.cloud.appwrite.io/v1'; const PROJECT_ID = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID || '6aef63d9002c07371b40'; const COOKIE_NAME = `a_session_${PROJECT_ID.toLowerCase()}`; // Password de emergencia (Configurado en Coolify) const ADMIN_PASSWORD = process.env.ADMIN_PASSWORD || 'AlmeiraAdmin2024*'; export async function login(prevState: any, formData: FormData) { const emailInput = formData.get('email') as string; const password = formData.get('password') as string; const email = emailInput ? emailInput.trim().toLowerCase() : ''; // LOG DE VERSIÓN PARA CONFIRMAR DESPLIEGUE EN COOLIFY console.log('--- ALMEIRA WEB VERSION 1.1.0 (Reset) ---'); console.log('Intento de login para:', email); // 1. Bypass de Emergencia (Prioridad Máxima) if (email === 'admin@almeira.com.co') { console.log('>>> MODO EMERGENCIA: Verificando credenciales locales...'); if (password === ADMIN_PASSWORD) { console.log('>>> MODO EMERGENCIA: Acceso concedido.'); const cookieStore = await cookies(); cookieStore.set(COOKIE_NAME, "admin-bypass-session", { path: "/", httpOnly: true, sameSite: "lax", secure: true, // Permitir en HTTP (No Seguro) para bypass maxAge: 60 * 60 * 24 * 7, }); console.log('>>> MODO EMERGENCIA: Cookie guardada, redirigiendo a /dashboard'); return redirect('/dashboard'); } else { console.log('>>> MODO EMERGENCIA: Password incorrecto.'); return { error: 'Contraseña de emergencia incorrecta.' }; } } // 2. Intento de Login Normal (Appwrite) try { const client = new Client() .setEndpoint(ENDPOINT) .setProject(PROJECT_ID); const account = new Account(client); const session = await account.createEmailPasswordSession(email, password); const cookieStore = await cookies(); if (!session.secret) { console.error('>>> LOGIN ERROR: No se recibió secret de la sesión de Appwrite'); return { error: 'Error interno: La sesión no generó un secreto válido.' }; } cookieStore.set(COOKIE_NAME, session.secret, { path: "/", httpOnly: true, sameSite: "lax", secure: true, // Siempre usar Secure en HTTPS maxAge: 60 * 60 * 24 * 7, }); console.log('>>> LOGIN APPWRITE: Sesión creada exitosamente. Cooke set:', COOKIE_NAME); } catch (error: any) { console.error('>>> LOGIN ERROR:', error.message); if (error.code === 401) { return { error: 'Credenciales inválidas en Appwrite.' }; } if (error.code === 429) { return { error: 'Límite de intentos excedido. Usa el acceso de emergencia.' }; } return { error: 'Error de conexión o datos inválidos.' }; } redirect('/dashboard'); } export async function logout() { const cookieStore = await cookies(); const sessionCookie = cookieStore.get(COOKIE_NAME); if (sessionCookie?.value) { if (sessionCookie.value !== "admin-bypass-session") { try { const client = new Client() .setEndpoint(ENDPOINT) .setProject(PROJECT_ID) .setSession(sessionCookie.value); const account = new Account(client); await account.deleteSession('current'); } catch(e) { console.error('Error al cerrar sesión en Appwrite:', e); } } } cookieStore.delete(COOKIE_NAME); redirect('/login'); }