import { count, desc, eq, inArray } from "drizzle-orm"; import { Store } from "lucide-react"; import Link from "next/link"; import { redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { cancelMarketplaceListing } from "@/actions/admin-marketplace"; import { AdminPageShell } from "@/components/admin/admin-page-shell"; import { AdminSimplePager } from "@/components/admin/admin-simple-pager"; import { StatusCard } from "@/components/admin/dashboard"; import { Button } from "@/components/ui/button"; import { calcPagination, parseListParams } from "@/lib/admin-helpers"; import { db, MarketplaceItems, User } from "@/lib/db"; import { formatDate } from "@/lib/format-date"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; export default async function AdminMarketplacePage({ searchParams, }: { searchParams: Promise>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.SHOP_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.marketplace"); const canEdit = canAccess(permissions, PERMS.SHOP_EDIT, session.user.rank); const raw = await searchParams; const parsed = parseListParams(new URLSearchParams(raw)); const filter = raw.filter === "sold" ? "sold" : "active"; const where = eq(MarketplaceItems.state, filter === "sold" ? 2 : 1); let total = 0; let rows: (typeof MarketplaceItems.$inferSelect)[] = []; let activeCount = 0; let soldCount = 0; let loadError = false; try { const [totalRows, activeRows, soldRows] = await Promise.all([ db.select({ total: count() }).from(MarketplaceItems).where(where), db .select({ total: count() }) .from(MarketplaceItems) .where(eq(MarketplaceItems.state, 1)), db .select({ total: count() }) .from(MarketplaceItems) .where(eq(MarketplaceItems.state, 2)), ]); total = Number(totalRows[0]?.total ?? 0); activeCount = Number(activeRows[0]?.total ?? 0); soldCount = Number(soldRows[0]?.total ?? 0); const pagination = calcPagination(total, parsed.page, parsed.perPage); rows = await db .select() .from(MarketplaceItems) .where(where) .orderBy(desc(MarketplaceItems.timestamp)) .limit(pagination.perPage) .offset(pagination.offset); } catch { loadError = true; } const pagination = calcPagination(total, parsed.page, parsed.perPage); const userIds = [ ...new Set(rows.map((r) => r.userId).filter((id) => id > 0)), ]; const users = userIds.length > 0 ? await db .select({ id: User.id, username: User.username }) .from(User) .where(inArray(User.id, userIds)) .catch(() => []) : []; const usernameById = new Map(users.map((u) => [u.id, u.username])); return (
{loadError ? (
{t("loadError")}
) : null}

{filter === "sold" ? t("soldListings") : t("activeListings")} ( {total})

{rows.length === 0 ? (
{t("empty")}
) : (
{filter === "sold" ? : null} {canEdit && filter === "active" ? ( ) : null} {rows.map((row) => ( {filter === "sold" ? ( ) : null} {canEdit && filter === "active" ? ( ) : null} ))}
{t("colId")} {t("colItem")} {t("colSeller")} {t("colPrice")} {t("colListed")}{t("colSold")}{t("colActions")}
{row.id} {row.itemId} {usernameById.get(row.userId) ?? `#${row.userId}`} {row.price} {formatDate(new Date(row.timestamp * 1000))} {formatDate( row.soldTimestamp ? new Date(row.soldTimestamp * 1000) : null, )}
)}
); }