diff --git a/src/components/AdWrappers.tsx b/src/components/AdWrappers.tsx index 184d33f..1b9f997 100644 --- a/src/components/AdWrappers.tsx +++ b/src/components/AdWrappers.tsx @@ -48,46 +48,46 @@ export async function GlobalTopBanner() { } export async function GlobalSidebar() { + const { createAdminClient } = await import('@/lib/appwrite.server'); + const client = await createAdminClient(); let groupedAds: Record = {}; let settings = await fetchSettings(); try { - // Traemos "Display Slider", "Evento", "Clasificado" (Obtener sus IDs) - const typesRes = await databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'publication_types', []); + const typesRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'publication_types', []); const validCodes = ['DISPLAY_SLIDER', 'EVENTO', 'CLASIFICADO']; const validTypeIds = typesRes.documents.filter(t => validCodes.includes(t.codigo)).map(t => t.$id); if (validTypeIds.length > 0) { - const postsRes = await databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', [ + const postsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', [ Query.equal('estado', 'Publicado'), - Query.orderAsc('fecha_finalizacion'), // Los que caducan más pronto primero + Query.orderAsc('fecha_finalizacion'), Query.limit(50) ]); const now = new Date(); const activePosts = postsRes.documents.filter(post => { - // Filtramos por tipo y caducidad - if (!post.tipo_publicacion_id || !validTypeIds.includes(post.tipo_publicacion_id.$id)) return false; + if (!post.tipo_publicacion_id || !validTypeIds.includes(post.tipo_publicacion_id)) return false; if (post.fecha_finalizacion && new Date(post.fecha_finalizacion) < now) return false; return true; }); - // Agrupar por eslogan del cliente / patrocinador for (const post of activePosts) { let slogan = 'Patrocinado'; - // El post tiene cliente. El cliente tiene contratos activos. - // Como no queremos hacer nested queries destructivas, tomaremos el cliente_id - // y buscaremos sus contratos. if (post.cliente_id) { - const contracts = await databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'contracts', [ - Query.equal('cliente_id', post.cliente_id.$id), - Query.equal('estado', 'Activo') - ]); - if (contracts.documents.length > 0 && contracts.documents[0].eslogan) { - slogan = contracts.documents[0].eslogan; - } else { - slogan = post.cliente_id.nombre_entidad || 'General'; - } + try { + const contracts = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'contracts', [ + Query.equal('cliente_id', post.cliente_id), + Query.equal('estado', 'Activo'), + Query.limit(1) + ]); + if (contracts.documents.length > 0 && contracts.documents[0].eslogan) { + slogan = contracts.documents[0].eslogan; + } else { + // Fallback to client name if we can fetch it or if it's in the object + slogan = 'Patrocinado'; + } + } catch(e) { slogan = 'Patrocinado'; } } if (!groupedAds[slogan]) groupedAds[slogan] = []; @@ -102,3 +102,29 @@ export async function GlobalSidebar() { return } + +export async function hasSidebarContent(): Promise { + try { + const { createAdminClient } = await import('@/lib/appwrite.server'); + const client = await createAdminClient(); + const typesRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'publication_types', []); + const validCodes = ['DISPLAY_SLIDER', 'EVENTO', 'CLASIFICADO']; + const validTypeIds = typesRes.documents.filter(t => validCodes.includes(t.codigo)).map(t => t.$id); + + if (validTypeIds.length === 0) return false; + + const postsRes = await client.databases.listDocuments(APPWRITE_ALMEIRA_CONFIG.databaseId, 'posts', [ + Query.equal('estado', 'Publicado'), + Query.limit(20) + ]); + + const now = new Date(); + return postsRes.documents.some(post => { + if (!post.tipo_publicacion_id || !validTypeIds.includes(post.tipo_publicacion_id)) return false; + if (post.fecha_finalizacion && new Date(post.fecha_finalizacion) < now) return false; + return true; + }); + } catch(e) { + return false; + } +}