Refactor admin area and remove legacy root paths
CI / quality (push) Waiting to run

This commit is contained in:
MOH
2026-03-13 16:14:04 +01:00
parent e32ac4cacb
commit db897e22bf
65 changed files with 216 additions and 140 deletions
@@ -1,7 +1,7 @@
import { redirect } from "next/navigation";
import { MotionFade } from "@/components/motion-fade";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getMaintenanceMode } from "@/lib/app-config";
import { AppCard } from "@/components/ui/app-card";
@@ -27,7 +27,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootMaintenancePage() {
export default async function AdminMaintenancePage() {
const authenticated = await isAdminAuthenticated();
if (!authenticated) {
@@ -43,7 +43,7 @@ export default async function RootMaintenancePage() {
}
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="maintenance"
logoutAction={logoutAction}
@@ -63,6 +63,6 @@ export default async function RootMaintenancePage() {
</CardContent>
</AppCard>
</MotionFade>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,7 +1,7 @@
import { redirect } from "next/navigation";
import { MarqueeSettingsForm } from "@/components/root/marquee-settings-form";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { MarqueeSettingsForm } from "@/components/admin/marquee-settings-form";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { MotionFade } from "@/components/motion-fade";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getMarqueeSettings } from "@/lib/app-config";
@@ -25,7 +25,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootMarqueePage() {
export default async function AdminMarqueePage() {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -40,7 +40,7 @@ export default async function RootMarqueePage() {
const marqueeSettings = await getMarqueeSettings();
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="marquee"
logoutAction={logoutAction}
@@ -55,6 +55,6 @@ export default async function RootMarqueePage() {
/>
</MotionFade>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,7 +1,7 @@
import { redirect } from "next/navigation";
import { MediaLibraryManager } from "@/components/root/media-library-manager";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { MediaLibraryManager } from "@/components/admin/media-library-manager";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getAdminMediaAssets } from "@/lib/media";
@@ -20,7 +20,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootMediaPage() {
export default async function AdminMediaPage() {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -35,7 +35,7 @@ export default async function RootMediaPage() {
const mediaAssets = await getAdminMediaAssets();
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="media"
logoutAction={logoutAction}
@@ -45,6 +45,6 @@ export default async function RootMediaPage() {
<div className="space-y-6">
<MediaLibraryManager mediaAssets={mediaAssets} />
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
+8 -8
View File
@@ -4,7 +4,7 @@ import { redirect } from "next/navigation";
import { Container } from "@/components/layout/container";
import { StatsCard } from "@/components/dashboard/stats-card";
import { MotionFade } from "@/components/motion-fade";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { Badge } from "@/components/ui/badge";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader } from "@/components/ui/card";
@@ -24,7 +24,7 @@ import { getMaintenanceMode } from "@/lib/app-config";
import { getAdminMediaAssets } from "@/lib/media";
import { getAdminPortfolioCategories, getAdminPortfolioProjects } from "@/lib/portfolio";
type RootPageProps = {
type AdminPageProps = {
searchParams?: Promise<{
error?: string;
}>;
@@ -43,14 +43,14 @@ const copy = {
uiKit: "UI Kit",
logout: "Ausloggen",
backToSite: "Zur Website",
loginTitle: "Root Login",
loginTitle: "Admin Login",
loginText: "Nur autorisierte Nutzer duerfen diesen Bereich verwenden.",
passwordLabel: "Passwort",
loginButton: "Einloggen",
invalidLogin: "Falsches Passwort.",
lockedLogin: "Zu viele Fehlversuche. Bitte spaeter erneut versuchen.",
configMissing: "ADMIN_PASSWORD und ADMIN_AUTH_SECRET fehlen in env.",
basicAuthMissing: "ROOT_BASIC_AUTH_USER und ROOT_BASIC_AUTH_PASS fehlen in env.",
basicAuthMissing: "ADMIN_BASIC_AUTH_USER und ADMIN_BASIC_AUTH_PASS fehlen in env.",
maintenanceOn: "Aktiv",
maintenanceOff: "Inaktiv",
portfolioOnline: "Portfolio online",
@@ -60,11 +60,11 @@ const copy = {
activeCategories: "Active Categories",
};
export default async function RootPage({ searchParams }: RootPageProps) {
export default async function AdminPage({ searchParams }: AdminPageProps) {
const resolvedSearchParams = await searchParams;
const authConfigured = isAdminAuthConfigured();
const basicConfigured = Boolean(
process.env.ROOT_BASIC_AUTH_USER && process.env.ROOT_BASIC_AUTH_PASS,
process.env.ADMIN_BASIC_AUTH_USER && process.env.ADMIN_BASIC_AUTH_PASS,
);
const authenticated = await isAdminAuthenticated();
const lockState = await getAdminLockState();
@@ -182,7 +182,7 @@ export default async function RootPage({ searchParams }: RootPageProps) {
const imageCount = mediaAssets.filter((asset) => asset.kind === "IMAGE").length;
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="overview"
logoutAction={logoutAction}
@@ -238,6 +238,6 @@ export default async function RootPage({ searchParams }: RootPageProps) {
</MotionFade>
</section>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,7 +1,7 @@
import { redirect } from "next/navigation";
import { PortfolioCategoriesManager } from "@/components/root/portfolio-categories-manager";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { PortfolioCategoriesManager } from "@/components/admin/portfolio-categories-manager";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getAdminPortfolioCategories } from "@/lib/portfolio";
@@ -22,7 +22,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootPortfolioCategoriesPage() {
export default async function AdminPortfolioCategoriesPage() {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -39,7 +39,7 @@ export default async function RootPortfolioCategoriesPage() {
const assignedProjects = categories.reduce((sum, category) => sum + category.projectCount, 0);
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="portfolio"
portfolioChild="categories"
@@ -56,6 +56,6 @@ export default async function RootPortfolioCategoriesPage() {
removeCategoryAction={deleteCategoryAction}
/>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,5 +1,5 @@
import { redirect } from "next/navigation";
export default function RootPortfolioMediaRedirectPage() {
export default function AdminPortfolioMediaRedirectPage() {
redirect("/media");
}
@@ -1,7 +1,7 @@
import { redirect } from "next/navigation";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { PortfolioProjectsOverview } from "@/components/root/portfolio-projects-overview";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { PortfolioProjectsOverview } from "@/components/admin/portfolio-projects-overview";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getAdminPortfolioCategories, getAdminPortfolioProjects } from "@/lib/portfolio";
@@ -20,7 +20,7 @@ const copy = {
backToSite: "Zur Website",
};
type RootPortfolioPageProps = {
type AdminPortfolioPageProps = {
searchParams?: Promise<{
category?: string;
status?: "all" | "draft" | "published";
@@ -29,7 +29,7 @@ type RootPortfolioPageProps = {
}>;
};
export default async function RootPortfolioPage({ searchParams }: RootPortfolioPageProps) {
export default async function AdminPortfolioPage({ searchParams }: AdminPortfolioPageProps) {
const resolvedSearchParams = await searchParams;
if (!(await isAdminAuthenticated())) {
@@ -58,7 +58,7 @@ export default async function RootPortfolioPage({ searchParams }: RootPortfolioP
]);
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="portfolio"
portfolioChild="overview"
@@ -74,6 +74,6 @@ export default async function RootPortfolioPage({ searchParams }: RootPortfolioP
selectedStatus={selectedStatus}
/>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,8 +1,8 @@
import { redirect } from "next/navigation";
import { MotionFade } from "@/components/motion-fade";
import { PortfolioProjectForm } from "@/components/root/portfolio-project-form";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { PortfolioProjectForm } from "@/components/admin/portfolio-project-form";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { AppCard } from "@/components/ui/app-card";
import { Button } from "@/components/ui/button";
import { CardContent } from "@/components/ui/card";
@@ -43,15 +43,15 @@ const copy = {
deleteProject: "Projekt loeschen",
};
type RootPortfolioProjectPageProps = {
type AdminPortfolioProjectPageProps = {
params: Promise<{
id: string;
}>;
};
export default async function RootPortfolioProjectPage({
export default async function AdminPortfolioProjectPage({
params,
}: RootPortfolioProjectPageProps) {
}: AdminPortfolioProjectPageProps) {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -76,7 +76,7 @@ export default async function RootPortfolioProjectPage({
}
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="portfolio"
portfolioChild="projects"
@@ -132,6 +132,6 @@ export default async function RootPortfolioProjectPage({
</AppCard>
</MotionFade>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,8 +1,8 @@
import { redirect } from "next/navigation";
import { MotionFade } from "@/components/motion-fade";
import { PortfolioProjectForm } from "@/components/root/portfolio-project-form";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { PortfolioProjectForm } from "@/components/admin/portfolio-project-form";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getMediaOptions } from "@/lib/media";
import { getActivePortfolioCategories } from "@/lib/portfolio";
@@ -24,7 +24,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootNewPortfolioProjectPage() {
export default async function AdminNewPortfolioProjectPage() {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -42,7 +42,7 @@ export default async function RootNewPortfolioProjectPage() {
]);
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="portfolio"
portfolioChild="new-project"
@@ -61,6 +61,6 @@ export default async function RootNewPortfolioProjectPage() {
/>
</MotionFade>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,7 +1,7 @@
import { redirect } from "next/navigation";
import { PortfolioProjectsOverview } from "@/components/root/portfolio-projects-overview";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { PortfolioProjectsOverview } from "@/components/admin/portfolio-projects-overview";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getAdminPortfolioCategories, getAdminPortfolioProjects } from "@/lib/portfolio";
@@ -20,16 +20,16 @@ const copy = {
backToSite: "Zur Website",
};
type RootPortfolioProjectsPageProps = {
type AdminPortfolioProjectsPageProps = {
searchParams?: Promise<{
category?: string;
status?: "all" | "draft" | "published";
}>;
};
export default async function RootPortfolioProjectsPage({
export default async function AdminPortfolioProjectsPage({
searchParams,
}: RootPortfolioProjectsPageProps) {
}: AdminPortfolioProjectsPageProps) {
const resolvedSearchParams = await searchParams;
if (!(await isAdminAuthenticated())) {
@@ -58,7 +58,7 @@ export default async function RootPortfolioProjectsPage({
]);
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="portfolio"
portfolioChild="projects"
@@ -74,6 +74,6 @@ export default async function RootPortfolioProjectsPage({
selectedStatus={selectedStatus}
/>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -2,8 +2,8 @@ import { MediaKind } from "@prisma/client";
import { redirect } from "next/navigation";
import { MotionFade } from "@/components/motion-fade";
import { SiteSettingsForm } from "@/components/root/site-settings-form";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { SiteSettingsForm } from "@/components/admin/site-settings-form";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import {
getSiteSettings,
@@ -29,7 +29,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootSiteSettingsPage() {
export default async function AdminSiteSettingsPage() {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -48,7 +48,7 @@ export default async function RootSiteSettingsPage() {
]);
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="site-settings"
logoutAction={logoutAction}
@@ -65,6 +65,6 @@ export default async function RootSiteSettingsPage() {
/>
</MotionFade>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,8 +1,8 @@
import { redirect } from "next/navigation";
import { MotionFade } from "@/components/motion-fade";
import { ContactProtectionForm } from "@/components/root/contact-protection-form";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { ContactProtectionForm } from "@/components/admin/contact-protection-form";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getContactProtectionFormValues } from "@/lib/app-config";
@@ -25,7 +25,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootSMTPProtectionPage() {
export default async function AdminSMTPProtectionPage() {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -40,7 +40,7 @@ export default async function RootSMTPProtectionPage() {
const settings = await getContactProtectionFormValues();
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="smtp"
smtpChild="contact-protection"
@@ -56,6 +56,6 @@ export default async function RootSMTPProtectionPage() {
/>
</MotionFade>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,8 +1,8 @@
import { redirect } from "next/navigation";
import { MotionFade } from "@/components/motion-fade";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { SMTPSettingsForm } from "@/components/root/smtp-settings-form";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { SMTPSettingsForm } from "@/components/admin/smtp-settings-form";
import { Button } from "@/components/ui/button";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { getMailSettingsFormValues } from "@/lib/app-config";
@@ -26,7 +26,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootSMTPPage() {
export default async function AdminSMTPPage() {
if (!(await isAdminAuthenticated())) {
redirect("/");
}
@@ -41,7 +41,7 @@ export default async function RootSMTPPage() {
const mailSettings = await getMailSettingsFormValues();
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="smtp"
smtpChild="settings"
@@ -64,6 +64,6 @@ export default async function RootSMTPPage() {
/>
</MotionFade>
</div>
</RootDashboardShell>
</AdminDashboardShell>
);
}
@@ -1,7 +1,7 @@
import { redirect } from "next/navigation";
import { MotionFade } from "@/components/motion-fade";
import { RootDashboardShell } from "@/components/root/root-dashboard-shell";
import { AdminDashboardShell } from "@/components/admin/admin-dashboard-shell";
import { clearAdminSessionCookie, isAdminAuthenticated } from "@/lib/admin-auth";
import { UiKitShowcase } from "@/components/ui/ui-kit-showcase";
@@ -9,7 +9,7 @@ export const dynamic = "force-dynamic";
const copy = {
title: "UI Kit",
subtitle: "Globale Referenz fuer das visuelle System im Root Bereich.",
subtitle: "Globale Referenz fuer das visuelle System im Admin Bereich.",
maintenance: "Wartungsmodus",
overview: "Uebersicht",
uiKit: "UI Kit",
@@ -20,7 +20,7 @@ const copy = {
backToSite: "Zur Website",
};
export default async function RootUiKitPage() {
export default async function AdminUiKitPage() {
const authenticated = await isAdminAuthenticated();
if (!authenticated) {
@@ -35,7 +35,7 @@ export default async function RootUiKitPage() {
}
return (
<RootDashboardShell
<AdminDashboardShell
copy={copy}
active="ui-kit"
logoutAction={logoutAction}
@@ -45,6 +45,6 @@ export default async function RootUiKitPage() {
<MotionFade delay={0.1}>
<UiKitShowcase localeKey="de" />
</MotionFade>
</RootDashboardShell>
</AdminDashboardShell>
);
}
+2 -2
View File
@@ -1,2 +1,2 @@
export { metadata } from "../root/layout";
export { default } from "../root/layout";
export { metadata } from "../_admin/layout";
export { default } from "../_admin/layout";
+2 -2
View File
@@ -1,2 +1,2 @@
export { dynamic } from "../../root/maintenance/page";
export { default } from "../../root/maintenance/page";
export { dynamic } from "../../_admin/maintenance/page";
export { default } from "../../_admin/maintenance/page";
+1 -1
View File
@@ -1 +1 @@
export { default } from "../../root/marquee/page";
export { default } from "../../_admin/marquee/page";
+2 -2
View File
@@ -1,2 +1,2 @@
export { dynamic } from "../../root/media/page";
export { default } from "../../root/media/page";
export { dynamic } from "../../_admin/media/page";
export { default } from "../../_admin/media/page";
+2 -2
View File
@@ -1,2 +1,2 @@
export { dynamic } from "../root/page";
export { default } from "../root/page";
export { dynamic } from "../_admin/page";
export { default } from "../_admin/page";
@@ -1 +1 @@
export { default } from "../../../root/portfolio/categories/page";
export { default } from "../../../_admin/portfolio/categories/page";
+1 -1
View File
@@ -1 +1 @@
export { default } from "../../../root/portfolio/media/page";
export { default } from "../../../_admin/portfolio/media/page";
+1 -1
View File
@@ -1 +1 @@
export { default } from "../../root/portfolio/page";
export { default } from "../../_admin/portfolio/page";
@@ -1 +1 @@
export { default } from "../../../../root/portfolio/projects/[id]/page";
export { default } from "../../../../_admin/portfolio/projects/[id]/page";
@@ -1 +1 @@
export { default } from "../../../../root/portfolio/projects/new/page";
export { default } from "../../../../_admin/portfolio/projects/new/page";
@@ -1 +1 @@
export { default } from "../../../root/portfolio/projects/page";
export { default } from "../../../_admin/portfolio/projects/page";
+1 -1
View File
@@ -1 +1 @@
export { default } from "../../root/site-settings/page";
export { default } from "../../_admin/site-settings/page";
@@ -1 +1 @@
export { default } from "../../../root/smtp/contact-protection/page";
export { default } from "../../../_admin/smtp/contact-protection/page";
+1 -1
View File
@@ -1 +1 @@
export { default } from "../../root/smtp/page";
export { default } from "../../_admin/smtp/page";
+1 -1
View File
@@ -1 +1 @@
export { default } from "../../root/ui-kit/page";
export { default } from "../../_admin/ui-kit/page";
+1 -1
View File
@@ -3,7 +3,7 @@ import { unstable_noStore as noStore } from "next/cache";
import localFont from "next/font/local";
import Script from "next/script";
import { getLocale } from "next-intl/server";
import { QueryToastBridge } from "@/components/root/query-toast-bridge";
import { QueryToastBridge } from "@/components/admin/query-toast-bridge";
import { SoundProvider } from "@/components/sound-provider";
import { ThemeProvider } from "@/components/theme-provider";
import { Toaster } from "@/components/ui/toaster";