Aplicación web de gestión de tareas construida con Next.js, Prisma y PostgreSQL. Permite a estudiantes organizar sus tareas diarias y a administradores gestionar los perfiles de los usuarios, con autenticación basada en JWT y control de acceso por roles.
- Características
- Stack tecnológico
- Estructura del proyecto
- Requisitos previos
- Puesta en marcha
- Variables de entorno
- Base de datos
- Scripts disponibles
- Rutas de la aplicación
- API
- Autenticación y seguridad
- Despliegue
- Página de aterrizaje con secciones de características, pasos de uso y llamada a la acción.
- Autenticación completa:
- Registro de usuarios.
- Inicio de sesión con sesión basada en cookies
httpOnly. - Recuperación de contraseña mediante enlace temporal enviado por correo (Resend).
- Restablecimiento de contraseña con token de un solo propósito (15 min de vigencia).
- Panel de estudiante:
- Listado de tareas propias.
- Creación, completado y eliminación de tareas.
- Cierre de sesión.
- Panel de administración:
- Listado de todos los usuarios.
- Creación, edición y eliminación de perfiles.
- Asignación de roles (
ADMIN/USER).
- Control de acceso por roles con protección de rutas y endpoints.
- Diseño con Tailwind CSS v4, tipografía personalizada y animaciones con Framer Motion.
| Capa | Tecnología |
|---|---|
| Framework | Next.js 16 (App Router), React 19 |
| Lenguaje | TypeScript |
| Estilos | Tailwind CSS v4 |
| ORM | Prisma 6 |
| Base datos | PostgreSQL (Neon) |
| Auth | JWT (jsonwebtoken) + cookies |
| Passwords | bcryptjs |
| Correo | Resend |
| Animación | Framer Motion, lucide-react |
| Notificaciones | sileo |
.
├── app/
│ ├── (auth)/ # Páginas de autenticación (login, register, recover, reset)
│ ├── (dashboard)/
│ │ ├── admin/ # Panel de administración
│ │ └── student/ # Panel de estudiante
│ ├── api/
│ │ ├── auth/ # Endpoints de autenticación
│ │ ├── tasks/ # Endpoints de tareas
│ │ └── users/ # Endpoints de usuarios
│ ├── actions/ # Server Actions (logout)
│ ├── layout.tsx # Layout raíz
│ └── page.tsx # Landing page
├── components/
│ ├── layout/ # Navbar, Footer, Hero, tablas, formularios
│ └── ui/ # Componentes reutilizables (botones, inputs, modales)
├── lib/
│ ├── api/ # Clientes de consumo de la API
│ ├── data/ # Acceso a datos (Prisma)
│ ├── auth.ts # Middleware de autorización (JWT)
│ ├── db.ts # Cliente singleton de Prisma
│ └── landing.ts # Datos de la landing page
├── prisma/
│ ├── migrations/ # Migraciones de base de datos
│ ├── schema.prisma # Esquema de datos
│ └── seed.ts # Seed del usuario administrador
├── proxy.ts # Middleware de protección de rutas
├── next.config.ts
└── package.json
- Node.js 20 o superior.
- npm (incluido con Node.js).
- Una instancia de PostgreSQL (local o en la nube, p. ej. Neon).
- Una cuenta de Resend con una API Key para el envío de correos de recuperación.
-
Instala las dependencias:
npm install
El paso
postinstallejecuta automáticamenteprisma generate. -
Crea el archivo
.enven la raíz del proyecto y define las variables indicadas en Variables de entorno. -
Sincroniza la base de datos con el esquema:
npx prisma migrate dev
-
Siembra el usuario administrador inicial:
npm run seed
Requiere
ADMIN_EMAILyADMIN_PASSWORDdefinidos en.env. -
Inicia el servidor de desarrollo:
npm run dev
-
Abre http://localhost:3000.
| Variable | Descripción | Ejemplo |
|---|---|---|
DATABASE_URL |
Cadena de conexión a PostgreSQL (pooler). | postgresql://... |
DIRECT_URL |
Conexión directa a PostgreSQL (para migraciones). | postgresql://... |
JWT_SECRET |
Secreto para firmar y verificar tokens JWT. | tu-secreto-seguro |
RESEND_API_KEY |
API Key de Resend para el envío de correos. | re_... |
NEXT_PUBLIC_APP_URL |
URL pública de la aplicación (usada en el enlace de restablecimiento). | http://localhost:3000 |
ADMIN_EMAIL |
Correo del administrador inicial (seed). | admin@example.com |
ADMIN_PASSWORD |
Contraseña del administrador inicial (seed). | clave-segura |
- User:
id(UUID),nombre,email(único),password(hash),rol(ADMIN|USER), timestamps. - Task:
id(CUID),title,completed(booleano),userId(FK → User),createdAt.- La relación elimina en cascada: al borrar un usuario se borran sus tareas.
Crea una nueva migración tras modificar el esquema:
npx prisma migrate dev --name descripcion_del_cambioEl seed crea un usuario administrador si no existe. Se ejecuta con:
npm run seed| Comando | Descripción |
|---|---|
npm run dev |
Inicia el servidor de desarrollo. |
npm run build |
Compila la aplicación para producción. |
npm run start |
Inicia el servidor de producción. |
npm run lint |
Ejecuta ESLint sobre el código. |
npm run seed |
Ejecuta el seed de la base de datos. |
npm run postinstall |
Genera el cliente de Prisma tras instalar. |
| Ruta | Acceso | Descripción |
|---|---|---|
/ |
Público | Landing page. |
/login |
Público | Inicio de sesión. |
/register |
Público | Registro de cuenta. |
/recover |
Público | Solicitud de recuperación de contraseña. |
/reset |
Público | Restablecimiento de contraseña (token en query). |
/student |
Usuario autenticado | Panel del estudiante (tareas). |
/admin |
Solo ADMIN |
Panel de administración (gestión de usuarios). |
La protección de rutas se implementa en proxy.ts mediante el middleware de Next.js: redirige a /login a los visitantes sin token y limita /admin a usuarios con rol ADMIN.
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/auth/register |
Registra un nuevo usuario (rol forzado a USER). |
| POST | /api/auth/login |
Inicia sesión y establece la cookie tasker_token. |
| POST | /api/auth/recover |
Envía un correo con el enlace de restablecimiento. |
| POST | /api/auth/reset |
Actualiza la contraseña usando el token de recuperación. |
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/users |
Lista todos los usuarios. |
| POST | /api/users |
Crea un usuario. |
| PATCH | /api/users/:id |
Actualiza nombre, correo, rol y/o contraseña. |
| DELETE | /api/users/:id |
Elimina un usuario (y sus tareas). |
| Método | Ruta | Descripción |
|---|---|---|
| GET | /api/tasks |
Lista las tareas del usuario autenticado. |
| POST | /api/tasks |
Crea una tarea (title obligatorio). |
| PATCH | /api/tasks/:id |
Marca una tarea como completada (completed). |
| DELETE | /api/tasks/:id |
Elimina una tarea del usuario autenticado. |
Los endpoints de tareas validan que el recurso pertenezca al usuario autenticado (
403en caso contrario).
- Las contraseñas se almacenan como hash de
bcryptjs(nunca en texto plano). - La sesión se mantiene con un JWT firmado con
JWT_SECRETy guardado en una cookiehttpOnly,sameSite: strict, con vencimiento de 8 horas. requireAdmin()(lib/auth.ts) protege los endpoints de usuarios y devuelve401/403según el estado de la sesión y el rol.- El token de recuperación de contraseña es de un solo propósito (
proposito: 'recuperacion') y expira a los 15 minutos.
La aplicación puede desplegarse en plataformas compatibles con Next.js, como Vercel:
- Conecta el repositorio al proyecto en Vercel.
- Configura las variables de entorno indicadas en Variables de entorno.
- Define
NEXT_PUBLIC_APP_URLcon la URL de producción para que los enlaces de recuperación funcionen correctamente. - Ejecuta las migraciones (
npx prisma migrate deploy) y el seed contra la base de datos de producción.
Consulta la documentación de despliegue de Next.js para más detalles.