almeira-web/src/lib/appwrite.server.ts

84 lines
2.3 KiB
TypeScript

import { Client, Account, Databases } from 'node-appwrite';
import { cookies } from 'next/headers';
const ENDPOINT = process.env.NEXT_PUBLIC_APPWRITE_ENDPOINT || 'https://appwrite.almeira.com.co/v1';
const PROJECT_ID = process.env.NEXT_PUBLIC_APPWRITE_PROJECT_ID || '69b84df5003bd8957c5c';
const COOKIE_NAME = `a_session_${PROJECT_ID.toLowerCase()}`;
export async function createSessionClient() {
const cookieStore = await cookies();
const sessionCookie = cookieStore.get(COOKIE_NAME);
if (!sessionCookie || !sessionCookie.value) {
return null;
}
const client = new Client()
.setEndpoint(ENDPOINT)
.setProject(PROJECT_ID);
// Soporte para bypass de administrador (Emergencia/Dev)
if (sessionCookie.value === "admin-bypass-session") {
// Escalamos a privilegios de API Key para el bypass
client.setKey(process.env.APPWRITE_API_KEY || '');
} else {
client.setSession(sessionCookie.value);
}
return {
get account() {
return new Account(client);
},
get databases() {
return new Databases(client);
}
};
}
export async function createAdminClient() {
const client = new Client()
.setEndpoint(ENDPOINT)
.setProject(PROJECT_ID)
.setKey(process.env.APPWRITE_API_KEY || '');
return {
get account() {
return new Account(client);
},
get databases() {
return new Databases(client);
}
};
}
export async function getLoggedInUser() {
try {
const cookieStore = await cookies();
const sessionCookie = cookieStore.get(COOKIE_NAME);
// Verificación de bypass (Funciona en todos los entornos)
if (sessionCookie?.value === "admin-bypass-session") {
console.log("Acceso de emergencia detectado en Dashboard.");
return {
$id: "admin-emergency",
name: "Administrador (Emergencia)",
email: "admin@almeira.com.co",
prefs: {}
};
}
const sessionClient = await createSessionClient();
if (!sessionClient) {
console.log("getLoggedInUser: No se encontró cookie de sesión o cliente inválido.");
return null;
}
const user = await sessionClient.account.get();
console.log("getLoggedInUser: Sesión validada para usuario:", user.email);
return user;
} catch (error: any) {
console.error("getLoggedInUser: Error al validar sesión:", error.message || error);
return null;
}
}