105 lines
3.6 KiB
TypeScript
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');
|
|
}
|