40 lines
1.7 KiB
TypeScript
40 lines
1.7 KiB
TypeScript
// Client server-side con privilegi superuser - bypassa le API rules delle collection
|
|||
|
|
// (equivalente del service role Supabase, con una differenza: PocketBase non ha una
|
||
|
|
// chiave statica, l'autenticazione è email+password contro la collection _superusers e
|
||
|
|
// va rinnovata quando il token scade).
|
||
|
|
//
|
||
|
|
// SECURITY: usare solo per operazioni server-side fidate, mai esporre al client.
|
||
|
|
// Carica dentro gli handler server: const { pbAdmin } = await import("@/integrations/pocketbase/client.server");
|
||
|
|
// L'import a livello di modulo è sicuro solo in altri moduli *.server.ts - le route e le
|
||
|
|
// server function finiscono nel bundle client.
|
||
|
|
import PocketBase from "pocketbase";
|
||
|
|
|
||
|
|
let _pb: PocketBase | undefined;
|
||
|
|
|
||
|
|
export async function pbAdmin(): Promise<PocketBase> {
|
||
|
|
const POCKETBASE_URL = process.env["POCKETBASE_URL"];
|
||
|
|
const POCKETBASE_SUPERUSER_EMAIL = process.env["POCKETBASE_SUPERUSER_EMAIL"];
|
||
|
|
const POCKETBASE_SUPERUSER_PASSWORD = process.env["POCKETBASE_SUPERUSER_PASSWORD"];
|
||
|
|
|
||
|
|
if (!POCKETBASE_URL || !POCKETBASE_SUPERUSER_EMAIL || !POCKETBASE_SUPERUSER_PASSWORD) {
|
||
|
|
const missing = [
|
||
|
|
...(!POCKETBASE_URL ? ["POCKETBASE_URL"] : []),
|
||
|
|
...(!POCKETBASE_SUPERUSER_EMAIL ? ["POCKETBASE_SUPERUSER_EMAIL"] : []),
|
||
|
|
...(!POCKETBASE_SUPERUSER_PASSWORD ? ["POCKETBASE_SUPERUSER_PASSWORD"] : []),
|
||
|
|
];
|
||
|
|
const message = `Variabili d'ambiente PocketBase mancanti: ${missing.join(", ")}.`;
|
||
|
|
console.error(`[PocketBase] ${message}`);
|
||
|
|
throw new Error(message);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!_pb) _pb = new PocketBase(POCKETBASE_URL);
|
||
|
|
|
||
|
|
if (!_pb.authStore.isValid) {
|
||
|
|
await _pb
|
||
|
|
.collection("_superusers")
|
||
|
|
.authWithPassword(POCKETBASE_SUPERUSER_EMAIL, POCKETBASE_SUPERUSER_PASSWORD);
|
||
|
|
}
|
||
|
|
|
||
|
|
return _pb;
|
||
|
|
}
|