From bade730f8f166022bc06ef5d5ac49fbb04165d43 Mon Sep 17 00:00:00 2001 From: Heisjabo Date: Mon, 27 May 2024 15:09:45 +0200 Subject: [PATCH] feat(fake-ads): generate fake ads from aws - using lambda function to generate ads from aliexpress Delivers #187658789 --- .github/workflows/deploy.yml | 1 + __test__/product.test.ts | 6 ++++++ package.json | 1 + src/controllers/adsController.ts | 18 ++++++++++++++++++ src/docs/products.ts | 30 ++++++++++++++++++++++++++++++ src/docs/swagger.ts | 4 ++++ src/routes/productsRoute.ts | 2 ++ src/services/ads.service.ts | 15 +++++++++++++++ src/utils/env.ts | 3 ++- 9 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 src/controllers/adsController.ts create mode 100644 src/services/ads.service.ts diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 1415c32..a203be4 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -48,6 +48,7 @@ jobs: REDIS_URL: ${{ secrets.REDIS_URL }} STRIPE_SECRET_KEY: ${{ secrets.STRIPE_SECRET_KEY }} REMOTE_URL: ${{ secrets.REMOTE_URL }} + ADS_URL: ${{ secrets.ADS_URL }} run: npm run test diff --git a/__test__/product.test.ts b/__test__/product.test.ts index 027c060..ba8ea65 100644 --- a/__test__/product.test.ts +++ b/__test__/product.test.ts @@ -459,6 +459,12 @@ expect(response.body).toEqual({ }) }) +test("should return 200 when getting ads from aws lambda", async () => { + const response = await request(app) + .get("/api/v1/products/ads?query=Electronics"); + expect(response.status).toBe(200); +}) + test("Return 500 for handle error", async () => { const response = await request(app) .get("/api/v1/products/review") diff --git a/package.json b/package.json index 3becaa5..b0eb729 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "dependencies": { "@types/bcrypt": "^5.0.2", "@types/socket.io": "^3.0.2", + "axios": "^1.7.2", "bcrypt": "^5.1.1", "bcryptjs": "^2.4.3", "cloudinary": "^2.2.0", diff --git a/src/controllers/adsController.ts b/src/controllers/adsController.ts new file mode 100644 index 0000000..e4333ce --- /dev/null +++ b/src/controllers/adsController.ts @@ -0,0 +1,18 @@ +import { fetchAds } from "../services/ads.service"; +import { Request, Response } from "express"; + +export const getAds = async ( req: Request, res: Response) => { + try{ + const { query } = req.query || "electronics"; + //@ts-ignore + const ads = await fetchAds(query); + return res.status(ads.statusCode).json({ + message: ads.message, + data: ads.data + }); + }catch(err: any){ + return res.status(500).json({ + message: err.message + }) + } +} diff --git a/src/docs/products.ts b/src/docs/products.ts index 4a15d74..feffd77 100644 --- a/src/docs/products.ts +++ b/src/docs/products.ts @@ -268,3 +268,33 @@ export const getProducts = { } } }; + + export const getAdProducts = { + tags: ["Products"], + security: [{ bearerAuth: [] }], + summary: "Fetch ads from aliexpress", + description: "This endpoint fetches advertisements based on a query parameter. If no query is provided, it defaults to 'electronics'.", + parameters: [ + { + name: "query", + in: "query", + required: false, + description: "The search query for fetching ads.", + schema: { + type: "string", + example: "Electronics" + } + } + ], + responses: { + 200: { + description: "Success", + }, + 404: { + description: "Not Found", + }, + 500: { + description: "Internal Server Error", + } + } + } diff --git a/src/docs/swagger.ts b/src/docs/swagger.ts index 81d734b..11fb92d 100644 --- a/src/docs/swagger.ts +++ b/src/docs/swagger.ts @@ -45,6 +45,7 @@ import { getAllNotifications, readNotification } from "./notifications"; import { homepage } from "./home"; import { payment } from "./payments"; import { createReviewProduct, deleteReview, getReviewProduct, reviewSchema, updateReviewProduct } from "./reviews"; +import { getAdProducts } from "./products"; const docRouter = express.Router(); @@ -142,6 +143,9 @@ const options = { patch: updateProducts, delete: deleteProducts, }, + "/api/v1/products/ads": { + get: getAdProducts + }, "/api/v1/categories": { get: getCategories, post: addCategories, diff --git a/src/routes/productsRoute.ts b/src/routes/productsRoute.ts index c445721..164a3a6 100644 --- a/src/routes/productsRoute.ts +++ b/src/routes/productsRoute.ts @@ -10,9 +10,11 @@ import { addReviewController, deleteReviewController, getreviewController, updat import { addReviewValidate, updateReviewValidate } from "../schemas/review"; import { hasPurchasedProduct } from "../middlewares/hasPurchased"; import { isPasswordOutOfDate } from "../middlewares/isPasswordOutOfDate"; +import { getAds } from "../controllers/adsController"; const productsRouter = Router(); productsRouter.get("/search",isPasswordOutOfDate, searchProductController) +productsRouter.get('/ads', getAds); productsRouter.get("/",isLoggedIn,isPasswordOutOfDate,fetchProducts); productsRouter.get("/:id",isLoggedIn,isPasswordOutOfDate,fetchSingleProduct); diff --git a/src/services/ads.service.ts b/src/services/ads.service.ts new file mode 100644 index 0000000..a360207 --- /dev/null +++ b/src/services/ads.service.ts @@ -0,0 +1,15 @@ +import axios from 'axios'; +import { env } from '../utils/env'; + +export const fetchAds = async (query: string) => { + try { + const response = await axios.get(`${env.ADS_URL}`, { + params: { query } + }); + const data = await response.data + return data; + } catch (error: any) { + throw Error(error.message); + } +} + diff --git a/src/utils/env.ts b/src/utils/env.ts index 345c50e..3803efb 100644 --- a/src/utils/env.ts +++ b/src/utils/env.ts @@ -18,5 +18,6 @@ export const env = { redis_url: process.env.REDIS_URL as string, client_url: process.env.CLIENT_URL as string, stripe_secret: process.env.STRIPE_SECRET_KEY as string, - password_expiration_time: process.env.TIME_FOR_PASSWORD_EXPIRATION as string + password_expiration_time: process.env.TIME_FOR_PASSWORD_EXPIRATION as string, + ADS_URL: process.env.ADS_URL as String }; \ No newline at end of file