Skip to content

maniadiaz/inventory-api-python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Inventory API Python

API RESTful desarrollada con Python y Flask para la gestión de inventario de productos. Este proyecto demuestra habilidades en desarrollo backend, arquitectura MVC, programación orientada a objetos y bases de datos SQL.

Tabla de contenidos


Características

CRUD completo - Crear, leer, actualizar y eliminar productos
API RESTful - Endpoints bien definidos con métodos HTTP (GET, POST, PUT, DELETE)
Respuestas en JSON - Formato estándar de la industria
Manejo de errores robusto - Mensajes claros y códigos de estado HTTP apropiados
Validación de datos - Validación de campos requeridos y tipos de datos
CORS habilitado - Permite consumir la API desde cualquier origen
Código limpio y documentado - Comentarios y docstrings en todo el código
Patrón MVC - Separación clara entre modelo, vista y controlador
POO implementado - Uso de clases y objetos para mejor organización


Tecnologías utilizadas

Tecnología Versión Propósito
Python 3.9+ Lenguaje de programación principal
Flask 2.3.3 Framework web para crear APIs
Flask-CORS 4.0.0 Manejo de CORS
MySQL 5.7+ Base de datos relacional
mysql-connector-python 8.0.33 Conector para conectar Python con MySQL
XAMPP - Servidor local (Apache + MySQL + PHP)

Requisitos previos

Antes de empezar, asegúrate de tener instalado:

  • Python 3.9 o superior - Descargar
  • pip - Gestor de paquetes de Python (viene con Python)
  • XAMPP - Descargar - Necesitas MySQL activo
  • Git - Descargar - Para control de versiones
  • Postman o cURL - Para probar los endpoints (opcional pero recomendado)

Instalación

Paso 1: Clonar el repositorio

git clone https://github.com/tu-usuario/inventory-api-python.git
cd inventory-api-python

Paso 2: Crear un entorno virtual (recomendado)

# Windows
python -m venv venv
venv\Scripts\activate

# macOS/Linux
python3 -m venv venv
source venv/bin/activate

Paso 3: Instalar dependencias

pip install -r requirements.txt

Paso 4: Configurar XAMPP

  1. Abre XAMPP Control Panel
  2. Inicia Apache (opcional si no necesitas servidor web)
  3. Inicia MySQL
  4. Verifica que MySQL esté corriendo en localhost:3306

Paso 5: Ejecutar la aplicación

python app.py

Deberías ver:

Inicializando Inventory API Python...
Creando estructura de base de datos...
Base de datos lista
Iniciando servidor Flask...
URL: http://localhost:5000
Documentación: http://localhost:5000/api/salud
Presiona CTRL+C para detener el servidor

Estructura del proyecto

inventory-api-python/
│
├── config/
│   ├── __init__.py
│   └── database.py              # Configuración y conexión a BD
│
├── models/
│   ├── __init__.py
│   └── productModels.py         # Modelo de datos (Producto)
│
├── controllers/
│   ├── __init__.py
│   └── productControllers.py    # Lógica de negocio
│
├── app.py                       # Punto de entrada (Rutas/Endpoints)
├── requirements.txt             # Dependencias del proyecto
├── .gitignore                   # Archivos a ignorar en Git
└── README.md                    # Este archivo

Explicación de carpetas:

  • config/ - Configuraciones de la aplicación (conexión a BD)
  • models/ - Modelos de datos (clases que representan entidades)
  • controllers/ - Lógica de negocio y procesamiento de datos
  • app.py - Rutas/endpoints y punto de entrada de la aplicación

Endpoints

Base URL

http://localhost:5000/api

1. Obtener todos los productos

GET /productos

Respuesta exitosa (200):

{
  "éxito": true,
  "cantidad": 2,
  "datos": [
    {
      "id_producto": 1,
      "nombre": "Laptop",
      "descripcion": "Laptop HP",
      "precio": 800.0,
      "cantidad": 5,
      "fecha_creacion": "2024-01-15 10:30:00",
      "fecha_actualizacion": "2024-01-15 10:30:00"
    },
    {
      "id_producto": 2,
      "nombre": "Mouse",
      "descripcion": "Mouse inalámbrico",
      "precio": 25.0,
      "cantidad": 50,
      "fecha_creacion": "2024-01-15 11:00:00",
      "fecha_actualizacion": "2024-01-15 11:00:00"
    }
  ]
}

2. Obtener un producto por ID

GET /productos/{id}

Ejemplo:

GET /productos/1

Respuesta exitosa (200):

{
  "éxito": true,
  "datos": {
    "id_producto": 1,
    "nombre": "Laptop",
    "descripcion": "Laptop HP",
    "precio": 800.0,
    "cantidad": 5,
    "fecha_creacion": "2024-01-15 10:30:00",
    "fecha_actualizacion": "2024-01-15 10:30:00"
  }
}

Error (404):

{
  "éxito": false,
  "error": "Producto no encontrado"
}

3. Crear un nuevo producto

POST /productos
Content-Type: application/json

Cuerpo de la solicitud:

