You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
API REST para gestión de pedidos y facturación B2B (mayorista).
Sistema completo con manejo de stock reservado, ciclo de vida de facturas y operaciones transaccionales. Sin ORM - queries SQL puras.
Confirmación: valida stock, reserva, genera número/fechas
Entrega: descuenta stock real y libera reserva
Cancelación: libera stock reservado
Carrito como invoice en draft
Un solo invoice por cliente en draft
Items en invoice_items
Cantidad 0 = eliminar item
📌 Endpoints
👤 Clientes
Método
Endpoint
Descripción
Acceso
POST
/clients
Registro con token de verificación
Público
GET
/clients/verify/:token
Activación de cuenta
Público
POST
/clients/login
Login (devuelve token)
Público
GET
/clients/me
Mi perfil
Cliente autenticado
PATCH
/clients/me
Actualizar mi perfil
Cliente autenticado
PATCH
/clients/me/change-password
Cambiar mi contraseña
Cliente autenticado
PATCH
/clients/me/deactivate
Desactivar mi cuenta
Cliente autenticado
POST
/clients/me/reactivate
Solicitar reactivación
Cliente autenticado
PATCH
/clients/me/reactivate/:token
Reactivar cuenta
Público (por token)
GET
/clients/all
Listar todos los clientes
Solo admin
GET
/clients/search
Búsqueda dinámica
Solo admin
GET
/clients/:id
Obtener cliente por ID
Solo admin
PATCH
/clients/:id/toggle
Activar/desactivar cliente
Solo admin
📦 Productos
Método
Endpoint
Descripción
Acceso
GET
/products/all
Listar todos
Público
GET
/products/search
Búsqueda dinámica
Público
GET
/products/:id
Obtener por ID
Público
POST
/products
Crear producto
Solo admin
PATCH
/products/:id
Actualizar
Solo admin
PATCH
/products/:id/toggle-active
Soft delete
Solo admin
🧾 Facturas / Pedidos (Invoices)
Método
Endpoint
Descripción
Acceso
POST
/invoices
Crear carrito (draft) con primer item
Cliente activo
GET
/invoices/me
Mis facturas
Cliente autenticado
GET
/invoices/me/active
Mi carrito activo
Cliente autenticado
GET
/invoices/me/:invoiceId
Obtener una de mis facturas
Cliente autenticado
PATCH
/invoices/:id
Batch update (cantidad 0 = eliminar)
Cliente activo (solo draft)
POST
/invoices/:id/confirm
Confirmar pedido (✅ reserva stock)
Cliente activo
POST
/invoices/:id/cancel
Cancelar pedido (❌ libera stock)
Cliente activo
GET
/invoices/all
Listar todas
Solo admin
GET
/invoices/search
Búsqueda con rangos
Solo admin
GET
/invoices/:id
Obtener factura por ID
Solo admin
POST
/invoices/:id/deliver
Entregar (📦 descarga stock)
Solo admin
POST
/invoices/:id/paid
Marcar como pagado (💰)
Webhook / Admin
🧠 Conceptos aplicados
Arquitectura en capas
Queries SQL puras (sin ORM)
Placeholders parametrizados (SQL injection safe)
UUID como primary keys
Hash de contraseñas con bcrypt
Token de verificación con crypto
JWT con middlewares de autenticación y roles
Soft delete con is_active / status
Búsquedas dinámicas con whitelist
Rangos numéricos y de fechas (BETWEEN, >=, <=)
Batch updates (INSERT ... ON DUPLICATE KEY UPDATE)
Transacciones SQL (BEGIN / COMMIT / ROLLBACK)
Manejo de errores consistente
Documentación con devlog.md y CHANGELOG.md
⚙️ Instalación y ejecución
git clone https://github.com/DarioFGonzalez/fullstack-express-mysql-raw.git
cd fullstack-express-mysql-raw/server
npm install
cp .env.example .env
npm run dev
Invoices CRUD + ciclo de vida (confirm/deliver/paid/cancel)
✅ Completado
Autenticación JWT + middlewares + roles
✅ Completado
👨💻 Autor
Dario Fernando Gonzalez
About
Express + MySQL raw queries API for B2B order and invoice management. Features JWT authentication with role-based access (admin/client), stock reservation system, full invoice lifecycle (draft → confirm → deliver → paid/cancel), and SQL transactions. No ORM - pure parameterized queries for security and control.