Aplicación Backend de un sistema ecommerce con Express.
Cambia el nombre del archivo env.example a .env, s debera generar otro .env con nombre .env_test y ademas el nombre de la base de datos debe de acabar en _test por ejemplo tshirtFactoryDB_test, despues, insertar la frase o codigo secreto en el archivo, si lo deseas puedes usar este gits para generar un codigo.
Debe de haber instalado docker y docker-compose
Abres el terminal e introduce el siguiente comando:
docker-compose up -d # la option -d ejecuta el contenedor en segundo plano
Si deseas borra el contenedor:
docker-compose down
Para visualizar la base de datos con mongo-express en local es: locahost:8081. Usuario por defecto: admin y contraseña: password.
Para correr el proyecto introduce el siguiente comando:
# mode development:
npm run dev
# mode build:
npm run build
# mode production:
npm run server
# mode test:
npm run test
# mode seeder: (Recomendado para pruebas)
# Genera los users (user, wallet, addresbook), admins, sellers, products e items
npm run seeder charge
# Borra la base de datos completamente
npm run seeder drop
Debe de haber instalado postman
[POST] register: /users/register
descripción: registrar un usuario con role por defecto user
/* request
"name": nombre del usuario
"lastname": apellido del usuario
"email": "", correo electronico
"genre": "", el genero debe ser (man, woman, unknown)
"password": constrasña del usuario
*/
{
"name": "",
"lastname": "",
"email": "",
"genre": "",
"password": ""
}
// response
{
"message": "User created"
}
[PUT] change: /users/change/
requiere: TOKEN
descripción: cambia los datos del usuario
//request
{
"name": "",
"lastname": "",
"genre": "",
"email": "",
"password": ""
}
[GET] change: /users/profile/
requiere: TOKEN
descripción: obtenemos los datos del usuario
// response
{
"message": "Profile",
"user": {
"genre": "",
"address": [],
"wallet": [],
"order": [],
"role": "",
"_id": "",
"name": "",
"lastname": "",
"email": "",
}
}
[patch] change role: /users/change/role/:userId
params: :userId
solo: admin
requiere: TOKEN
descripción: puede cambiar el rol a [admin
,user
, seller
]
/*
request
"role": "" puede ser (user, admin, seller)
*/
{
"role": ""
}
//response
{
"message": "the user email {USER_EMAIL} change to role {USER_ROLE_NEW}"
}
[DELETE] remove: /users/remove/:userId
params: :userId
solo: admin
| user
requiere: TOKEN
descripción: elimina un usuario
//response
{
"message": "Deleted user"
}
[POST] login: /auth/login/
descripción: autentificación de usuario
/*
"email": correo electronico
"password": constrasña del usuario
*/
{
"email": "",
"password": ""
}
/* response
refresh_token": token
*/
{
"message": "Login Success",
"refresh_token": ""
}
[GET] products: /products/
descripción: obtenemos todos productos
// response
{
"message": "Find all product",
"product": []
}
[POST] register: /products/register
solo: seller
requiere: TOKEN
descripción: registro de productos
// request
{
"parent_sku": "CEP00",
"title": "CAMISA DE POKEMON",
"description": "Camisa de algodon",
"price": 12.99,
"categories": ["Camisa", "Con Estampa"],
"items":[
{
"child_sku": "CEPRS",
"stock": 30,
"color": "rojo",
"size": "S"
},
{
"child_sku": "CEPAS",
"stock": 30,
"color": "azul",
"size": "S"
}
]
}
// response
{
"message": "Product saved {PARENT_SKU}"
}
[GET] search: /products/search?categories=&parentsku=
query: {categories, parentsku}
descripción: buscar productos según las consultas
// response
{
"message": "Found products",
"product": []
}
[GET] search title: /products/search/title?q=
query: {q}
descripción: obtendremos el producto filtrado por el titulo
// response
{
"message": "Found products",
"product": []
}
[DELETE] remove product: /products/remove/product/
solo: seller
| admin
require: TOKEN
descripción: elimina products y sus items
/* request
"products": ["productsId"]
*/
{
"products": []
}
// response
{
"product": {
"n": 2,
"ok": 1,
"deletedCount": 2
},
"item": {
"n": 10,
"ok": 1,
"deletedCount": 10
}
}
[DELETE] remove item: /products/remove/item/
solo: seller
| admin
require: TOKEN
descripción: eliminar item
// request
{
"itemId": []
}
//response
{
"message": "Removed item on product",
"item": {
"n": 2,
"ok": 1,
"deletedCount": 2
},
"products": {
"n": 2,
"nModified": 0,
"ok": 1
}
}
[GET] getALL: /addressbook/
requiere: TOKEN
descripción: obtenemos todas la direcciones del usuario
{
"message": "All addresses",
"addresses": []
}
[POST] register: /addressbook/register
requiere: TOKEN
descripción: registramos una dirección
/*
request
"isDefault": solo permite dos estados ([false, true])
*/
{
"name": "",
"lastname": "",
"country": "",
"location": "",
"state": "",
"postcode": "",
"telephone": "",
"mobile": "",
"isDefault": false
}
// response
{
"message": "Address add",
"address": {}
}
[PUT] update: /addressbook/update/:addressId
params: addressId
require: TOKEN
descripción: actualizamos la dirección
/*
request
"isDefault": solo permite dos estados [false, true]
*/
{
"name": "",
"lastname": "",
"country": "",
"location": "",
"state": "",
"postcode": "",
"telephone": "",
"mobile": "",
"isDefault": false
}
// response
{
"message": "Updated add",
"address": {}
}
[DELETE] remove: /addressbook/remove/:addressId
params: addressId
require: TOKEN
descripción: eliminamos la dirección
// response
{
"message": "Remove address"
}
[GET] getAll: /wallet/
requiere: TOKEN
description: obtenemos todos los wallet del usuarios
//response
{
"message": "Wallet",
"wallet": []
}
[POST] register: /wallet/register
require: TOKEN
descripción: registramos una tarjeta del usuario
// requiere
{
"title": "Maria Rodriguez",
"cardNumber": "5555 5555 5555 5555",
"valid": {
"month": 2,
"year": 99
},
"balance": 0
}
// response
{
"message": "creditCard add",
"wallet": {
"creditCard": {
"valid": {
"month": 2,
"year": 99
},
"type": "credit",
"balance": {
"$numberDecimal": "0"
},
"isSelect": false,
"title": "Maria Rodriguez",
"cardNumber": "5555 5555 5555 5555"
},
"_id": "5f919d4fe7d57aaae96bdd80",
"userId": "5f9186cdc22daa94e57fd0bc",
"__v": 0
}
}
[PUT] update: wallet/update/:walletId
params: walletId
require: TOKEN
descripción: actualizamos la tarjeta
//request
{
"title": "Maria Rodriguez Lopez",
"valid": {
"month": 2,
"year": 19
},
"balance": 20.99
}
// response
{
"message": "updated credit card",
"creditcard": {
"title": "Maria Rodriguez Lopez",
"valid": {
"month": 2,
"year": 19
},
"balance": 20.99
}
}
[DELETE] remove: wallet/remove/:walletId
params: walletId
requiere: TOKEN
descripción: elimina un tarjeta
// response
{
"message": "Removed credit card"
}
[GET] /: /addressbook/:cartId
params: {cartId}
descripción: obtenemos el pedido
//response
{
"message": "Find cart",
"cart": {}
}
[POST] add : /cart/add
descripción: añade los productos seleccionados al carrito
// request
{
"productId": "",
"itemId": ""
}
//response
{
"message": "Product in cart",
"cart": {}
}
[PATCH] push : /cart/push/:cartId
params: cartId
descripción: añade un producto a la cesta ya creado o lo actualiza en caso que sea el mismo.
/* request
"quantity": no se permite 0, pasa directamente a 1. para quitarlo del carrito existe el enpoint Pull
*/
{
"productId": "",
"itemId": "",
"quantity":
}
//response
{
"message": "Product in cart",
"cart": {}
}
[PATCH] pull : /cart/pull/:cartId
params: cartId
descripción: borra un producto de la cesta
/*
request
"subcartId": se require el id subdocument
*/
{
"subcartId": ""
}
//response
{
"message": "removed item on cart",
"cart": { }
}
[DELETE] remove : /cart/remove/:cartId
params: cartId
descripción: borra el carrito de la compra
//response
{
"message": "Removed cart"
}
[POST] register: /order/register/:cartId
params: cartId
require: TOKEN
descripción: registra un pedido
//response
{
"message": "Order proccess",
"order": { }
}
[PATCH] status update: /order/update/status/:cartId
solo: seller
| admin
params: cartId
require: TOKEN
descripción: actualiza el estado del pedido
/*
request
"status": los estados permitidos son (process, confirm, paid, shipping, finished,canceled)
*/
{
"status": ""
}
/*
response
*/
{
"message": "Order updated",
"status": "confirm",
"orderId": "5f91a722e7d57aaae96bdd86"
}
[PUT] status canceled: /order/update/canceled/
solo: admin
params: cartId
descripción: busca todo los pedidos con estado canceled
y devuelve el stock
// response
{
"item": [
{
"n": 1,
"nModified": 1,
"ok": 1
}
]
}
[POST] register: /shipping/register/:orderId
params: orderId
stutus order: process
require: TOKEN
y una dirreción con estado isDefault: true
descripción: registra un pedido para su envio
/*
"invoce_address": opcional: si se desea otra direccion para la facturación
*/
{
"invoce_address": ""
}
{
"message": "Order pedding for shipping",
"shipping": {
"_id": "5f91c1c79ab69fcfa1749cb1",
"status": "pending",
"shipping_address": "5f91b658e6743cc1da02fad0",
"invoices_address": "5f91b658e6743cc1da02fad0",
"orderId": "5f91ad30658bbfb6b7b1edab",
"createdAt": "2020-10-22T17:30:47.548Z",
"updatedAt": "2020-10-22T17:30:47.548Z",
"__v": 0
}
}
[POST] shipping update: /shipping/update/status/:shippingId
params: shippingId
solo: admin
require: TOKEN
descripción:actualiza el envio dependiendo del estado del pedido:
- Si el pedido esta en
process
,confirm
opaid
el estado del envio siempre sera +pending
- Si el pedido se encuentra en estado
shipping
podemos introducir los estados:- [
shipped out
,pending delivered
]
- [
- Si el pedido se encuentra en estado
finished
podemos introducir los estados:- [
delivered
,undelivered
]
- [
// request
{
"status": ""
}
//response
{
"message": "shipping change",
"newShipping": {
"_id": "5f91c1c79ab69fcfa1749cb1",
"status": "pending",
"shipping_address": "5f91b658e6743cc1da02fad0",
"invoices_address": "5f91b658e6743cc1da02fad0",
"orderId": "5f91ad30658bbfb6b7b1edab",
"createdAt": "2020-10-22T17:30:47.548Z",
"updatedAt": "2020-10-22T17:36:15.148Z",
"__v": 0
}
}
[POST] /: /shipping/:shippingId
params: shippingId
require: TOKEN
descripción: obtenemos los datos del envio y el pedido
//response
{
"message": "View order: {ORDER_ID}",
"shipping": {
"_id": "",
"status": "",
"shipping_address": {},
"invoices_address": {},
"orderId": {}
}
}
En el botón de abajo obtendriamos todos los enpoints indicados.
Recomiendo hacer primero npm run seeder charge
ya que, nos cargara unos cuantos usuarios, productos y usuario predeterminados como jerrysmith@admin.com
y glootie@seller.com
con la contraseña por defecto password