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
Lotesse relaciona conMedicamentos.MovimientosInventariose relaciona conLotesyUsuarios.
- 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 Hito5npm installCrea un archivo .env con:
PORT=3000
JWT_SECRET="secret"
DATABASE_URL="postgres://postgres:root@localhost:5436/db_Hito5"
npm run devLa 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.