import { asc, eq } from "drizzle-orm"; import Link from "next/link"; import { notFound, redirect } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { CalendarCampaigns, CalendarRewards, db } from "@/lib/db"; import { formatDate } from "@/lib/format-date"; import { canAccess, getAdminContext, PERMS } from "@/lib/permissions"; type Campaign = { id: number; name: string; image: string; startTimestamp: number; totalDays: number; lockExpired: string; enabled: string; }; type Reward = { id: number; campaignId: number; productName: string; customImage: string; credits: number; pixels: number; points: number; pointsType: number; badge: string; itemId: number; subscriptionType: string | null; subscriptionDays: number; }; export default async function AdminCalendarCampaign({ params, }: { params: Promise<{ id: string }>; }) { const { session, permissions } = await getAdminContext(); if (!canAccess(permissions, PERMS.SHOP_VIEW, session.user.rank)) { redirect("/admin"); } const t = await getTranslations("pages.admin.calendar"); const { id } = await params; const campaignId = Number(id); if (!Number.isInteger(campaignId)) notFound(); let campaign: Campaign | null = null; try { const [row] = await db .select({ id: CalendarCampaigns.id, name: CalendarCampaigns.name, image: CalendarCampaigns.image, startTimestamp: CalendarCampaigns.startTimestamp, totalDays: CalendarCampaigns.totalDays, lockExpired: CalendarCampaigns.lockExpired, enabled: CalendarCampaigns.enabled, }) .from(CalendarCampaigns) .where(eq(CalendarCampaigns.id, campaignId)) .limit(1); campaign = row ?? null; } catch { campaign = null; } if (!campaign) notFound(); let rewards: Reward[] = []; try { rewards = await db .select({ id: CalendarRewards.id, campaignId: CalendarRewards.campaignId, productName: CalendarRewards.productName, customImage: CalendarRewards.customImage, credits: CalendarRewards.credits, pixels: CalendarRewards.pixels, points: CalendarRewards.points, pointsType: CalendarRewards.pointsType, badge: CalendarRewards.badge, itemId: CalendarRewards.itemId, subscriptionType: CalendarRewards.subscriptionType, subscriptionDays: CalendarRewards.subscriptionDays, }) .from(CalendarRewards) .where(eq(CalendarRewards.campaignId, campaignId)) .orderBy(asc(CalendarRewards.id)) .limit(500); } catch { rewards = []; } const disabled = campaign.enabled !== "1"; return (

← {t("title")}

{campaign.image ? ( // eslint-disable-next-line @next/next/no-img-element {campaign.name} ) : null}

{campaign.name || `#${campaign.id}`}

{t("detail.campaignMeta", { id: campaign.id, days: campaign.totalDays, date: formatDate( new Date(campaign.startTimestamp * 1000), "date", ), })} {disabled ? ` · ${t("detail.disabled")}` : ` · ${t("detail.enabled")}`} {campaign.lockExpired === "1" ? ` · ${t("detail.locksExpired")}` : ""}

{t("detail.rewards")}

{rewards.length === 0 ? (
{t("detail.noRewards")}
) : ( {rewards.map((r) => ( ))}
{t("detail.colId")} {t("detail.colProduct")} {t("detail.colItem")} {t("detail.colCredits")} {t("detail.colPixels")} {t("detail.colPoints")} {t("detail.colBadge")} {t("detail.colSubscription")}
{r.id} {r.productName || ( — )} {r.itemId > 0 ? r.itemId : "—"} {r.credits > 0 ? ( r.credits ) : ( — )} {r.pixels > 0 ? ( r.pixels ) : ( — )} {r.points > 0 ? ( `${r.points} (${t("detail.typeLabel", { type: r.pointsType })})` ) : ( — )} {r.badge || "—"} {r.subscriptionType ? `${r.subscriptionType} · ${r.subscriptionDays}d` : "—"}
)}

{t("detail.rewardCount", { count: rewards.length })}

); }