Some checks failed
CI / build-and-test (pull_request) Failing after 1m19s
CI (.gitea/workflows/ci.yaml): lint → typecheck → vitest w/ coverage → OpenNext build → preview smoke → bundle-size budgets; Node 20; npm ci; artifacts; safe env; D1 dry-run scaffold. Budgets: add scripts/budgets.mjs; TOTAL_STATIC_MAX_BYTES and MAX_ASSET_BYTES thresholds; report top offenders; fail on breach; README CI section. Flags: add lib/flags.ts with typed booleans and safe defaults (ADMIN_ENABLED, ARTISTS_MODULE_ENABLED, UPLOADS_ADMIN_ENABLED, BOOKING_ENABLED, PUBLIC_APPOINTMENT_REQUESTS_ENABLED, REFERENCE_UPLOADS_PUBLIC_ENABLED, DEPOSITS_ENABLED, PUBLIC_DB_ARTISTS_ENABLED, ADVANCED_NAV_SCROLL_ANIMATIONS_ENABLED, STRICT_CI_GATES_ENABLED, ISR_CACHE_R2_ENABLED); robust parsing; client provider; unit tests. Wiring: gate Admin shell and admin write APIs (503 JSON on uploads and artists writes); disable booking submit and short-circuit booking mutations when off; render static Hero/Artists when advanced animations off; tests for UI and API guards. Ops: expand docs/prd/rollback-strategy.md with “Feature Flags Operations,” Cloudflare Dashboard and wrangler.toml steps, preview simulation, incident playbook, and post-toggle smoke checklist. Release: add docs/releases/2025-09-19-feature-flags-rollout.md with last-good commit, preview/production flag matrices, rollback notes, and smoke results; link from rollback doc. Chore: fix TS issues (gift-cards boolean handling, Lenis options, tailwind darkMode), remove next-on-pages peer conflict, update package.json scripts, configure Gitea act_runner label, open draft PR to trigger CI. Refs: CI-1, FF-1, FF-2, FF-3, OPS-1 Impact: defaults preserve current behavior; no runtime changes unless flags flipped
79 lines
2.5 KiB
TypeScript
79 lines
2.5 KiB
TypeScript
import { redirect } from "next/navigation"
|
||
import { getServerSession } from "next-auth/next"
|
||
import { authOptions } from "@/lib/auth"
|
||
import { UserRole } from "@/types/database"
|
||
import { AdminSidebar } from "@/components/admin/sidebar"
|
||
import { Flags } from "@/lib/flags"
|
||
|
||
export default async function AdminLayout({
|
||
children,
|
||
}: {
|
||
children: React.ReactNode
|
||
}) {
|
||
if (!Flags.ADMIN_ENABLED) {
|
||
return (
|
||
<div className="min-h-screen flex items-center justify-center p-8">
|
||
<div className="max-w-md text-center space-y-4">
|
||
<h1 className="text-2xl font-semibold">Admin temporarily unavailable</h1>
|
||
<p className="text-muted-foreground">
|
||
We’re performing maintenance or addressing an incident. Please try again later.
|
||
</p>
|
||
</div>
|
||
</div>
|
||
)
|
||
}
|
||
// Check authentication and authorization
|
||
const session = await getServerSession(authOptions)
|
||
|
||
if (!session) {
|
||
redirect("/auth/signin")
|
||
}
|
||
|
||
// Check if user has admin role
|
||
if (session.user.role !== UserRole.SHOP_ADMIN && session.user.role !== UserRole.SUPER_ADMIN) {
|
||
redirect("/unauthorized")
|
||
}
|
||
|
||
return (
|
||
<div className="flex h-screen bg-gray-100">
|
||
{/* Sidebar */}
|
||
<AdminSidebar user={session.user} />
|
||
|
||
{/* Main content */}
|
||
<div className="flex-1 flex flex-col overflow-hidden">
|
||
{/* Header */}
|
||
<header className="bg-white shadow-sm border-b border-gray-200">
|
||
<div className="flex items-center justify-between px-6 py-4">
|
||
<h1 className="text-2xl font-semibold text-gray-900">
|
||
Admin Dashboard
|
||
</h1>
|
||
<div className="flex items-center space-x-4">
|
||
<span className="text-sm text-gray-600">
|
||
Welcome, {session.user.name}
|
||
</span>
|
||
<div className="w-8 h-8 bg-gray-300 rounded-full flex items-center justify-center">
|
||
{session.user.image ? (
|
||
<img
|
||
src={session.user.image}
|
||
alt={session.user.name}
|
||
className="w-8 h-8 rounded-full"
|
||
/>
|
||
) : (
|
||
<span className="text-sm font-medium text-gray-600">
|
||
{session.user.name.charAt(0).toUpperCase()}
|
||
</span>
|
||
)}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</header>
|
||
|
||
{/* Page content */}
|
||
<main className="flex-1 overflow-y-auto p-6">
|
||
{children}
|
||
</main>
|
||
</div>
|
||
</div>
|
||
)
|
||
}
|