Checkpoint: Correction du login : routers.ts utilise maintenant input.identifier au lieu de input.email, LocalAuthContext.tsx mis à jour en conséquence. La connexion par username (adminItinova) fonctionne en recette.

This commit is contained in:
Manus
2026-04-21 06:29:48 -04:00
parent b3137e8f27
commit 9c3d3ef18d
4 changed files with 16 additions and 14 deletions

View File

@@ -1,4 +1,4 @@
{
"version": "59dcc8d3",
"timestamp": 1776763904784
"version": "cf6f7264",
"timestamp": 1776767388974
}

View File

@@ -1,17 +1,18 @@
import { createContext, useContext, useState, useEffect, ReactNode } from "react";
import { createContext, useContext, useState, ReactNode } from "react";
import { trpc } from "@/lib/trpc";
interface LocalUser {
id: number;
name: string;
email: string;
username: string | null;
email: string | null;
role: "admin" | "user" | "readonly";
}
interface LocalAuthContextType {
user: LocalUser | null;
loading: boolean;
login: (email: string, password: string) => Promise<void>;
login: (identifier: string, password: string) => Promise<void>;
logout: () => Promise<void>;
isAuthenticated: boolean;
}
@@ -34,10 +35,10 @@ export function LocalAuthProvider({ children }: { children: ReactNode }) {
const loginMutation = trpc.auth.localLogin.useMutation();
const logoutMutation = trpc.auth.localLogout.useMutation();
const login = async (email: string, password: string) => {
const login = async (identifier: string, password: string) => {
setLoading(true);
try {
const result = await loginMutation.mutateAsync({ email, password });
const result = await loginMutation.mutateAsync({ identifier, password });
const localUser = result.user as LocalUser;
setUser(localUser);
localStorage.setItem(LOCAL_USER_KEY, JSON.stringify(localUser));

View File

@@ -50,9 +50,9 @@ export const appRouter = router({
}),
// Connexion locale
localLogin: publicProcedure
.input(z.object({ email: z.string().min(1), password: z.string().min(1) }))
.input(z.object({ identifier: z.string().min(1), password: z.string().min(1) }))
.mutation(async ({ input, ctx }) => {
const result = await loginLocalUser(input.email, input.password);
const result = await loginLocalUser(input.identifier, input.password);
// Stocker le token dans un cookie
const cookieOptions = getSessionCookieOptions(ctx.req);
ctx.res.cookie("veille_local_auth", result.token, {

11
todo.md
View File

@@ -55,8 +55,9 @@
- [x] Menu "Boîte à idées" dans la sidebar accessible à tous les utilisateurs
## Authentification username
- [ ] BDD : ajouter colonne username (unique, nullable) dans la table users
- [ ] Backend : loginLocalUser cherche par username OU email
- [ ] Backend : createLocalUser accepte username optionnel
- [ ] Frontend : page Gestion utilisateurs affiche et permet de saisir le username
- [ ] Mettre à jour le compte adminItinova avec username = adminItinova
- [x] BDD : ajouter colonne username (unique, nullable) dans la table users
- [x] Backend : loginLocalUser cherche par username OU email
- [x] Backend : createLocalUser accepte username optionnel
- [x] Frontend : page Gestion utilisateurs affiche et permet de saisir le username
- [x] Mettre à jour le compte adminItinova avec username = adminItinova
- [x] Migration BDD recette : ajouter colonne username dans local_users et recréer compte adminItinova