From df1df8a681e8db0ad8d8336e49146036296e61dc Mon Sep 17 00:00:00 2001 From: "Carlos (Almeira)" Date: Wed, 1 Jul 2026 18:49:23 -0500 Subject: [PATCH] Fix media upload logic: generate DB document with magic SEO formatting --- src/app/actions/appwrite.ts | 17 +++++++++++++++-- src/app/dashboard/media/new/page.tsx | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/app/actions/appwrite.ts b/src/app/actions/appwrite.ts index b5772f4..94003fd 100644 --- a/src/app/actions/appwrite.ts +++ b/src/app/actions/appwrite.ts @@ -97,6 +97,10 @@ export async function uploadMediaDocumentServer(formData: FormData) { const databases = new Databases(client); const files = formData.getAll('files') as File[]; + const tituloBase = formData.get('titulo')?.toString() || ''; + const altTextBase = formData.get('alt_text')?.toString() || ''; + const descSeo = formData.get('descripcion_seo')?.toString() || ''; + if (!files || files.length === 0) { throw new Error('No se encontraron archivos para subir'); } @@ -107,11 +111,20 @@ export async function uploadMediaDocumentServer(formData: FormData) { const inputFile = InputFile.fromBuffer(buffer, file.name); const uploadedFile = await storage.createFile(APPWRITE_ALMEIRA_CONFIG.mediaBucketId, ID.unique(), inputFile); + // Generador mágico de SEO (quitar extensión, guiones, y números finales) + const rawName = file.name.split('.').slice(0, -1).join('.'); // Sin extensión + const cleanName = rawName + .replace(/[-_]/g, ' ') // Cambiar guiones o underscores por espacios + .replace(/\d+$/, '') // Eliminar números al final (foto1 -> foto) + .trim(); + const smartTitle = cleanName.charAt(0).toUpperCase() + cleanName.slice(1); + const doc = await databases.createDocument(DATABASE_ID, 'media', ID.unique(), { file_id: uploadedFile.$id, bucket_id: APPWRITE_ALMEIRA_CONFIG.mediaBucketId, - titulo: file.name, - alt_text: file.name.split('.')[0], + titulo: tituloBase || smartTitle || file.name, + alt_text: altTextBase || smartTitle || rawName, + descripcion_seo: descSeo, tipo: file.type.startsWith('image/') ? 'imagen' : 'video' }); results.push(doc); diff --git a/src/app/dashboard/media/new/page.tsx b/src/app/dashboard/media/new/page.tsx index 110939e..8bcfefd 100644 --- a/src/app/dashboard/media/new/page.tsx +++ b/src/app/dashboard/media/new/page.tsx @@ -3,7 +3,7 @@ import { useState } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; -import { uploadMediaServer } from '@/app/actions/appwrite'; +import { uploadMediaDocumentServer } from '@/app/actions/appwrite'; import { UploadCloud, Layers, Plus } from 'lucide-react'; export default function NewMediaPage() { @@ -38,7 +38,7 @@ export default function NewMediaPage() { try { // Native Server Action Upload - Bypass browser authentication errors - const res = await uploadMediaServer(formData); + const res = await uploadMediaDocumentServer(formData); if (res.success) { router.push('/dashboard/media');