'use server'; import { and, eq } from 'drizzle-orm'; import { revalidatePath } from 'next/cache'; import { db } from '@/db'; import { galeriaFotos } from '@/db/schema'; import { getCurrentTenantId as getTenantId } from '@/lib/auth/current-user'; import { GALERIA_MAX_FOTOS } from '@/lib/galeria'; const GALERIA_MAX_BYTES = 2_000_000; const GALERIA_TIPOS = ['image/png', 'image/jpeg', 'image/webp']; export type GaleriaResult = { ok: boolean; error?: string }; export async function subirFotoGaleria( _prev: GaleriaResult | null, formData: FormData ): Promise { const tenantId = await getTenantId(); const file = formData.get('foto'); if (!(file instanceof File) || file.size === 0) { return { ok: false, error: 'Selecciona una imagen.' }; } if (!GALERIA_TIPOS.includes(file.type)) { return { ok: false, error: 'Formato no válido. Usa PNG, JPG o WEBP.' }; } if (file.size > GALERIA_MAX_BYTES) { return { ok: false, error: 'La imagen no puede superar los 2 MB.' }; } const existentes = await db .select({ id: galeriaFotos.id }) .from(galeriaFotos) .where(eq(galeriaFotos.tenantId, tenantId)); if (existentes.length >= GALERIA_MAX_FOTOS) { return { ok: false, error: `Has alcanzado el máximo de ${GALERIA_MAX_FOTOS} fotos.` }; } const titulo = String(formData.get('titulo') ?? '').trim() || null; const base64 = Buffer.from(await file.arrayBuffer()).toString('base64'); const dataUri = `data:${file.type};base64,${base64}`; await db .insert(galeriaFotos) .values({ tenantId, url: dataUri, titulo, orden: existentes.length }); revalidatePath('/panel/galeria'); return { ok: true }; } export async function eliminarFotoGaleria(id: string) { const tenantId = await getTenantId(); await db .delete(galeriaFotos) .where(and(eq(galeriaFotos.id, id), eq(galeriaFotos.tenantId, tenantId))); revalidatePath('/panel/galeria'); }