From 163f732ac7487ac6fc1faf2d113449c50d040dcd Mon Sep 17 00:00:00 2001 From: "Jyotirmoy Bandyopadhyaya [Bravo68]" Date: Wed, 3 May 2023 18:21:18 +0530 Subject: [PATCH] added ip info support to api --- .eslintrc | 3 +- .gitignore | 4 +- packages/api/bin/fetch-mmdb.sh | 15 ++++++++ packages/api/controllers/ipinfo.controller.ts | 37 +++++++++++++++++++ packages/api/helpers/mmdb_client.ts | 6 +++ packages/api/index.ts | 1 + packages/api/package.json | 2 + packages/api/routes/api/ip.routes.ts | 10 +++++ packages/api/services/ipinfo.service.ts | 8 ++++ 9 files changed, 83 insertions(+), 3 deletions(-) create mode 100755 packages/api/bin/fetch-mmdb.sh create mode 100644 packages/api/controllers/ipinfo.controller.ts create mode 100644 packages/api/helpers/mmdb_client.ts create mode 100644 packages/api/routes/api/ip.routes.ts create mode 100644 packages/api/services/ipinfo.service.ts diff --git a/.eslintrc b/.eslintrc index c34a858..bbed8d8 100644 --- a/.eslintrc +++ b/.eslintrc @@ -7,8 +7,7 @@ "plugins": ["@typescript-eslint"], "extends": [ "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "prettier" + "plugin:@typescript-eslint/recommended" ], "rules": { "@typescript-eslint/no-unused-vars": "warn", diff --git a/.gitignore b/.gitignore index e3f65bd..fdadfec 100644 --- a/.gitignore +++ b/.gitignore @@ -134,4 +134,6 @@ dist **/jwtRS256.key.pub **/yarn.lock -.husky \ No newline at end of file +.husky + +**/GeoLite2-City* \ No newline at end of file diff --git a/packages/api/bin/fetch-mmdb.sh b/packages/api/bin/fetch-mmdb.sh new file mode 100755 index 0000000..1561d8d --- /dev/null +++ b/packages/api/bin/fetch-mmdb.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# API_KEY="PIiA7448yJCk23aO" +# URL="https://download.maxmind.com/app/geoip_download?edition_id=GeoLite2-City&license_key=$API_KEY&suffix=tar.gz" +URL="https://download.db-ip.com/free/dbip-city-lite-2023-05.mmdb.gz" +wget -O "GeoLite2-City.gz" "$URL" + +# unzip gz file +gzip -d GeoLite2-City.gz + + +mv GeoLite2-City "GeoLite2-City.mmdb" + +rm -rf GeoLite2-City.gz +echo "Done!!" \ No newline at end of file diff --git a/packages/api/controllers/ipinfo.controller.ts b/packages/api/controllers/ipinfo.controller.ts new file mode 100644 index 0000000..56cae27 --- /dev/null +++ b/packages/api/controllers/ipinfo.controller.ts @@ -0,0 +1,37 @@ +import IPInfo from '../services/ipinfo.service' +import { Request, Response, NextFunction } from 'express' + +const { getIPInfo } = new IPInfo() + +export default class IPInfoController { + public async fetchCurrentIPInfo( + req: Request, + res: Response, + next: NextFunction + ): Promise { + try { + const ip = + req.headers['x-forwarded-for'] || + req.socket.remoteAddress || + req.ip + const data = await getIPInfo(ip as string) + res.status(200).json(data) + } catch (error: any) { + next(error) + } + } + + public async fetchIPInfo( + req: Request, + res: Response, + next: NextFunction + ): Promise { + try { + const { ip } = req.params + const data = await getIPInfo(ip) + res.status(200).json(data) + } catch (error: any) { + next(error) + } + } +} diff --git a/packages/api/helpers/mmdb_client.ts b/packages/api/helpers/mmdb_client.ts new file mode 100644 index 0000000..ad205ce --- /dev/null +++ b/packages/api/helpers/mmdb_client.ts @@ -0,0 +1,6 @@ +import fs from 'fs' +import mmdb, { CityResponse } from 'mmdb-lib' + +const db = fs.readFileSync('GeoLite2-City.mmdb') + +export default new mmdb.Reader(db) diff --git a/packages/api/index.ts b/packages/api/index.ts index c88b393..14eb085 100644 --- a/packages/api/index.ts +++ b/packages/api/index.ts @@ -29,6 +29,7 @@ app.use(morgan('dev')) app.use(express.json()) app.use(express.urlencoded({ extended: true, limit: '50mb' })) app.set('view engine', 'ejs') +app.set('trust proxy', true) console.log('☄ ', 'Base Route', '/') diff --git a/packages/api/package.json b/packages/api/package.json index 39c3afe..34bd5aa 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -22,6 +22,7 @@ "graphql-request": "^5.0.0", "helmet": "^6.0.1", "joi": "^17.7.0", + "mmdb-lib": "^2.0.2", "morgan": "^1.10.0", "multer": "^1.4.5-lts.1", "multer-s3": "^3.0.1", @@ -48,6 +49,7 @@ "@swc/wasm": "^1.3.23", "@types/cors": "^2.8.13", "@types/morgan": "^1.9.3", + "@typescript-eslint/eslint-plugin": "^5.59.2", "concurrently": "^7.6.0", "cross-env": "^7.0.3", "graphqurl": "^1.0.1", diff --git a/packages/api/routes/api/ip.routes.ts b/packages/api/routes/api/ip.routes.ts new file mode 100644 index 0000000..96024d0 --- /dev/null +++ b/packages/api/routes/api/ip.routes.ts @@ -0,0 +1,10 @@ +import { Router } from 'express' +import IPController from '../../controllers/ipinfo.controller' + +const router = Router() +const ipController = new IPController() + +router.get('/current', ipController.fetchCurrentIPInfo) +router.get('/:ip', ipController.fetchIPInfo) + +export default router diff --git a/packages/api/services/ipinfo.service.ts b/packages/api/services/ipinfo.service.ts new file mode 100644 index 0000000..5bec6f6 --- /dev/null +++ b/packages/api/services/ipinfo.service.ts @@ -0,0 +1,8 @@ +import mmdb_client from '../helpers/mmdb_client' + +export default class IPInfo { + public getIPInfo = async (ip: string) => { + const data = await mmdb_client.get(ip) + return data + } +}