{
  "nombre": "Teclado",
  "descripcion": "Teclado mecánico RGB",
  "precio": 150.0,
  "cantidad": 20
}

Respuesta exitosa (201):

{
  "éxito": true,
  "mensaje": "Producto creado exitosamente",
  "id": 3,
  "datos": {
    "id_producto": 3,
    "nombre": "Teclado",
    "descripcion": "Teclado mecánico RGB",
    "precio": 150.0,
    "cantidad": 20,
    "fecha_creacion": null,
    "fecha_actualizacion": null
  }
}

Error (400):

{
  "éxito": false,
  "error": "El nombre es requerido"
}

4. Actualizar un producto

PUT /productos/{id}
Content-Type: application/json

Ejemplo:

PUT /productos/1

Cuerpo de la solicitud (campos opcionales):

{
  "nombre": "Laptop Dell",
  "precio": 900.0,
  "cantidad": 10
}

Respuesta exitosa (200):

{
  "éxito": true,
  "mensaje": "Producto actualizado exitosamente",
  "id": 1
}

5. Eliminar un producto

DELETE /productos/{id}

Ejemplo:

DELETE /productos/1

Respuesta exitosa (200):

{
  "éxito": true,
  "mensaje": "Producto eliminado exitosamente"
}

6. Verificar estado de la API

GET /salud

Respuesta (200):

{
  "éxito": true,
  "mensaje": "API funcionando correctamente",
  "versión": "1.0.0"
}

💻 Ejemplos de uso

Con cURL

# GET - Obtener todos los productos
curl http://localhost:5000/api/productos

# GET - Obtener producto por ID
curl http://localhost:5000/api/productos/1

# POST - Crear producto
curl -X POST http://localhost:5000/api/productos \
  -H "Content-Type: application/json" \
  -d '{
    "nombre": "Monitor",
    "descripcion": "Monitor 27 pulgadas",
    "precio": 300,
    "cantidad": 15
  }'

# PUT - Actualizar producto
curl -X PUT http://localhost:5000/api/productos/1 \
  -H "Content-Type: application/json" \
  -d '{
    "precio": 350,
    "cantidad": 12
  }'

# DELETE - Eliminar producto
curl -X DELETE http://localhost:5000/api/productos/1

Con Python

import requests

BASE_URL = "http://localhost:5000/api"

# GET - Obtener todos los productos
response = requests.get(f"{BASE_URL}/productos")
print(response.json())

# POST - Crear producto
datos = {
    "nombre": "Webcam",
    "descripcion": "Webcam 1080p",
    "precio": 80,
    "cantidad": 25
}
response = requests.post(f"{BASE_URL}/productos", json=datos)
print(response.json())

# PUT - Actualizar
datos_actualizar = {"precio": 90}
response = requests.put(f"{BASE_URL}/productos/1", json=datos_actualizar)
print(response.json())

# DELETE - Eliminar
response = requests.delete(f"{BASE_URL}/productos/1")
print(response.json())

Arquitectura

Patrón MVC

El proyecto está estructurado bajo el patrón Model-View-Controller:

  • Model (Modelo):

    • models/productModels.py - Define la clase Producto
    • config/database.py - Maneja conexiones a la base de datos
  • View (Vista):

    • app.py - Define los endpoints/rutas que retornan respuestas JSON
  • Controller (Controlador):

    • controllers/productControllers.py - Contiene la lógica de negocio
    • Procesa datos, valida, y hace consultas a la BD

Programación Orientada a Objetos (POO)

Se utilizan clases para:

  • Producto: Representa la entidad producto con métodos para validar y convertir a JSON
  • Database: Maneja todas las conexiones y operaciones de BD
  • ProductoController: Encapsula la lógica de negocio

Seguridad

Consideraciones de seguridad implementadas:

Validación de datos - Los datos se validan antes de guardar
Consultas parametrizadas - Previene inyección SQL
Manejo de errores - No expone detalles internos
CORS configurado - Control de acceso


Mejoras futuras

  • Autenticación y autorización (JWT)
  • Paginación en listados
  • Búsqueda y filtrado de productos
  • Logging de operaciones
  • Tests unitarios
  • Documentación automática (Swagger/OpenAPI)
  • Caché con Redis
  • Rate limiting

Licencia

Este proyecto está bajo la licencia MIT.


Autor

Alexis Diaz
Desarrollador Full Stack | Portafolio de Evidencia


Contribuciones

Las contribuciones son bienvenidas. Para cambios importantes:

  1. Fork el proyecto
  2. Crea una rama para tu feature (git checkout -b feature/AmazingFeature)
  3. Commits con mensajes claros (git commit -m 'Add some AmazingFeature')
  4. Push a la rama (git push origin feature/AmazingFeature)
  5. Abre un Pull Request

Preguntas o problemas

Si tienes preguntas o encuentras problemas:

  1. Verifica que MySQL en XAMPP está corriendo
  2. Revisa que Python 3.9+ está instalado
  3. Abre un Issue en el repositorio

Hecho con ❤️ en Python

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages