- Node.js + Express 5.1
- MongoDB + Mongoose 8.19
- JWT para autenticación
- Bcrypt para encriptación de contraseñas
- Jest + Supertest para pruebas
- Helmet y CORS para seguridad
boxpremier-server/
├── src/
│ ├── config/
│ │ └── config.js
│ ├── controllers/
│ │ ├── AdminController.js
│ │ ├── AuthController.js
│ │ ├── OrderController.js
│ │ ├── PaymentController.js
│ │ ├── SubscriptionController.js
│ │ ├── SubscriptionPlanController.js
│ │ └── UserController.js
│ ├── database/
│ │ └── db_connection.js
│ ├── middlewares/
│ │ └── authMiddleware.js
│ ├── models/
│ │ ├── OrderModel.js
│ │ ├── PaymentModel.js
│ │ ├── SubscriptionModel.js
│ │ ├── SubscriptionPlanModel.js
│ │ └── UserModel.js
│ ├── routers/
│ │ ├── AdminRoutes.js
│ │ ├── AuthRoutes.js
│ │ ├── OrderRoutes.js
│ │ ├── PaymentRoutes.js
│ │ ├── SubscriptionPlanRoutes.js
│ │ ├── SubscriptionsRoutes.js
│ │ └── UserRoutes.js
│ ├── utils/
│ │ ├── handleJWT.js
│ │ ├── handleResponse.js
│ │ └── handleValidation.js
│ └── validators/
│ ├── AuthValidator.js
│ ├── OrderValidator.js
│ ├── SubscriptionPlanValidations.js
│ ├── SubscriptionValidations.js
│ └── UserValidator.js
├── tests/
│ ├── controllers/
│ ├── integration/
│ └── setup/
├── docs/
├── .env.example
├── .gitignore
├── app.js
└── package.json
- Node.js 18+
- MongoDB 6+
- npm
- Clonar el repositorio:
git clone https://github.com/BOXPREMIER/boxpremier-server.git
cd boxpremier-server- Instalar dependencias:
npm install- Configurar variables de entorno:
cp .env.example .env
cp .env.example .env.testHOST=localhost
PORT=
MONGO_URI=mongodb://localhost:27017/boxpremier
JWT_SECRET=tu_clave_secreta
JWT_EXPIRES=7d
NODE_ENV=developmentHOST=localhost
PORT=
MONGO_URI=mongodb://localhost:27017/boxpremier_test
JWT_SECRET=test_secret
JWT_EXPIRES=1h
NODE_ENV=testnpm start # Inicia el servidor
npm run dev # Modo desarrollo con nodemon
npm test # Ejecuta pruebas en modo watch
npm run test:coverage # Genera reporte de cobertura- userType:
admin|customer - email, password, firstName, lastName
- phone, street, number, floor, postalCode, city, province, country (solo customer)
- paymentMethod: tipo, lastFourDigits, cardHolderName, expirationDate, paymentToken
- preferences: emailNotifications
- status: activo/inactivo
- Soft delete: deleteAt
- boxType: tipo de caja
- boxSize: número de botellas
- price: precio mensual
- active: disponible para compra
- Soft delete: deleteAt
- user, subscriptionPlan
- wineType:
mixed|rose|red|sparkling - boxType, boxSize
- startDate, nextPayDate, endDate
- status:
active|paused|canceled|expired|pending - isGift: boolean
- giftFromId, giftMessage, giftDurationMonths, giftActivatedAt (si es regalo)
- payMethod
- userId, subscriptionId
- boxType, wineType, boxSize
- Dirección snapshot: fullName, phone, street, number, floor, postalCode, city, province, country
- status:
pending|preparing|shipped|delivered|cancelled - trackingNumber, carrier
- orderDate, shippedDate, deliveredDate
- totalAmount
- subscriptionId, orderId
- amount, status:
pending|completed|failed - gateway:
multisafepay|paypal|redsys - transactionId, paymentDate
- paymentType:
recurring|one-time - monthsPaid
| Método | Ruta | Descripción |
|---|---|---|
| POST | /api/auth/register |
Registrar nuevo usuario |
| POST | /api/auth/login |
Iniciar sesión |
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| POST | /api/users |
Crear usuario | admin |
| GET | /api/users |
Listar todos los usuarios | admin |
| GET | /api/users/:id |
Obtener usuario por ID | admin, customer |
| PUT | /api/users/:id |
Actualizar usuario | admin, customer |
| DELETE | /api/users/:id |
Eliminar usuario | admin |
| PATCH | /api/users/me/payment-method |
Actualizar método de pago propio | customer |
| PATCH | /api/users/:id/payment-method |
Actualizar método de pago de usuario | admin |
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| GET | /api/plans |
Listar planes | todos (customer solo ve el propio) |
| GET | /api/plans/:id |
Obtener plan por ID | todos |
| POST | /api/plans |
Crear plan | admin |
| PUT | /api/plans/:id |
Actualizar plan | admin |
| DELETE | /api/plans/:id |
Eliminar plan (soft delete) | admin |
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| POST | /api/subscriptions |
Crear suscripción | customer |
| GET | /api/subscriptions |
Listar mis suscripciones | customer |
| GET | /api/subscriptions/details/:id |
Obtener detalles de suscripción | todos |
| GET | /api/subscriptions/:userId |
Listar suscripciones de usuario | admin |
| PUT | /api/subscriptions/:id |
Actualizar suscripción | customer |
| DELETE | /api/subscriptions/:id |
Cancelar suscripción | customer |
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| GET | /api/orders |
Listar pedidos | todos |
| GET | /api/orders/:id |
Obtener pedido por ID | todos |
| POST | /api/orders |
Crear pedido | admin |
| PATCH | /api/orders/:id/status |
Actualizar estado del pedido | admin |
| PATCH | /api/orders/:id/address |
Actualizar dirección del pedido | admin |
| PATCH | /api/orders/:id/tracking |
Actualizar tracking del pedido | admin |
| PATCH | /api/orders/:id/cancel |
Cancelar pedido | admin |
| DELETE | /api/orders/:id |
Eliminar pedido (solo dev) | admin |
| Método | Ruta | Descripción | Rol |
|---|---|---|---|
| GET | /api/payments |
Listar pagos | todos |
| GET | /api/payments/:id |
Obtener pago por ID | todos |
| POST | /api/payments |
Crear pago | customer |
| PATCH | /api/payments/:id/status |
Actualizar estado del pago | admin |
Endpoints administrativos adicionales
La configuración de Jest cubre:
- Controllers
- Routers
Documentación completa en Postman:
Organización: BoxPremier