import { count, desc, eq } from "drizzle-orm"; import { apiJson } from "@/lib/api"; import { FALLBACK_HOTEL_NAME } from "@/lib/brand"; import { db, User, WebsiteArticles } from "@/lib/db"; import { resolveHotelName } from "@/lib/hotel-name"; import { apiCacheKey, cacheSafe, redisCache } from "@/lib/redis-cache"; /** * GET /api/home — combined landing payload: the latest 4 website_articles and * the current online player count (users.online === "1"). Mirrors the queries * used by the public pages and the admin dashboard. */ export async function GET(_req: Request) { try { const data = await redisCache(apiCacheKey("home"), 15, async () => { const [articles, onlineRows, hotelName] = await Promise.all([ db .select({ id: WebsiteArticles.id, title: WebsiteArticles.title, slug: WebsiteArticles.slug, shortStory: WebsiteArticles.shortStory, image: WebsiteArticles.image, createdAt: WebsiteArticles.createdAt, }) .from(WebsiteArticles) .orderBy(desc(WebsiteArticles.createdAt)) .limit(4), db.select({ total: count() }).from(User).where(eq(User.online, "1")), resolveHotelName(), ]); return cacheSafe({ articles, online: onlineRows[0]?.total ?? 0, hotelName, }); }); return apiJson(data); } catch { return apiJson( { articles: [], online: 0, hotelName: FALLBACK_HOTEL_NAME }, { status: 200 }, ); } }