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>
This commit is contained in:
Jyotirmoy Bandyopadhayaya 2022-04-23 00:30:35 +05:30 committed by GitHub
parent 84c3e1a9cc
commit a33fa6e83c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 273 additions and 47 deletions

View File

@ -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,
})
}

View File

@ -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)
})
}

View File

@ -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)
}
}

View File

@ -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()
}

View File

@ -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 }
)

View File

@ -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,
},

View File

@ -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",

View File

@ -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

View File

@ -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