+ Under Maintenance +
++ The website is undergoing scheduled maintenance. Please try + reloading the page in a few minutes. +
+diff --git a/package-lock.json b/package-lock.json index cfd259d..74753bf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,6 +36,7 @@ "@trpc/react-query": "^10.43.6", "@trpc/server": "^10.43.6", "@upstash/ratelimit": "^1.0.0", + "@vercel/edge-config": "^1.1.0", "@vercel/speed-insights": "^1.0.10", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", @@ -3087,6 +3088,31 @@ "crypto-js": "^4.2.0" } }, + "node_modules/@vercel/edge-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@vercel/edge-config/-/edge-config-1.1.0.tgz", + "integrity": "sha512-es/4BzzKfyUilL5E1knR42MZHJqHMRfqitrnv18gVZZUha9ywrX3qNoCrPsNMJ1HS8xAAz/FJEyel7YFIDfKoQ==", + "dependencies": { + "@vercel/edge-config-fs": "0.1.0", + "ts-essentials": "9.4.1" + }, + "engines": { + "node": ">=14.6" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.7.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + } + } + }, + "node_modules/@vercel/edge-config-fs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@vercel/edge-config-fs/-/edge-config-fs-0.1.0.tgz", + "integrity": "sha512-NRIBwfcS0bUoUbRWlNGetqjvLSwgYH/BqKqDN7vK1g32p7dN96k0712COgaz6VFizAm9b0g6IG6hR6+hc0KCPg==" + }, "node_modules/@vercel/speed-insights": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.0.10.tgz", @@ -9788,6 +9814,19 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-essentials": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.1.tgz", + "integrity": "sha512-oke0rI2EN9pzHsesdmrOrnqv1eQODmJpd/noJjwj2ZPC3Z4N2wbjrOEqnsEgmvlO2+4fBb0a794DCna2elEVIQ==", + "peerDependencies": { + "typescript": ">=4.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", diff --git a/package.json b/package.json index 0c2a72f..9a2fdf0 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@trpc/react-query": "^10.43.6", "@trpc/server": "^10.43.6", "@upstash/ratelimit": "^1.0.0", + "@vercel/edge-config": "^1.1.0", "@vercel/speed-insights": "^1.0.10", "class-variance-authority": "^0.7.0", "clsx": "^2.1.0", diff --git a/src/middleware.ts b/src/middleware.ts index ad94fee..9322543 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,3 +1,50 @@ -export { default } from "next-auth/middleware"; +import { get } from "@vercel/edge-config"; +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; -export const config = { matcher: ["/user/(.*)", "/admin/(.*)"] }; +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + */ + { + source: "/((?!api|_next/static|_next/image|favicon.ico).*)?", + missing: [ + { type: "header", key: "next-router-prefetch" }, + { type: "header", key: "purpose", value: "prefetch" }, + ], + }, + ], +}; + +export async function middleware(request: NextRequest) { + let isInMaintenanceMode = false; + + try { + isInMaintenanceMode = + // Don't show the maintenance page in development + process.env.VERCEL_ENV === "production" && + // Check Edge Config to see if the maintenance page should be shown + ((await get("maintenanceMode")) ?? false); + } catch (e) { + // Edge Config not accessible, log the error + console.error(e); + } + + if (isInMaintenanceMode) { + request.nextUrl.pathname = `/maintenance`; + return NextResponse.rewrite(request.nextUrl); + } + + const response = NextResponse.next({ + request: { + headers: request.headers, + }, + }); + + return response; +} diff --git a/src/pages/maintenance.tsx b/src/pages/maintenance.tsx new file mode 100644 index 0000000..63a6add --- /dev/null +++ b/src/pages/maintenance.tsx @@ -0,0 +1,24 @@ +import Head from "next/head"; + +export default function Maintenance() { + return ( + <> +
++ The website is undergoing scheduled maintenance. Please try + reloading the page in a few minutes. +
+These are resources you have proposed to the community. You can see the status of each resource below. Resources that are "Pending