diff --git a/src/middleware.ts b/src/middleware.ts index 2e21078..5810867 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -1,17 +1,45 @@ -// src/middleware.ts -import { clerkMiddleware, createRouteMatcher } from '@clerk/astro/server'; -import type { AstroMiddlewareRequest, AstroMiddlewareResponse } from 'astro'; +import { clerkMiddleware, createRouteMatcher, clerkClient } from '@clerk/astro/server'; -const isProtectedRoute = createRouteMatcher([ - '/pokemon', -]); +const isProtectedRoute = createRouteMatcher(['/pokemon']); +const isAdminRoute = createRouteMatcher(['/admin']); -export const onRequest = clerkMiddleware((auth, context) => { - const { isAuthenticated, redirectToSignIn } = auth() +const TARGET_ORG_ID = "org_3Baav9czkRLLlC7g89oJWqRRulK"; + +export const onRequest = clerkMiddleware(async (auth, context) => { + const { isAuthenticated, userId, redirectToSignIn } = auth(); if (!isAuthenticated && isProtectedRoute(context.request)) { - // Add custom logic to run before redirecting - - return redirectToSignIn() + return redirectToSignIn(); } -}); + + if (isAdminRoute(context.request)) { + if (!isAuthenticated || !userId) { + return redirectToSignIn(); + } + + try { + const client = await clerkClient(context); // pass context here + const memberships = await client.organizations.getOrganizationMembershipList({ + organizationId: TARGET_ORG_ID, + }); + + console.log("Total memberships found:", memberships.data.length); + console.log("Current userId:", userId); + console.log("Memberships:", JSON.stringify(memberships.data.map(m => ({ + userId: m.publicUserData?.userId, + role: m.role, + })), null, 2)); + + const userMembership = memberships.data.find( + (m) => m.publicUserData?.userId === userId + ); + + if (!userMembership || userMembership.role !== "org:admin") { + return context.redirect("/"); + } + } catch (e) { + console.error("Clerk membership check failed:", e); + return context.redirect("/"); + } + } +}); \ No newline at end of file diff --git a/src/pages/admin.astro b/src/pages/admin.astro new file mode 100644 index 0000000..8f74735 --- /dev/null +++ b/src/pages/admin.astro @@ -0,0 +1,18 @@ +--- +export const prerender = false; +import Layout from '../layouts/Main.astro'; +import NavItems from '../components/NavItems.astro'; +import NavBar from '../components/NavBar.astro'; +import Footer from '../components/Footer.astro'; +--- + + + + +
+
+

Admin Panel

+
+
+