From a33fa6e83c824b12670f5b08bf8d1e1723402f86 Mon Sep 17 00:00:00 2001 From: "Jyotirmoy Bandyopadhyaya [Bravo68]" Date: Sat, 23 Apr 2022 00:30:35 +0530 Subject: [PATCH] merge Dev/ahead branch (#144) * Added Support for Geo Tracking and API Key auto * added switch cases (#143) Co-authored-by: akankshat05 <72144454+akankshat05@users.noreply.github.com> --- backend/controllers/home_controller.js | 9 +- backend/controllers/minify.js | 241 +++++++++++++++++++++---- backend/controllers/user.js | 19 +- backend/middlewares/auth.js | 19 ++ backend/models/minifed_urls.js | 9 + backend/models/user.js | 8 + backend/package.json | 4 +- backend/routers/minify.js | 7 +- backend/routers/user.js | 4 +- 9 files changed, 273 insertions(+), 47 deletions(-) diff --git a/backend/controllers/home_controller.js b/backend/controllers/home_controller.js index 0cb2a62..6c90529 100644 --- a/backend/controllers/home_controller.js +++ b/backend/controllers/home_controller.js @@ -1,3 +1,10 @@ +const package = require('../package.json') + module.exports.home = function (req, res) { - return res.send('URL MiniFy is running') + return res.json({ + name: package.name, + version: package.version, + description: package.description, + github: package.homepage, + }) } diff --git a/backend/controllers/minify.js b/backend/controllers/minify.js index 9f76383..fa1697c 100644 --- a/backend/controllers/minify.js +++ b/backend/controllers/minify.js @@ -1,12 +1,37 @@ const Minfy = require('../models/minifed_urls') const base_url = 'https://minfy.xyz/' const { nanoid } = require('nanoid') +const axios = require('axios') -const blackListedAliases = ['404','dashboard','qr','credits','github','admin','geo','all','me','go','upload','download','link','about','tos','faqs'] +const blackListedAliases = [ + '404', + 'dashboard', + 'qr', + 'credits', + 'github', + 'admin', + 'geo', + 'all', + 'me', + 'go', + 'upload', + 'download', + 'link', + 'about', + 'tos', + 'faqs', + 'privacy', + 'contact', + 'terms', + 'help', + 'api', + 'api-docs', + 'auto', +] function verifyAlias(alias) { - const boolean = blackListedAliases.find(element => element===alias); - return boolean; + const boolean = blackListedAliases.find((element) => element === alias) + return boolean } module.exports.getAllData = async (req, res) => { Minfy.find({}) @@ -48,33 +73,33 @@ module.exports.findUrlById = async (req, res) => { } module.exports.getAliasStatus = async (req, res) => { - try{ - const alias = req.params.alias; - const aliasStatus = await Minfy.findOne({ alias }); + try { + const alias = req.params.alias + const aliasStatus = await Minfy.findOne({ alias }) - if(!aliasStatus){ - return res.status(200).json({success: true}); - }else{ - return res.status(400).json({success: false}) + if (!aliasStatus) { + return res.status(200).json({ success: true }) + } else { + return res.status(400).json({ success: false }) } - }catch (error){ - console.error(error) - } + } catch (error) { + console.error(error) + } } module.exports.addURL = async (req, res) => { const alias = nanoid(5) const minifiedUrl = base_url + alias - - try{ - const aliasPresent = await Minfy.findOne({ alias }); - if(aliasPresent){ - return res.status(400).json({success: false}); - } - }catch (error){ + + try { + const aliasPresent = await Minfy.findOne({ alias }) + if (aliasPresent) { + return res.status(400).json({ success: false }) + } + } catch (error) { console.error(error) - } - + } + Minfy.create({ originalUrl: req.body.originalUrl, alias: alias, @@ -87,7 +112,6 @@ module.exports.addURL = async (req, res) => { console.error(err) res.sendStatus(500) }) - } module.exports.deleteUrlData = async (req, res) => { @@ -116,15 +140,20 @@ module.exports.updateUrlData = async (req, res) => { } module.exports.addURLAuthed = async (req, res) => { - const { alias, originalUrl } = req.body - if(verifyAlias(alias)) - { - res.sendStatus(500); - throw new Error('This alias cannot be used, try some another.'); + var { alias, originalUrl } = req.body + if (alias === undefined) { + return res + .status(400) + .json({ success: false, message: 'Alias is required' }) + } else if (alias === 'auto') { + alias = nanoid(5) + } + if (verifyAlias(alias)) { + res.sendStatus(500) + throw new Error('This alias cannot be used, try some another.') } var createdBy = req.user.data.email - // console.log(req.user); const minifiedUrl = base_url + alias const data = { alias, @@ -132,7 +161,7 @@ module.exports.addURLAuthed = async (req, res) => { minifiedUrl, createdBy, } - + Minfy.create(data) .then((data) => { res.send(data) @@ -144,17 +173,151 @@ module.exports.addURLAuthed = async (req, res) => { } module.exports.visitor = async (req, res) => { - Minfy.findOneAndUpdate( - { alias: req.params.alias }, - { $inc: { views: 1 } }, - { new: true } - ) - .then((data) => { - res.send(`views increased`) + // console.log(req.ip) + const config = { + url: 'https://ip.zxq.co/' + req.ip, + method: 'GET', + } + axios(config) + .then((response) => { + switch(response.data.continent){ + case 'AS': + Minfy.findOneAndUpdate( + { alias: req.params.alias }, + { + $inc: { + views: 1, + 'viewedFrom.AS': 1, + }, + }, + { new: true } + ) + .then((data) => { + res.send(`views increased`) + }) + .catch((err) => { + console.error(err) + res.sendStatus(500) + }) + break; + case 'NA': + Minfy.findOneAndUpdate( + { alias: req.params.alias }, + { + $inc: { + views: 1, + 'viewedFrom.NA': 1, + }, + }, + { new: true } + ) + .then((data) => { + res.send(`views increased`) + }) + .catch((err) => { + console.error(err) + res.sendStatus(500) + }) + break; + case 'SA': + Minfy.findOneAndUpdate( + { alias: req.params.alias }, + { + $inc: { + views: 1, + 'viewedFrom.SA': 1, + }, + }, + { new: true } + ) + .then((data) => { + res.send(`views increased`) + }) + .catch((err) => { + console.error(err) + res.sendStatus(500) + }) + break; + case 'OC': + Minfy.findOneAndUpdate( + { alias: req.params.alias }, + { + $inc: { + views: 1, + 'viewedFrom.OC': 1, + }, + }, + { new: true } + ) + .then((data) => { + res.send(`views increased`) + }) + .catch((err) => { + console.error(err) + res.sendStatus(500) + }) + break; + case 'EU': + Minfy.findOneAndUpdate( + { alias: req.params.alias }, + { + $inc: { + views: 1, + 'viewedFrom.EU': 1, + }, + }, + { new: true } + ) + .then((data) => { + res.send(`views increased`) + }) + .catch((err) => { + console.error(err) + res.sendStatus(500) + }) + break; + case 'AF': + Minfy.findOneAndUpdate( + { alias: req.params.alias }, + { + $inc: { + views: 1, + 'viewedFrom.AF': 1, + }, + }, + { new: true } + ) + .then((data) => { + res.send(`views increased`) + }) + .catch((err) => { + console.error(err) + res.sendStatus(500) + }) + break; + default: + Minfy.findOneAndUpdate( + { alias: req.params.alias }, + { + $inc: { + views: 1, + 'viewedFrom.UKN': 1, + }, + }, + { new: true } + ) + .then((data) => { + console.log(data) + res.send(`views increased`) + }) + .catch((err) => { + console.error(err) + res.sendStatus(500) + }) + } }) .catch((err) => { - console.error(err) - res.sendStatus(500) + res.send(err) }) } diff --git a/backend/controllers/user.js b/backend/controllers/user.js index 97700ca..efb762b 100644 --- a/backend/controllers/user.js +++ b/backend/controllers/user.js @@ -1,5 +1,6 @@ -const jwt = require('jsonwebtoken') const User = require('../models/user') +const { customAlphabet } = require('nanoid') +const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz', 25) module.exports.register = async ({ body: { email, password } }, res) => { try { @@ -53,3 +54,19 @@ module.exports.me = async (req, res) => { return res.sendStatus(500) } } +module.exports.generateAPIKey = async (req, res) => { + try { + if (!req.user.isAuthenticated) { + res.sendStatus(401) + return + } + let user = req.user.data + let apiKey = nanoid() + user.apiKey = apiKey + await user.save() + res.json(user.apiKey) + } catch (e) { + console.log(e) + return res.sendStatus(500) + } +} diff --git a/backend/middlewares/auth.js b/backend/middlewares/auth.js index 71ce57f..c819fa8 100644 --- a/backend/middlewares/auth.js +++ b/backend/middlewares/auth.js @@ -23,3 +23,22 @@ module.exports.auth = async (req, res, next) => { req.user = user next() } + +module.exports.apiAuth = async (req, res, next) => { + let user = { isAuthenticated: false } + if (req.headers['x-api-key'] && req.headers['x-api-key'] !== null) { + try { + let apiKey = req.headers['x-api-key'] + let userData = await User.findOne({ + apiKey: apiKey, + }).catch((err) => console.error(err)) + user.isAuthenticated = userData ? true : false + user.data = userData + } catch (err) { + user.isAuthenticated = false + user.data = null + } + } + req.user = user + next() +} diff --git a/backend/models/minifed_urls.js b/backend/models/minifed_urls.js index 4d3181c..e3c41cc 100644 --- a/backend/models/minifed_urls.js +++ b/backend/models/minifed_urls.js @@ -24,6 +24,15 @@ const minifiedUrlSchema = new Schema( type: String, default: 'Anonymous', }, + viewedFrom: { + UKN: { type: Number, default: 0 }, + NA: { type: Number, default: 0 }, + SA: { type: Number, default: 0 }, + EU: { type: Number, default: 0 }, + AS: { type: Number, default: 0 }, + AF: { type: Number, default: 0 }, + OC: { type: Number, default: 0 }, + }, }, { timestamp: true } ) diff --git a/backend/models/user.js b/backend/models/user.js index f4fb174..26680d7 100644 --- a/backend/models/user.js +++ b/backend/models/user.js @@ -14,6 +14,14 @@ const UsersSchema = new Schema( type: String, // required: true, }, + profilepic: { + type: String, + // required: true, + }, + apiKey: { + type: String, + default: 'NaN', + }, hash: String, salt: String, }, diff --git a/backend/package.json b/backend/package.json index cf5bfa0..0f0460c 100644 --- a/backend/package.json +++ b/backend/package.json @@ -1,6 +1,6 @@ { "name": "url-minify-api", - "version": "1.1.0", + "version": "1.2.0", "description": "URL Minify Backend", "main": "index.js", "scripts": { @@ -37,7 +37,7 @@ "jsonwebtoken": "^8.5.1", "mongoose": "^6.1.8", "morgan": "^1.10.0", - "nanoid": "^3.2.0" + "nanoid": "^3.3.3" }, "devDependencies": { "nodemon": "^2.0.15", diff --git a/backend/routers/minify.js b/backend/routers/minify.js index 75121eb..a6f9c50 100644 --- a/backend/routers/minify.js +++ b/backend/routers/minify.js @@ -1,6 +1,6 @@ const { Router } = require('express') const controller = require('../controllers/minify') -const { auth } = require('../middlewares/auth') +const { auth, apiAuth } = require('../middlewares/auth') const router = Router() @@ -11,12 +11,13 @@ router.get('/alias/:alias/status', controller.getAliasStatus) router.post('/add', controller.addURL) router.post('/add/custom', auth, controller.addURLAuthed) + router.get('/all/user', auth, controller.getAllurlsforUser) router.patch('/edit/:id', auth, controller.updateUrlData) - router.delete('/delete/:id', auth, controller.deleteUrlData) - router.get('/:alias/views', controller.visitor) +router.post('/api/addCustom', apiAuth, controller.addURLAuthed) + module.exports = router diff --git a/backend/routers/user.js b/backend/routers/user.js index 4fb844a..a3f00e9 100644 --- a/backend/routers/user.js +++ b/backend/routers/user.js @@ -1,11 +1,13 @@ const { Router } = require('express') const controller = require('../controllers/user') -const { auth } = require('../middlewares/auth') +const { auth, apiAuth } = require('../middlewares/auth') const router = Router() router.post('/login', controller.login) router.post('/register', controller.register) router.get('/me', auth, controller.me) +router.post('/generate-api-key', auth, controller.generateAPIKey) +router.get('/api/me', apiAuth, controller.me) module.exports = router