almeira-web/src/app/actions/auth.ts

105 lines
3.6 KiB
TypeScript

'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');
}