Files
wamarket/lib/supabase/proxy.ts
T
softgrey af81124d48 Initial commit: WaMarket MVP
Marketplace inversée (Next.js 16 App Router + Supabase Cloud) : auth,
schéma + RLS, publication de besoins avec upload d'images, feed avec
filtres, offres, acceptation via RPC, messagerie temps réel,
dashboards, et Dockerfile pour déploiement Coolify.
2026-07-30 14:33:17 +00:00

56 lines
1.8 KiB
TypeScript

import { createServerClient } from "@supabase/ssr";
import { NextResponse, type NextRequest } from "next/server";
const PROTECTED_PREFIXES = ["/dashboard", "/messages", "/needs/new"];
function isProtectedPath(pathname: string) {
if (PROTECTED_PREFIXES.some((prefix) => pathname.startsWith(prefix))) {
return true;
}
// /needs/[id]/edit
return /^\/needs\/[^/]+\/edit(\/|$)/.test(pathname);
}
export async function updateSession(request: NextRequest) {
let supabaseResponse = NextResponse.next({ request });
const supabase = createServerClient(
process.env.NEXT_PUBLIC_SUPABASE_URL!,
process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY!,
{
cookies: {
getAll() {
return request.cookies.getAll();
},
setAll(cookiesToSet, headers) {
cookiesToSet.forEach(({ name, value }) =>
request.cookies.set(name, value)
);
supabaseResponse = NextResponse.next({ request });
cookiesToSet.forEach(({ name, value, options }) =>
supabaseResponse.cookies.set(name, value, options)
);
Object.entries(headers).forEach(([key, value]) =>
supabaseResponse.headers.set(key, value)
);
},
},
}
);
// Do not run code between createServerClient and getClaims() — this
// refreshes the session token on every request, which is what keeps
// users from being randomly logged out.
const { data } = await supabase.auth.getClaims();
const user = data?.claims;
if (!user && isProtectedPath(request.nextUrl.pathname)) {
const url = request.nextUrl.clone();
url.pathname = "/auth/login";
url.searchParams.set("redirect_to", request.nextUrl.pathname);
return NextResponse.redirect(url);
}
return supabaseResponse;
}