/TShirtFactory

Proyecto de ecommerce para Geekshub

Primary LanguageJavaScriptMIT LicenseMIT

TSHIRT FACTORY: Ecommerce System

Aplicación Backend de un sistema ecommerce con Express.

Variable de entornos

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.

Containers

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.

Run

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

Enpoints

Debe de haber instalado postman

USER

[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"
}

AUTH

[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": "" 
}

PRODUCTS

[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
    }
}

ADDRESSBOOK

[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"
}

WALLET

[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"
}

SHOPPING CART

[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"
}

ORDER

[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
        }
    ]
}

SHIPPING

[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 o paid 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.

Run in Postman

Playground

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