#carro de la compra
Puntos clave
- En este proyecto trabajaremos en función. Eso significa que elegimos un objeto como usuario, libro, blog, etc. a la vez. Trabajamos a través de su característica. Los pasos serían:
- Creamos su modelo.
- Construimos sus API.
- Probamos estas API.
- Implementamos estas API.
- Integramos estas API con el frontend.
- Repetiremos los pasos del Paso 1 al Paso 5 para cada función de este proyecto.
- Este proyecto se divide en 4 funciones: Usuario, Producto, Carrito y Pedido. Necesita trabajar en una sola característica a la vez. Una vez que se complete según los pasos mencionados anteriormente. Se le indicará que pase a la siguiente función.
- En este proyecto estamos cambiando la forma en que enviamos el token con una solicitud. En lugar de utilizar una clave de encabezado personalizada como x-api-key, debe usar el encabezado de Autorización y enviar el token JWT como token de portador.
- Cree una base de datos grupal
groupXDatabase
. Puede limpiar la base de datos que utilizó anteriormente y restablecerla. - Esta vez cada grupo debería tener una única rama de git . Coordinen entre ustedes asegurándose de que cada persona siguiente obtenga el último código ingresado por un compañero de equipo. Su sucursal será revisada como parte de la demostración. El nombre de la sucursal debe seguir la convención de nomenclatura
project/productsManagementGroupX
- Siga las convenciones de nomenclatura exactamente como se indica.
FUNCIÓN I - Usuario
Modelos
{
fname : {string, mandatory},
lname : {string, mandatory},
email : {string, mandatory, valid email, unique},
profileImage : {string, mandatory}, // s3 link
phone : {string, mandatory, unique, valid Indian mobile number},
password : {string, mandatory, minLen 8, maxLen 15}, // encrypted password
address : {
shipping : {
street : {string, mandatory},
city : {string, mandatory},
pincode : {number, mandatory}
},
billing : {
street : {string, mandatory},
city : {string, mandatory},
pincode : {number, mandatory}
}
},
createdAt : {timestamp},
updatedAt : {timestamp}
}
API de usuario
ENVIAR /registrarse
- Cree un documento de usuario a partir del cuerpo de la solicitud. El cuerpo de la solicitud debe contener una imagen.
- Cargue la imagen en el depósito S3 y guarde su URL pública en el documento del usuario.
- Guarde la contraseña en formato cifrado. (use bcrypt)
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 201. También devolver el documento de usuario. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
{
" status " : true,
" message " : " User created successfully " ,
" data " : {
" fname " : " John " ,
" lname " : " Doe " ,
" email " : " [email protected] " ,
" profileImage " : " https://classroom-training-bucket.s3.ap-south-1.amazonaws.com/user/copernico-p_kICQCOM4s-unsplash.jpg " ,
" phone " : 9876543210,
" password " : " $2b$10$DpOSGb0B7cT0f6L95RnpWO2P/AtEoE6OF9diIiAEP7QrTMaV29Kmm " ,
" address " : {
" shipping " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
},
" billing " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
}
},
" _id " : " 6162876abdcb70afeeaf9cf5 " ,
" createdAt " : " 2021-10-10T06:25:46.051Z " ,
" updatedAt " : " 2021-10-10T06:25:46.051Z " ,
" __v " : 0
}
}
ENVIAR/iniciar sesión
- Permitir que un usuario inicie sesión con su correo electrónico y contraseña.
- En un intento de inicio de sesión exitoso, devuelva el ID de usuario y un token JWT que contenga el ID de usuario, exp, iat.
NOTA: Hay un ligero cambio en el cuerpo de la respuesta. También debes devolver el ID de usuario además del token JWT.
- Formato de respuesta
- En caso de éxito : devuelve el estado HTTP 200 y el token JWT en el cuerpo de la respuesta. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
{
" status " : true,
" message " : " User login successfull " ,
" data " : {
" userId " : " 6165f29cfe83625cf2c10a5c " ,
" token " : " eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiI2MTYyODc2YWJkY2I3MGFmZWVhZjljZjUiLCJpYXQiOjE2MzM4NDczNzYsImV4cCI6MTYzMzg4MzM3Nn0.PgcBPLLg4J01Hyin-zR6BCk7JHBY-RpuWMG_oIK7aV8 "
}
}
GET /usuario/:userId/profile (se requiere autenticación)
- Permitir que un usuario obtenga detalles de su perfil.
- Asegúrese de que el ID de usuario en el parámetro de URL y en el token sea el mismo
- Formato de respuesta
- En caso de éxito : devuelve el estado HTTP 200 y devuelve el documento de usuario. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
{
" status " : true,
" message " : " User profile details " ,
" data " : {
" address " : {
" shipping " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
},
" billing " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452001
}
},
" _id " : " 6162876abdcb70afeeaf9cf5 " ,
" fname " : " John " ,
" lname " : " Doe " ,
" email " : " [email protected] " ,
" profileImage " : " https://classroom-training-bucket.s3.ap-south-1.amazonaws.com/user/copernico-p_kICQCOM4s-unsplash.jpg " ,
" phone " : 9876543210,
" password " : " $2b$10$DpOSGb0B7cT0f6L95RnpWO2P/AtEoE6OF9diIiAEP7QrTMaV29Kmm " ,
" createdAt " : " 2021-10-10T06:25:46.051Z " ,
" updatedAt " : " 2021-10-10T06:25:46.051Z " ,
" __v " : 0
}
}
PUT /usuario/:userId/profile (se requiere autenticación y autorización)
- Permitir que un usuario actualice su perfil.
- Un usuario puede actualizar todos los campos.
- Asegúrese de que el ID de usuario en el parámetro de URL y en el token sea el mismo
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 200. También devolver el documento de usuario actualizado. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
{
" status " : true,
" message " : " User profile updated " ,
" data " : {
" address " : {
" shipping " : {
" street " : " MG Road " ,
" city " : " Delhi " ,
" pincode " : 110001
},
" billing " : {
" street " : " MG Road " ,
" city " : " Indore " ,
" pincode " : 452010
}
},
" _id " : " 6162876abdcb70afeeaf9cf5 " ,
" fname " : " Jane " ,
" lname " : " Austin " ,
" email " : " [email protected] " ,
" profileImage " : " https://classroom-training-bucket.s3.ap-south-1.amazonaws.com/user/laura-davidson-QBAH4IldaZY-unsplash.jpg " ,
" phone " : 9876543210,
" password " : " $2b$10$jgF/j/clYBq.3uly6Tijce4GEGJn9EIXEcw9NI3prgKwJ/6.sWT6O " ,
" createdAt " : " 2021-10-10T06:25:46.051Z " ,
" updatedAt " : " 2021-10-10T08:47:15.297Z " ,
" __v " : 0
}
}
Nota: Bcrypt Enviar datos del formulario
FUNCIÓN II - Producto
Modelos
{
title : {string, mandatory, unique},
description : {string, mandatory},
price : {number, mandatory, valid number/decimal},
currencyId : {string, mandatory, INR},
currencyFormat : {string, mandatory, Rupee symbol},
isFreeShipping : {boolean, default: false},
productImage : {string, mandatory}, // s3 link
style : {string},
availableSizes : {array of string, at least one size, enum["S", "XS","M","X", "L","XXL", "XL"]},
installments : {number},
deletedAt : {Date, when the document is deleted},
isDeleted : {boolean, default: false},
createdAt : {timestamp},
updatedAt : {timestamp},
}
API de productos ( no se requiere autenticación )
ENVIAR /productos
- Cree un documento de producto a partir del cuerpo de la solicitud.
- Cargue la imagen del producto en el depósito S3 y guarde la URL pública de la imagen en el documento.
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 201. Devolver también el documento del producto. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
OBTENER /productos
- Devuelve todos los productos de la colección que no se eliminan.
- Filtros
- Tamaño (La clave para este filtro será 'tamaño')
- Nombre del producto (La clave para este filtro será 'nombre'). Debe devolver todos los productos cuyo nombre contenga la subcadena recibida en este filtro.
- Precio: mayor o menor que un valor específico. Las claves son 'priceGreaterThan' y 'priceLessThan'.
NOTA: Para la solicitud de filtro de precios, la solicitud puede contener ambas o cualquiera de las claves. Por ejemplo, la consulta en la solicitud podría verse así: { priceGreaterThan: 500, priceLessThan: 2000 } o simplemente { priceLessThan: 1000 } )
- Clasificar
- Ordenado por precio del producto en forma ascendente o descendente. El par clave-valor se verá así: {priceSort: 1} o {priceSort: -1}, por ejemplo, /products?size=XL&name=Nit%20grit
- Formato de respuesta
- En caso de éxito : devuelva el estado HTTP 200. Devuelva también los documentos del producto. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
OBTENER /productos/:IdProducto
- Devuelve detalles del producto por identificación del producto.
- Formato de respuesta
- En caso de éxito : devuelva el estado HTTP 200. Devuelva también los documentos del producto. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
PUT /productos/:idProducto
- Actualiza un producto cambiando al menos uno o todos los campos
- Compruebe si el ID del producto existe (debe tener isDeleted false y estar presente en la colección). Si no es así, devuelva un estado HTTP 404 con un cuerpo de respuesta como este
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 200. También devolver el documento del producto actualizado. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
ELIMINAR /productos/:idProducto
- Elimina un producto por ID de producto si aún no se ha eliminado
- Formato de respuesta
- En caso de éxito : devuelve el estado HTTP 200. La respuesta debe ser un objeto JSON como este
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
FUNCIÓN III - Carrito
Modelos
{
userId : {ObjectId, refs to User, mandatory, unique},
items : [{
productId : {ObjectId, refs to Product model, mandatory},
quantity : {number, mandatory, min 1}
}],
totalPrice : {number, mandatory, comment: "Holds total price of all the items in the cart"},
totalItems : {number, mandatory, comment: "Holds total number of items in the cart"},
createdAt : {timestamp},
updatedAt : {timestamp},
}
API de carrito ( se requiere autenticación como encabezado de autorización - token de portador )
POST /usuarios/:userId/cart (Agregar al carrito)
- Crea un carrito para el usuario si no existe. De lo contrario, agregue productos al carrito.
- Obtenga la identificación del carrito en el cuerpo de la solicitud.
- Obtenga el ID del producto en el cuerpo de la solicitud.
- Asegúrese de que el carrito exista.
- Agregue un producto (s) para un usuario en el carrito.
- Asegúrese de que el ID de usuario en los parámetros y en el token JWT coincidan.
- Asegúrese de que el usuario exista
- Asegúrese de que los productos sean válidos y no eliminados.
- Obtenga detalles del producto(s) en el cuerpo de la respuesta.
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 201. Devolver también el documento del carrito. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
PUT /users/:userId/cart (Eliminar producto / Reducir la cantidad de un producto del carrito)
- Actualiza un carrito disminuyendo la cantidad de un producto en 1 o eliminando un producto del carrito.
- Obtenga la identificación del carrito en el cuerpo de la solicitud.
- Obtenga el ID del producto en el cuerpo de la solicitud.
- Obtenga la clave 'removeProduct' en el cuerpo de la solicitud.
- Asegúrese de que el carrito exista.
- La clave 'removeProduct' indica si un producto debe eliminarse ({removeProduct: 0}) o su cantidad debe disminuirse en 1 ({removeProduct: 1}).
- Asegúrese de que el ID de usuario en los parámetros y en el token JWT coincidan.
- Asegúrese de que el usuario exista
- Obtenga detalles del producto(s) en el cuerpo de la respuesta.
- Verifique si el productId existe y no se elimina antes de actualizar el carrito.
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 200. También devolver el documento del carrito actualizado. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
OBTENER /usuarios/:userId/carrito
- Devuelve el resumen del carrito del usuario.
- Asegúrese de que el carrito exista.
- Asegúrese de que el ID de usuario en los parámetros y en el token JWT coincidan.
- Asegúrese de que el usuario exista
- Obtenga detalles del producto(s) en el cuerpo de la respuesta.
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 200. Devolver el documento del carrito. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
BORRAR /usuarios/:userId/carrito
- Elimina el carrito para el usuario.
- Asegúrese de que el carrito exista.
- Asegúrese de que el ID de usuario en los parámetros y en el token JWT coincidan.
- Asegúrese de que el usuario exista
- La eliminación del carrito significa que la matriz de artículos está vacía, totalItems es 0, totalPrice es 0.
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 204. Devolver un mensaje adecuado. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
ARTÍCULO IV - Orden
Modelos
{
userId : {ObjectId, refs to User, mandatory},
items : [{
productId : {ObjectId, refs to Product model, mandatory},
quantity : {number, mandatory, min 1}
}],
totalPrice : {number, mandatory, comment: "Holds total price of all the items in the cart"},
totalItems : {number, mandatory, comment: "Holds total number of items in the cart"},
totalQuantity : {number, mandatory, comment: "Holds total number of quantity in the cart"},
cancellable : {boolean, default: true},
status : {string, default: 'pending', enum[pending, completed, cancled]},
deletedAt : {Date, when the document is deleted},
isDeleted : {boolean, default: false},
createdAt : {timestamp},
updatedAt : {timestamp},
}
API de pago/pedido (se requiere autenticación y autorización)
POST /usuarios/:userId/pedidos
- Crear un pedido para el usuario.
- Asegúrese de que el ID de usuario en los parámetros y en el token JWT coincidan.
- Asegúrese de que el usuario exista
- Obtenga los detalles del carrito en el cuerpo de la solicitud
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 200. También devolver el documento de pedido. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
PUT /usuarios/:userId/pedidos
- Actualiza el estado de un pedido
- Asegúrese de que el ID de usuario en los parámetros y en el token JWT coincidan.
- Asegúrese de que el usuario exista
- Obtener ID del pedido en el cuerpo de la solicitud
- Asegúrate de que el pedido pertenece al usuario.
- Asegúrese de que solo se pueda cancelar un pedido cancelable. De lo contrario, envíe un mensaje de error y una respuesta adecuados.
- Formato de respuesta
- En caso de éxito : devolver el estado HTTP 200. También devolver el documento de pedido actualizado. La respuesta debería ser un objeto JSON como este.
- En caso de error : devuelve un mensaje de error adecuado con un código de estado HTTP válido. La respuesta debería ser un objeto JSON como este.
Pruebas
- Para probar estas API, cree una nueva colección en Postman llamada Project 5 Shopping Cart
- Cada API debe tener una nueva solicitud en esta colección.
- Cada solicitud de la colección debe tener el nombre correcto. Por ejemplo, crear usuario, crear producto, obtener productos, etc.
- Cada miembro de cada equipo debe tener sus pruebas en estado de ejecución.
Consulte el ejemplo a continuación
Respuesta
Estructura de respuesta exitosa
{
status : true,
message : ' Success ' ,
data : {
}
}
Estructura de respuesta de error
{
status : false,
message : " "
}
Colecciones
usuarios
{
_id : ObjectId("88abc190ef0288abc190ef02"),
fname : ' John ' ,
lname : ' Doe ' ,
email : ' [email protected] ' ,
profileImage : ' http://function-up-test.s3.amazonaws.com/users/user/johndoe.jpg ' , // s3 link
phone : 9876543210,
password : ' $2b$10$O.hrbBPCioVm237nAHYQ5OZy6k15TOoQSFhTT.recHBfQpZhM55Ty ' , // encrypted password
address : {
shipping : {
street : " 110, Ridhi Sidhi Tower " ,
city : " Jaipur " ,
pincode : 400001
}, {mandatory}
billing : {
street : " 110, Ridhi Sidhi Tower " ,
city : " Jaipur " ,
pincode : 400001
}
},
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}
productos
{
_id : ObjectId("88abc190ef0288abc190ef55"),
title : ' Nit Grit ' ,
description : ' Dummy description ' ,
price : 23.0,
currencyId : ' INR ' ,
currencyFormat : ' ₹ ' ,
isFreeShipping : false,
productImage : ' http://function-up-test.s3.amazonaws.com/products/product/nitgrit.jpg ' , // s3 link
style : ' Colloar ' ,
availableSizes : ["S", "XS","M","X", "L","XXL", "XL"],
installments : 5,
deletedAt : null,
isDeleted : false,
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}
carros
{
" _id " : ObjectId("88abc190ef0288abc190ef88"),
userId : ObjectId("88abc190ef0288abc190ef02"),
items : [{
productId : ObjectId("88abc190ef0288abc190ef55"),
quantity : 2
}, {
productId : ObjectId("88abc190ef0288abc190ef60"),
quantity : 1
}],
totalPrice : 50.99,
totalItems : 2,
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}
pedidos
{
" _id " : ObjectId("88abc190ef0288abc190ef88"),
userId : ObjectId("88abc190ef0288abc190ef02"),
items : [{
productId : ObjectId("88abc190ef0288abc190ef55"),
quantity : 2
}, {
productId : ObjectId("88abc190ef0288abc190ef60"),
quantity : 1
}],
totalPrice : 50.99,
totalItems : 2,
totalQuantity : 3,
cancellable : true,
status : ' pending '
createdAt : " 2021-09-17T04:25:07.803Z " ,
updatedAt : " 2021-09-17T04:25:07.803Z " ,
}