Este proyecto desarrolla una API REST con seguridad basada en JSON Web Token (JWT) para autenticación y autorización. Incluye múltiples modelos y CRUD completos protegidos mediante validaciones y JWT.
-
Seguridad con JWT
- Registro y Login con generación de tokens.
- Validación de tokens para endpoints protegidos.
-
CRUD de Modelos
- Tipos de Usuario
- Medicamentos
- Lotes
- Movimientos de Inventario
- Usuarios
-
Relaciones entre Modelos
Lotes
se relaciona conMedicamentos
.MovimientosInventario
se relaciona conLotes
yUsuarios
.
- Node.js v14 o superior.
- PostgreSQL o cualquier base de datos soportada por Sequelize.
- Postman (opcional para pruebas).
git clone https://github.com/SHuan004/Hito5
cd Hito5
npm install
Crea un archivo .env
con:
PORT=3000
JWT_SECRET="secret"
DATABASE_URL="postgres://postgres:root@localhost:5436/db_Hito5"
npm run dev
La API estará disponible en: http://localhost:3000
- Entrada:
{ "rut": "12345678-9", "username": "usuario123", "nombre": "Juan", "apellido": "Pérez", "email": "juan.perez@example.com", "password": "securepassword123", "id_tipo_usuario": "id valido (Hay un seder de creacion de tipo de usuario en carpeta config)" }
- Entrada:
{ "email": "juan.perez@example.com", "password": "securepassword123" }
- Respuesta:
{ "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
-
Nota: Todos los endpoints de este CRUD requieren un token JWT en el encabezado
Authorization
:Authorization: Bearer <token>
-
Crear (
POST /tipos-usuario
):{ "nombre": "Administrador" }
-
Leer Todos (
GET /tipos-usuario
): Respuesta:[ { "id_tipo_usuario": "12345", "nombre": "Administrador" } ]
-
Leer por ID (
GET /tipos-usuario/:id
): Respuesta:{ "id_tipo_usuario": "12345", "nombre": "Administrador" }
-
Actualizar (
PUT /tipos-usuario/:id
):{ "nombre": "Usuario Regular" }
-
Eliminar (
DELETE /tipos-usuario/:id
): Respuesta:{ "message": "Tipo de usuario eliminado." }
-
Nota: Todos los endpoints de este CRUD requieren un token JWT en el encabezado
Authorization
:Authorization: Bearer <token>
-
Crear (
POST /medicamentos
):{ "nombre": "Paracetamol", "descripcion": "Medicamento para el dolor y fiebre.", "presentacion": "Tabletas", "concentracion": "500mg" }
-
Leer Todos (
GET /medicamentos
): Respuesta:[ { "id_medicamento": "12345", "nombre": "Paracetamol", "descripcion": "Medicamento para el dolor y fiebre.", "presentacion": "Tabletas", "concentracion": "500mg" } ]
-
Leer por ID (
GET /medicamentos/:id
): Respuesta:{ "id_medicamento": "12345", "nombre": "Paracetamol", "descripcion": "Medicamento para el dolor y fiebre.", "presentacion": "Tabletas", "concentracion": "500mg" }
-
Actualizar (
PUT /medicamentos/:id
):{ "descripcion": "Medicamento usado para fiebre." }
-
Eliminar (
DELETE /medicamentos/:id
): Respuesta:{ "message": "Medicamento eliminado." }
-
Nota: Todos los endpoints de este CRUD requieren un token JWT en el encabezado
Authorization
:Authorization: Bearer <token>
-
Crear (
POST /lotes
):{ "id_medicamento": "12345", "codigo_lote": "L001", "fecha_vencimiento": "2025-12-31", "cantidad_cajas": 50, "unidades_por_caja": 20, "stock_actual": 1000 }
-
Leer Todos (
GET /lotes
): Respuesta:[ { "id_lote": "67890", "id_medicamento": "12345", "codigo_lote": "L001", "fecha_vencimiento": "2025-12-31", "cantidad_cajas": 50, "unidades_por_caja": 20, "stock_actual": 1000 } ]
-
Leer por ID (
GET /lotes/:id
): Respuesta:{ "id_lote": "67890", "id_medicamento": "12345", "codigo_lote": "L001", "fecha_vencimiento": "2025-12-31", "cantidad_cajas": 50, "unidades_por_caja": 20, "stock_actual": 1000 }
-
Actualizar (
PUT /lotes/:id
):{ "stock_actual": 900 }
-
Eliminar (
DELETE /lotes/:id
): Respuesta:{ "message": "Lote eliminado." }
-
Nota: Todos los endpoints de este CRUD requieren un token JWT en el encabezado
Authorization
:Authorization: Bearer <token>
-
Crear (
POST /movimientos-inventario
):{ "id_lote": "67890", "fecha_movimiento": "2025-01-25", "tipo_movimiento": "INGRESO", "cantidad": 200, "id_usuario": "54321", "rut_usuario": "12345678-9", "username_usuario": "usuario123" }
-
Leer Todos (
GET /movimientos-inventario
): Respuesta:[ { "id_movimiento": "11111", "id_lote": "67890", "fecha_movimiento": "2025-01-25", "tipo_movimiento": "INGRESO", "cantidad": 200, "id_usuario": "54321", "rut_usuario": "12345678-9", "username_usuario": "usuario123" } ]
-
Leer por ID (
GET /movimientos-inventario/:id
): Respuesta:{ "id_movimiento": "11111", "id_lote": "67890", "fecha_movimiento": "2025-01-25", "tipo_movimiento": "INGRESO", "cantidad": 200, "id_usuario": "54321", "rut_usuario": "12345678-9", "username_usuario": "usuario123" }
-
Actualizar (
PUT /movimientos-inventario/:id
):{ "cantidad": 250 }
-
Eliminar (
DELETE /movimientos-inventario/:id
): Respuesta:{ "message": "Movimiento de inventario eliminado." }
-
Dependencias Principales:
jsonwebtoken
: Manejo de tokens JWT.bcrypt
: Encriptación de contraseñas.sequelize
: ORM para base de datos.joi
: Validación de datos de entrada.
-
Documentación:
Este proyecto forma parte del Hito 5 del curso de Desarrollo Backend.