diff --git a/app/[locale]/(site)/layout.tsx b/app/[locale]/(site)/layout.tsx
index 401e0a9..134e916 100644
--- a/app/[locale]/(site)/layout.tsx
+++ b/app/[locale]/(site)/layout.tsx
@@ -1,13 +1,26 @@
import type { ReactNode } from "react";
+import { redirect } from "next/navigation";
import { Footer } from "@/components/footer";
import { Navbar } from "@/components/navbar";
+import { getMaintenanceMode } from "@/lib/app-config";
+import { resolveLocale } from "@/lib/site-data";
type SiteLayoutProps = {
children: ReactNode;
+ params: {
+ locale: string;
+ };
};
-export default function SiteLayout({ children }: SiteLayoutProps) {
+export default async function SiteLayout({ children, params: { locale } }: SiteLayoutProps) {
+ const localeKey = resolveLocale(locale);
+ const maintenanceEnabled = await getMaintenanceMode();
+
+ if (maintenanceEnabled) {
+ redirect(`/${localeKey}/coming-soon`);
+ }
+
return (
diff --git a/middleware.ts b/middleware.ts
index 7d0649e..b8dfa6a 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -5,37 +5,6 @@ import type { NextRequest } from "next/server";
import { routing } from "./i18n/routing";
const intlMiddleware = createMiddleware(routing);
-const ADMIN_SESSION_COOKIE = "moh_admin_session";
-
-async function isMaintenanceModeEnabled(request: NextRequest): Promise {
- try {
- const response = await fetch(`${request.nextUrl.origin}/api/maintenance`, {
- cache: "no-store",
- headers: {
- "x-middleware-cache": "bypass",
- },
- });
-
- if (!response.ok) {
- return false;
- }
-
- const data = (await response.json()) as { enabled?: boolean };
- return data.enabled === true;
- } catch {
- return false;
- }
-}
-
-function getLocaleFromPath(pathname: string): (typeof routing.locales)[number] {
- const firstSegment = pathname.split("/").filter(Boolean)[0];
-
- if (routing.locales.includes(firstSegment as (typeof routing.locales)[number])) {
- return firstSegment as (typeof routing.locales)[number];
- }
-
- return routing.defaultLocale;
-}
function isRootBasicAuthConfigured(): boolean {
return Boolean(process.env.ROOT_BASIC_AUTH_USER && process.env.ROOT_BASIC_AUTH_PASS);
@@ -70,58 +39,11 @@ function isRootBasicAuthValid(request: NextRequest): boolean {
}
}
-async function isSuperAdminSessionValid(request: NextRequest): Promise {
- const token = request.cookies.get(ADMIN_SESSION_COOKIE)?.value;
- const secret = process.env.ADMIN_AUTH_SECRET;
-
- if (!token || !secret) {
- return false;
- }
-
- const parts = token.split(".");
- if (parts.length !== 2) {
- return false;
- }
-
- const [value, signature] = parts;
- if (!value || !signature) {
- return false;
- }
-
- try {
- const key = await crypto.subtle.importKey(
- "raw",
- new TextEncoder().encode(secret),
- { name: "HMAC", hash: "SHA-256" },
- false,
- ["sign"],
- );
- const signed = await crypto.subtle.sign(
- "HMAC",
- key,
- new TextEncoder().encode(value),
- );
- const expected = Array.from(new Uint8Array(signed))
- .map((byte) => byte.toString(16).padStart(2, "0"))
- .join("");
-
- return signature === expected;
- } catch {
- return false;
- }
-}
-
export default async function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
- const locale = getLocaleFromPath(pathname);
const isRootBaseRoute = pathname === "/root" || pathname.startsWith("/root/");
const isRootRoute = isRootBaseRoute;
- const isComingSoonRoute =
- pathname === "/coming-soon" ||
- pathname.startsWith("/coming-soon/") ||
- pathname === `/${locale}/coming-soon` ||
- pathname.startsWith(`/${locale}/coming-soon/`);
if (isRootRoute && isRootBasicAuthConfigured() && !isRootBasicAuthValid(request)) {
return new NextResponse("Authentication required", {
@@ -136,14 +58,6 @@ export default async function middleware(request: NextRequest) {
return NextResponse.next();
}
- if (!isRootRoute && !isComingSoonRoute) {
- const maintenanceModeEnabled = await isMaintenanceModeEnabled(request);
-
- if (maintenanceModeEnabled) {
- return NextResponse.redirect(new URL(`/${locale}/coming-soon`, request.url));
- }
- }
-
return intlMiddleware(request);
}