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.
56 lines
1.8 KiB
TypeScript
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;
|
|
}
|