From 40adc7eb42d58c65667376c2b2fc409c62a435ab Mon Sep 17 00:00:00 2001 From: wayneleon1 Date: Thu, 11 Jul 2024 19:08:23 +0200 Subject: [PATCH] implement get client api adress and locatio --- .github/workflows/workflow_for_ecomm.yml | 1 + package-lock.json | 10 +-- src/controller/cartController.ts | 41 +++++++---- src/controller/categoryController.ts | 90 +++++++++++++----------- src/database/models/orderEntity.ts | 3 + 5 files changed, 82 insertions(+), 63 deletions(-) diff --git a/.github/workflows/workflow_for_ecomm.yml b/.github/workflows/workflow_for_ecomm.yml index c771eb5..026cd6b 100644 --- a/.github/workflows/workflow_for_ecomm.yml +++ b/.github/workflows/workflow_for_ecomm.yml @@ -66,3 +66,4 @@ jobs: API_KEY_URL: ${{ secrets.API_KEY_URL }} SUBSCRIPTION_KEY: ${{ secrets.SUBSCRIPTION_KEY }} DEFAULT_PROFILE_URL: ${{ secrets.DEFAULT_PROFILE_URL }} + IP_KEYS: ${{ secrets.IP_KEYS }} diff --git a/package-lock.json b/package-lock.json index b8b9d60..e808392 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6127,11 +6127,6 @@ "node": ">=0.10.0" } }, - "node_modules/ip": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", - "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -9652,6 +9647,11 @@ "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", "integrity": "sha512-2/JwIYRpMBDSjbQjUUppNSrmc719crhFaWIdT+TRSVA8gE+6HEobQWqJ6VkPt/H8twS7h/0WWs7veh8wmp98Ng==" }, + "node_modules/socks/node_modules/ip": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", + "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", diff --git a/src/controller/cartController.ts b/src/controller/cartController.ts index 076bf48..8a2635a 100644 --- a/src/controller/cartController.ts +++ b/src/controller/cartController.ts @@ -8,9 +8,8 @@ import applyCoupon from '../utilis/couponCalculator'; import { Order } from '../database/models/orderEntity'; import { OrderDetails } from '../database/models/orderDetailsEntity'; import { check, validationResult } from 'express-validator'; - - -import {eventEmitter} from '../Notification.vendor/event.services' +import { eventEmitter } from '../Notification.vendor/event.services'; +import axios from 'axios'; const cartRepository = dbConnection.getRepository(Cart); const productRepository = dbConnection.getRepository(Product); @@ -65,9 +64,9 @@ export const addToCart = errorHandler(async (req: Request, res: Response) => { newItem.quantity = quantity; const savedItem = await cartRepository.save(newItem); - - eventEmitter.emit('addToCart',productId, userId) - + + eventEmitter.emit('addToCart', productId, userId); + return res .status(201) .json({ msg: 'Item added to cart successfully', cartItem: savedItem }); @@ -150,7 +149,7 @@ export const removeItem = errorHandler(async (req: Request, res: Response) => { const cartItem = await cartRepository.findOne({ where: { id: itemId }, - select:{user:{id:true}, product:{id:true}}, + select: { user: { id: true }, product: { id: true } }, relations: ['user', 'product'], }); @@ -159,7 +158,7 @@ export const removeItem = errorHandler(async (req: Request, res: Response) => { } const deletedItem = await cartRepository.delete(itemId); - eventEmitter.emit('removeItem', cartItem) + eventEmitter.emit('removeItem', cartItem); return res.status(200).json({ msg: 'Cart Item deleted successfully', @@ -198,6 +197,20 @@ export const checkout = [ // Fetch the user who is checking out const user = await userRepository.findOne({ where: { id: userId } }); + // Get user country location + let country: string; + axios + .get( + `https://ipgeolocation.abstractapi.com/v1/?api_key=${process.env.IP_KEYS}&ip_address=` + ) + .then((response) => { + // console.log(response.data.country); + country = response.data.country; + }) + .catch((error) => { + res.send(error); + }); + // Fetch the cart items for this user const cartItems = await cartRepository.find({ where: { user: { id: userId } }, @@ -233,7 +246,6 @@ export const checkout = [ orderDetail.price = price; orderDetails.push(orderDetail); - } // Ensure totalAmount is an integer @@ -246,12 +258,13 @@ export const checkout = [ order.totalAmount = totalAmount; order.status = 'Pending'; order.deliveryInfo = deliveryInfo; + order.country = country!; order.trackingNumber = trackingNumber; order.orderDetails = orderDetails; const savedOrder = await orderRepository.save(order); - - eventEmitter.emit('pressorder', order) + + eventEmitter.emit('pressorder', order); await cartRepository.delete({ user: { id: userId } }); @@ -292,11 +305,9 @@ export const cancelOrder = errorHandler(async (req: Request, res: Response) => { if (!order) { return res.status(404).json({ msg: 'Order not found' }); } - eventEmitter.emit('order_canceled', orderId) - - await orderRepository.remove(order); + eventEmitter.emit('order_canceled', orderId); - + await orderRepository.remove(order); return res.status(200).json({ msg: 'Order canceled successfully' }); }); diff --git a/src/controller/categoryController.ts b/src/controller/categoryController.ts index eea7bbd..e2cd376 100644 --- a/src/controller/categoryController.ts +++ b/src/controller/categoryController.ts @@ -6,7 +6,7 @@ import errorHandler from '../middlewares/errorHandler'; import { Order } from '../database/models/orderEntity'; const categoryRepository = dbConnection.getRepository(Category); -const orderRepository = dbConnection.getRepository(Order) +const orderRepository = dbConnection.getRepository(Order); interface categoryRequestBody { name: string; @@ -136,64 +136,68 @@ export const deleteCategory = errorHandler( export const getCategoryMetrics = errorHandler( async (req: Request, res: Response) => { const orders = await orderRepository.find({ - where:{ - paid: true + where: { + paid: true, }, - select:{ - id:true, - totalAmount:true, - paid:true, - orderDetails:{ - id:true, - price:true, - quantity:true, - product:{ - id:true, - name:true, - category:{ - id:true, - name:true - } + select: { + id: true, + totalAmount: true, + paid: true, + orderDetails: { + id: true, + price: true, + quantity: true, + product: { + id: true, + name: true, + category: { + id: true, + name: true, + }, }, - } + }, }, - relations:['orderDetails','orderDetails.product','orderDetails.product.category'] - }) + relations: [ + 'orderDetails', + 'orderDetails.product', + 'orderDetails.product.category', + ], + }); const categories = await categoryRepository.find({ - select:{ - products:{ - id:true - } + select: { + products: { + id: true, + }, }, - relations: ['products'] - }) - - const counter:{[key:string]:number} = {}; - for(const order of orders){ - for(const orderDetail of order.orderDetails){ - if(orderDetail.product.category.name in order){ - counter[orderDetail.product.category.name] += orderDetail.price - }else{ - counter[orderDetail.product.category.name] = orderDetail.price + relations: ['products'], + }); + + const counter: { [key: string]: number } = {}; + for (const order of orders) { + for (const orderDetail of order.orderDetails) { + if (orderDetail.product.category.name in counter) { + counter[orderDetail.product.category.name] += orderDetail.price; + } else { + counter[orderDetail.product.category.name] = orderDetail.price; } } } - const data = [] + const data = []; - for(const category of categories){ - if(category.name in counter){ + for (const category of categories) { + if (category.name in counter) { data.push({ categoryName: category.name, totalProducts: category.products.length, - totalSales: counter[category.name] - }) + totalSales: counter[category.name], + }); } } - data.sort((a, b) => b.totalSales - a.totalSales) + data.sort((a, b) => b.totalSales - a.totalSales); - return res.status(200).json({data:data.slice(0,4)}) + return res.status(200).json({ data: data.slice(0, 4) }); } -); \ No newline at end of file +); diff --git a/src/database/models/orderEntity.ts b/src/database/models/orderEntity.ts index 8b0a0b5..6b3b2bc 100644 --- a/src/database/models/orderEntity.ts +++ b/src/database/models/orderEntity.ts @@ -27,6 +27,9 @@ export class Order { @Column({ nullable: true }) deliveryInfo: string; + @Column({ nullable: true }) + country: string; + @Column({ nullable: true }) paymentInfo: string;