ab599d55c9
Build and deploy / deploy (push) Successful in 35s
Nouvelle page /mur : chaque Citoyen peut publier une note anonyme par jour (dix places max sur le mur, remis à zéro chaque jour — filtrage par date, jamais de suppression). L'anonymat n'est qu'à moitié réel : les Archontes voient une section "Historique complet" (filtrable par jour) avec l'auteur de chaque note, cohérent avec le thème du site où les Archontes ont un ascendant sur les Citoyens. Nouvelle table wall_notes + deux RPC : wall_notes_today() ne renvoie jamais l'auteur (seul moyen de garantir l'anonymat côté serveur, la RLS ne pouvant pas masquer une colonne pour certaines lignes) et post_wall_note() applique les règles (un juge ne publie pas, une note par jour, mur plafonné à 10). Pas de gel lié à la date du Tribunal : contrairement au Char, c'est une mécanique de toute la semaine.
64 lines
1.8 KiB
TypeScript
64 lines
1.8 KiB
TypeScript
import { createServerClient } from "@supabase/ssr";
|
|
import { NextResponse, type NextRequest } from "next/server";
|
|
|
|
const PROTECTED_PATHS = [
|
|
"/leaderboard",
|
|
"/profile",
|
|
"/admin",
|
|
"/journal",
|
|
"/calendrier",
|
|
"/icare",
|
|
"/char",
|
|
"/mur",
|
|
];
|
|
// /signup n'est PAS dans AUTH_PATHS : un compte fraîchement invité a déjà une
|
|
// session (établie par le lien d'invitation) mais doit pouvoir rester sur
|
|
// /signup pour finaliser mot de passe/pseudo/photo sans être renvoyé au
|
|
// leaderboard par ce redirect avant d'avoir terminé.
|
|
const AUTH_PATHS = ["/login"];
|
|
|
|
export async function updateSession(request: NextRequest) {
|
|
let response = 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) {
|
|
cookiesToSet.forEach(({ name, value }) => request.cookies.set(name, value));
|
|
response = NextResponse.next({ request });
|
|
cookiesToSet.forEach(({ name, value, options }) =>
|
|
response.cookies.set(name, value, options),
|
|
);
|
|
},
|
|
},
|
|
},
|
|
);
|
|
|
|
const {
|
|
data: { user },
|
|
} = await supabase.auth.getUser();
|
|
|
|
const { pathname } = request.nextUrl;
|
|
const isProtected = PROTECTED_PATHS.some((path) => pathname.startsWith(path));
|
|
const isAuthPath = AUTH_PATHS.some((path) => pathname.startsWith(path));
|
|
|
|
if (!user && isProtected) {
|
|
const url = request.nextUrl.clone();
|
|
url.pathname = "/login";
|
|
return NextResponse.redirect(url);
|
|
}
|
|
|
|
if (user && isAuthPath) {
|
|
const url = request.nextUrl.clone();
|
|
url.pathname = "/leaderboard";
|
|
return NextResponse.redirect(url);
|
|
}
|
|
|
|
return response;
|
|
}
|