From b776646a502656518a7fbf9f24fe9bfb5904ce5f Mon Sep 17 00:00:00 2001 From: Carlos Narro Date: Sat, 30 May 2026 19:43:10 +0200 Subject: [PATCH] Add login y logout --- mvp/b2c/src/app/login/actions.ts | 19 +++++++++++++++++++ mvp/b2c/src/app/login/page.tsx | 27 +++++++++++++++++++++++++++ mvp/b2c/src/app/logout/route.ts | 7 +++++++ 3 files changed, 53 insertions(+) create mode 100644 mvp/b2c/src/app/login/actions.ts create mode 100644 mvp/b2c/src/app/login/page.tsx create mode 100644 mvp/b2c/src/app/logout/route.ts diff --git a/mvp/b2c/src/app/login/actions.ts b/mvp/b2c/src/app/login/actions.ts new file mode 100644 index 0000000..4cb2bd7 --- /dev/null +++ b/mvp/b2c/src/app/login/actions.ts @@ -0,0 +1,19 @@ +'use server'; + +import { redirect } from 'next/navigation'; +import { getUserByEmail } from '@/db/auth-queries'; +import { verifyPassword } from '@/lib/auth/password'; +import { createSession } from '@/lib/auth/session'; + +export async function login(_prev: string | null, formData: FormData): Promise { + const email = String(formData.get('email') ?? '').trim().toLowerCase(); + const password = String(formData.get('password') ?? ''); + if (!email || !password) return 'Introduce email y contraseña.'; + + const user = await getUserByEmail(email); + if (!user || user.status !== 'activo') return 'Credenciales incorrectas.'; + if (!(await verifyPassword(password, user.passwordHash))) return 'Credenciales incorrectas.'; + + await createSession(user.id); + redirect(user.role === 'admin' ? '/admin' : '/panel'); +} diff --git a/mvp/b2c/src/app/login/page.tsx b/mvp/b2c/src/app/login/page.tsx new file mode 100644 index 0000000..6b8e762 --- /dev/null +++ b/mvp/b2c/src/app/login/page.tsx @@ -0,0 +1,27 @@ +'use client'; + +import { useActionState } from 'react'; +import { login } from './actions'; + +export default function LoginPage() { + const [error, formAction, pending] = useActionState(login, null); + return ( +
+
+

Entra en tu panel

+ + + {error &&

{error}

} + +
+
+ ); +} diff --git a/mvp/b2c/src/app/logout/route.ts b/mvp/b2c/src/app/logout/route.ts new file mode 100644 index 0000000..5476ab6 --- /dev/null +++ b/mvp/b2c/src/app/logout/route.ts @@ -0,0 +1,7 @@ +import { redirect } from 'next/navigation'; +import { destroySession } from '@/lib/auth/session'; + +export async function POST() { + await destroySession(); + redirect('/login'); +}