From 2569cfbea943975b94eb223b125527b35029b404 Mon Sep 17 00:00:00 2001 From: goemen <gnthomiwa@gmail.com> Date: Thu, 2 May 2024 11:00:39 -0700 Subject: [PATCH] add delete api to external api --- backend-external/src/app.ts | 18 +---- backend-external/src/config/index.ts | 12 ++-- .../src/v1/routes/pay-transparency-routes.ts | 70 ++++++++++++++++++- .../v1/services/pay-transparency-service.ts | 33 +++++++-- .../src/v1/routes/external-consumer-routes.ts | 14 ++-- backend/src/v1/services/auth-service.ts | 1 + .../v1/services/external-consumer-service.ts | 4 +- 7 files changed, 115 insertions(+), 37 deletions(-) diff --git a/backend-external/src/app.ts b/backend-external/src/app.ts index c2d56b50a..3dbb583d0 100644 --- a/backend-external/src/app.ts +++ b/backend-external/src/app.ts @@ -80,29 +80,13 @@ app.use(/(\/api)?/, apiRouter); apiRouter.get('/', (_req, res) => { res.sendStatus(200); // generally for route verification and health check. }); -const globalMiddleware = (req: Request, res: Response, next: NextFunction) => { - const apiKey = req.header('x-api-key'); - if (apiKey) { - if (config.get('server:apiKey') === apiKey) { - next(); - } else { - logger.error('Invalid API Key'); - res.status(401).send({ message: 'Invalid API Key' }); - } - } else { - logger.error('API Key is missing in the request header'); - res.status(400).send({ - message: 'API Key is missing in the request header', - }); - } -}; + const specs = swaggerJsdoc(utils.swaggerDocsOptions); apiRouter.use( '/v1/docs', swaggerUi.serve, swaggerUi.setup(specs, { explorer: true }), ); -apiRouter.use(globalMiddleware); apiRouter.use('/v1/pay-transparency', payTransparencyRouter); // Handle 500 diff --git a/backend-external/src/config/index.ts b/backend-external/src/config/index.ts index a239e7075..be12ee334 100644 --- a/backend-external/src/config/index.ts +++ b/backend-external/src/config/index.ts @@ -10,17 +10,21 @@ config.defaults({ logLevel: process.env.LOG_LEVEL, morganFormat: 'dev', apiKey: process.env.EXTERNAL_CONSUMER_API_KEY || 'api-key', + deleteReportsApiKey: + process.env.EXTERNAL_API_DELETE_REPORTS_KEY || 'api-key', port: process.env.PORT || 3002, rateLimit: { enabled: process.env.IS_RATE_LIMIT_ENABLED || false, // Disable if rate limiting is not required windowMs: process.env.RATE_LIMIT_WINDOW_MS || 60000, // 1 minute limit: process.env.RATE_LIMIT_LIMIT || 100, // Limit each IP to 100 requests per `window` (here, per 1 minute) }, - baseURL: process.env.BASE_URL || 'http://localhost:3002' + baseURL: process.env.BASE_URL || 'http://localhost:3002', }, - backend:{ + backend: { apiKey: process.env.BACKEND_EXTERNAL_API_KEY || 'api-key', - url: process.env.BACKEND_URL || 'http://localhost:3010' - } + deleteReportsApiKey: + process.env.BACKEND_EXTERNAL_DELETE_REPORTS_API_KEY || 'api-key', + url: process.env.BACKEND_URL || 'http://localhost:3010', + }, }); export { config }; diff --git a/backend-external/src/v1/routes/pay-transparency-routes.ts b/backend-external/src/v1/routes/pay-transparency-routes.ts index d4ddd61e2..cd52bce88 100644 --- a/backend-external/src/v1/routes/pay-transparency-routes.ts +++ b/backend-external/src/v1/routes/pay-transparency-routes.ts @@ -1,8 +1,28 @@ -import express, { Request, Response } from 'express'; +import express, { NextFunction, Request, Response } from 'express'; import { payTransparencyService } from '../services/pay-transparency-service'; import { utils } from '../../utils'; +import { logger } from '../../logger'; +import { config } from '../../config'; const router = express.Router(); +const validateApiKey = + (validKey: string) => (req: Request, res: Response, next: NextFunction) => { + const apiKey = req.header('x-api-key'); + if (apiKey) { + if (validKey === apiKey) { + next(); + } else { + logger.error('Invalid API Key'); + res.status(401).send({ message: 'Invalid API Key' }); + } + } else { + logger.error('API Key is missing in the request header'); + res.status(400).send({ + message: 'API Key is missing in the request header', + }); + } + }; + /** * @swagger * components: @@ -71,7 +91,7 @@ const router = express.Router(); * items: * $ref: "#/components/schemas/CalculatedData" * Report: - * allOf: + * allOf: * - $ref: "#/components/schemas/ReportItem" * * PaginatedReports: @@ -139,6 +159,7 @@ const router = express.Router(); */ router.get( '/', + validateApiKey(config.get('server:apiKey')), utils.asyncHandler(async (req: Request, res: Response) => { try { const startDate = req.query.startDate?.toString(); @@ -165,4 +186,49 @@ router.get( } }), ); + +/** + * @swagger + * tags: + * name: Reports + * /delete-reports: + * delete: + * summary: Delete reports + * tags: [Reports] + * security: + * - ApiKeyAuth: [] + * parameters: + * - in: query + * name: companyId + * required: true + * schema: + * type: string + * responses: + * 200: + * description: Successfully deleted reports + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + */ +router.delete( + '/delete-reports', + validateApiKey(config.get('server:deleteReportsApiKey')), + async (req, res) => { + try { + const { data } = await payTransparencyService.deleteReports(req); + if (data.error) { + return res.status(400).json({ message: data.message }); + } + + return res.status(200).json({ message: data.message }); + } catch (error) { + return res.status(500).json({ message: error.message }); + } + }, +); + export default router; diff --git a/backend-external/src/v1/services/pay-transparency-service.ts b/backend-external/src/v1/services/pay-transparency-service.ts index 3d88f7c35..23bb9b209 100644 --- a/backend-external/src/v1/services/pay-transparency-service.ts +++ b/backend-external/src/v1/services/pay-transparency-service.ts @@ -1,16 +1,39 @@ +import { AxiosRequestConfig } from 'axios'; import { utils } from '../../utils'; +import { config } from '../../config'; +import { Request } from 'express'; export const payTransparencyService = { - async getPayTransparencyData(startDate: string, endDate: string, offset: number, limit: number) { + async getPayTransparencyData( + startDate: string, + endDate: string, + offset: number, + limit: number, + ) { const axiosConfig = { params: { startDate, endDate, offset, - limit - } + limit, + }, }; - const { status, data } = await utils.backendAxios().get('/external-consumer-api/v1/', axiosConfig); + const { status, data } = await utils + .backendAxios() + .get('/external-consumer-api/v1/', axiosConfig); return { status, data }; - } + }, + async deleteReports(req: Request) { + const axiosConfig: AxiosRequestConfig = { + params: req.params, + headers: { + 'x-api-key': config.get('backend:deleteReportsApiKey'), + }, + }; + const { status, data } = await utils.backendAxios().delete<{ + error: boolean; + message: string; + }>('/external-consumer-api/v1/delete-reports', axiosConfig); + return { status, data }; + }, }; diff --git a/backend/src/v1/routes/external-consumer-routes.ts b/backend/src/v1/routes/external-consumer-routes.ts index 03775cded..5c31c0b26 100644 --- a/backend/src/v1/routes/external-consumer-routes.ts +++ b/backend/src/v1/routes/external-consumer-routes.ts @@ -3,8 +3,6 @@ import { externalConsumerService } from '../services/external-consumer-service'; import { utils } from '../services/utils-service'; import { logger } from '../../logger'; import { config } from '../../config'; -import passport from 'passport'; -import { auth } from '../services/auth-service'; const validateToken = (validApiKey: string) => @@ -54,14 +52,14 @@ router.get( router.delete( '/delete-reports', - validateToken(config.get('backendExternal:apiDeleteReportsKey')), - passport.authenticate('jwt', { session: false }), - (req: Request, res: Response, next: NextFunction) => { - auth.isValidBackendToken()(req, res, next); - }, async (req, res) => { - const { bceid_business_guid } = utils.getSessionUser(req)?._json; + try { + await externalConsumerService.deleteReports(req.query.companyId as string); + res.status(200).json({ error: false, message: 'Reports deleted' }); + } catch (error) { + res.json({ error: true, message: error.message }); + } }, ); diff --git a/backend/src/v1/services/auth-service.ts b/backend/src/v1/services/auth-service.ts index 22a053cf7..98cca3b0c 100644 --- a/backend/src/v1/services/auth-service.ts +++ b/backend/src/v1/services/auth-service.ts @@ -185,6 +185,7 @@ const auth = { } const userInfoFrontend = { displayName: userInfo._json.display_name, + businessId: userInfo._json.bceid_business_guid, ...session.companyDetails, }; return res.status(HttpStatus.OK).json(userInfoFrontend); diff --git a/backend/src/v1/services/external-consumer-service.ts b/backend/src/v1/services/external-consumer-service.ts index 2ccc2d7fd..c60c9ab78 100644 --- a/backend/src/v1/services/external-consumer-service.ts +++ b/backend/src/v1/services/external-consumer-service.ts @@ -224,7 +224,9 @@ const externalConsumerService = { await tx.pay_transparency_report.deleteMany({ where: { - pay_transparency_company: {}, + pay_transparency_company: { + bceid_business_guid, + }, }, }); });