import "server-only"; import { Query } from "node-appwrite"; import { adminDB, DATABASE_ID, TABLES } from "@/lib/appwrite-server"; import type { BlogPostRow, ContactMessageRow, ProjectRow, ServiceRow, SeoPageRow, SeoSettingsRow, TestimonialRow, } from "@/lib/types"; async function safeList( tableId: string, queries: string[], ): Promise { try { const res = await adminDB.listRows({ databaseId: DATABASE_ID, tableId, queries, }); return res.rows as T[]; } catch { return []; } } export async function listServices(opts?: { featured?: boolean }) { const q = [Query.orderAsc("order"), Query.limit(50)]; if (opts?.featured) q.unshift(Query.equal("featured", true)); return safeList(TABLES.services, q); } export async function listProjects(opts?: { featured?: boolean; limit?: number }) { const q = [Query.orderDesc("year"), Query.limit(opts?.limit ?? 50)]; if (opts?.featured) q.unshift(Query.equal("featured", true)); return safeList(TABLES.projects, q); } export async function listPublishedPosts(opts?: { limit?: number }) { return safeList(TABLES.blogPosts, [ Query.equal("status", "published"), Query.orderDesc("published_at"), Query.limit(opts?.limit ?? 50), ]); } export async function listAllPosts() { return safeList(TABLES.blogPosts, [ Query.orderDesc("$createdAt"), Query.limit(200), ]); } export async function getPostBySlug(slug: string): Promise { const res = await safeList(TABLES.blogPosts, [ Query.equal("slug", slug), Query.limit(1), ]); return res[0] ?? null; } export async function listTestimonials(opts?: { featured?: boolean }) { const q = [Query.orderAsc("order"), Query.limit(50)]; if (opts?.featured) q.unshift(Query.equal("featured", true)); return safeList(TABLES.testimonials, q); } export async function listMessages(status?: ContactMessageRow["status"]) { const q = [Query.orderDesc("$createdAt"), Query.limit(200)]; if (status) q.unshift(Query.equal("status", status)); return safeList(TABLES.contactMessages, q); } export async function getSeoPage(path: string): Promise { const res = await safeList(TABLES.seoPages, [ Query.equal("path", path), Query.limit(1), ]); return res[0] ?? null; } export async function listSeoPages() { return safeList(TABLES.seoPages, [ Query.orderAsc("path"), Query.limit(200), ]); } export async function getSeoSettings(): Promise { try { return await adminDB.getRow({ databaseId: DATABASE_ID, tableId: TABLES.seoSettings, rowId: "global", }); } catch { return null; } } export async function getRow(tableId: string, rowId: string): Promise { try { return (await adminDB.getRow({ databaseId: DATABASE_ID, tableId, rowId })) as T; } catch { return null; } }