📋 Clase #13: Obteniendo órdenes del perfil 13/20 📋
Se quiere obtener las ordenes del usuario sin necesidad de enviar el id del usuario, para ello se usa el token del usuario cuando hizo login que a su vez tiene un identificador llamado “sub”.
Pasos:
- Vamos a ++VSC++, abrimos la carpeta services y abrimos el archivo order.service.js, se implementa la lógica para la función buscar por usuario:
findByUser (mas info: aquí), el código queda:
async findByUser(userId) {
//Se hace la consulta a pesar que se tiene el id de user y no de customer
const orders = await models.Order.findAll({
//Cuando hay tipos de estas asociaciones, se usa: where
where: {
'$customer.user.id$': userId
},
include: [
{
//Customer tiene una relación con user (relación de tablas)
association: 'customer',
//Con user se puede filtrar esas ordenes de compra asociadas a ese usuario y a customer
include: ['user']
}
]
});
return orders;
}
Guardamos, ahora necesitamos crear una nueva ruta, vamos a la carpeta routes y creamos el archivo profile.routes.js, se implementará la lógica para obtener las ordenes del usuario pasándole el sub del payload y no el id del user, el código queda:
const express=require('express');
const passport=require('passport');
const OrderService=require('../services/order.service');
const router=express.Router();
const service=new OrderService();
router.get('/my-orders',
passport.authenticate('jwt',{session:false}),
async(req,res,next)=>{
try{
//Necesitamos el user para obtener el identificador sub
const user=req.user;
//Las ordenes de compra
const orders=await service.findByUser(user.sub);
res.json(orders);
}catch(error){
next(error);
}
}
);
module.exports=router;
Guardamos, necesitamos actualizar el index.js de la carpeta routes, se agrega después de authRouter:
const profileRouter = require('./profile.router');
La ruta dentro de routerApi queda:
router.use('/profile', profileRouter);
Guardamos, si no se ha compilado con: npm run dev en la terminal, esperar a Mi port 3000
- Vamos a ++Insomnia++, entramos a la carpeta Auth, duplicamos el Login y lo editamos y colocamos Get orders y la solicitud en GET, la dirección:
_.API_URL/api/v1/profile/my-orders, antes de consultar, en la pestaña de Auth, se selcciona “Bearer” y en TOKEN se pega el token del usuario autenticado en Auth. Si le damos a ++Send++, debe salir un código 200 OK y como no se han hecho registros de ordenes, nos sale un array vacío: []
- Para llenar el array de las ordenes de compra, debemos añadir las ordenes. Para ello necesitamos saber el id del usuario, pero necesitamos el id del customer porque lo creamos desde esa tabla, para conocer ese Id, vamos al navegador, entramos a ++pgAdmin++.
- Cuando entramos a ++pgAdmin++, al lado izquierdo hay un panel donde sale “Servers”, al darle click sale una lista de jerarquía desplegable, ir a
MyStore > Databases > my_store > Schemas > public > Tables > customers, le damos con el botón derecho del mouse sobre customers y seleccionamos View/Edit Data > All Rows, aparece la tabla con todos los customers, buscamos el usuario del token e identificamos en la primera columna el id.
- Vamos a ++Insomnia++ y dentro de la carpeta Orders, seleccionamos POST Create orders (dirección:
_ . API_URL/api/v1/orders) y en el body de JSON se coloca el id que identificamos en ++pgAdmin++, en mi caso:
{
"customerId": 2
}
Para agregar productos a la orden, debemos tener algunos productos creados, en caso de que no se hayan creado, vamos a la carpeta de Products, seleccionamos POST Create products (dirección: _ . API_URL/api/v1/products) y vamos creando productos solo editando el name (se puede editar el resto de items si se desea), por ejemplo:
{
"name": "Product 2",
"price": "30",
"description": "example and test 2",
"image": "http: // placeimg. com/640/480",
"categoryId": 2
}
Al dar ++Send++, nos va arrojando un código 201 Created cada vez que creamos un producto:
{
"createdAt": "2023-03-29T02:29:31.823Z",
"id": 2,
"name": "Product 2",
"price": 30,
"description": "example and test 2",
"image": "http: // placeimg. com/640/480",
"categoryId": 2
}
- Ahora vamos a la carpeta de Orders y seleccionamos POST Create Items (dirección:
_ . API_URL/api/v1/orders/add-item), se debe especificar los siguientes items:
{
"orderId": 2,
"productId": 1,
"amount": 2
}
Al dar ++Send++, nos arroja un código 201 Creted:
{
"createdAt": "2023-03-29T02:30:21.591Z",
"id": 2,
"orderId": 2,
"productId": 1,
"amount": 2
}
- Si agregamos varios items y queremos consultarlos todos, vamos a la carpeta de Auth en Get orders y al dar ++Send++, nos arroja un código
200 OK y todos los items con su respectiva información:
[
{
"total": 0,
"id": 1,
"customerId": 2,
"createdAt": "2023-03-29T02:22:51.691Z",
"customer": {
"id": 2,
"name": "Pedro",
"lastName": "Vicente",
"phone": "9898",
"createdAt": "2023-03-28T21:32:16.237Z",
"userId": 4,
"user": {
"id": 4,
"email": "pedro @mail. com",
"password": "$2b$10$2IC2hbfyNR2jMaKE71ZNZOazZy0EeMN/kzb6I7/v1PgN5/7350cqu",
"role": "customer",
"createdAt": "2023-03-28T21:32:16.237Z"
}
}
},
{
"total": 0,
"id": 2,
"customerId": 2,
"createdAt": "2023-03-29T02:23:17.224Z",
"customer": {
"id": 2,
"name": "Pedro",
"lastName": "Vicente",
"phone": "9898",
"createdAt": "2023-03-28T21:32:16.237Z",
"userId": 4,
"user": {
"id": 4,
"email": "pedro @mail. com",
"password": "$2b$10$2IC2hbfyNR2jMaKE71ZNZOazZy0EeMN/kzb6I7/v1PgN5/7350cqu",
"role": "customer",
"createdAt": "2023-03-28T21:32:16.237Z"
}
}
}
]