import { getMediaFoundationSummary, listMediaAssets } from "@cms/db" import { AdminShell } from "@/components/admin-shell" import { FlashQueryCleanup } from "@/components/media/flash-query-cleanup" import { MediaUploadForm } from "@/components/media/media-upload-form" import { resolveMediaStorageProvider } from "@/lib/media/storage" import { requirePermissionForRoute } from "@/lib/route-guards" export const dynamic = "force-dynamic" type SearchParamsInput = Record function readFirstValue(value: string | string[] | undefined): string | null { if (Array.isArray(value)) { return value[0] ?? null } return value ?? null } export default async function MediaManagementPage({ searchParams, }: { searchParams: Promise }) { const role = await requirePermissionForRoute({ nextPath: "/media", permission: "media:read", scope: "team", }) const [resolvedSearchParams, summary, assets] = await Promise.all([ searchParams, getMediaFoundationSummary(), listMediaAssets(20), ]) const notice = readFirstValue(resolvedSearchParams.notice) const error = readFirstValue(resolvedSearchParams.error) const uploadedVia = readFirstValue(resolvedSearchParams.uploadedVia) const warning = readFirstValue(resolvedSearchParams.warning) const activeStorageProvider = resolveMediaStorageProvider(process.env.CMS_MEDIA_STORAGE_PROVIDER) const hasFlashQuery = Boolean(notice || error || warning || uploadedVia) return ( {notice ? (
{notice} {uploadedVia ? ( Stored via: {uploadedVia} ) : null}
) : null} {error ? (
{error}
) : null} {warning ? (
{warning}
) : null}

Media Assets

{summary.mediaAssets}

Artworks

{summary.artworks}

Groups

{summary.galleries + summary.albums + summary.categories + summary.tags}

{summary.galleries} galleries · {summary.albums} albums · {summary.categories}{" "} categories · {summary.tags} tags

Upload Media Asset

Upload storage provider: {activeStorageProvider}. You can switch via `CMS_MEDIA_STORAGE_PROVIDER` (`s3` default, `local` fallback) until the admin settings toggle lands.

Recent Media Assets

MVP1 Upload Pipeline
{assets.length === 0 ? ( ) : ( assets.map((asset) => ( )) )}
Title Type MIME Size Published Updated
No media assets yet. Upload your first asset above.
{asset.title} {asset.type} {asset.mimeType ?? "-"} {typeof asset.sizeBytes === "number" ? `${Math.max(1, Math.round(asset.sizeBytes / 1024))} KB` : "-"} {asset.isPublished ? "yes" : "no"} {asset.updatedAt.toLocaleDateString("en-US")}
) }