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:
parent
84c3e1a9cc
commit
a33fa6e83c
|
@ -1,3 +1,10 @@
|
||||||
|
const package = require('../package.json')
|
||||||
|
|
||||||
module.exports.home = function (req, res) {
|
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,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,37 @@
|
||||||
const Minfy = require('../models/minifed_urls')
|
const Minfy = require('../models/minifed_urls')
|
||||||
const base_url = 'https://minfy.xyz/'
|
const base_url = 'https://minfy.xyz/'
|
||||||
const { nanoid } = require('nanoid')
|
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) {
|
function verifyAlias(alias) {
|
||||||
const boolean = blackListedAliases.find(element => element===alias);
|
const boolean = blackListedAliases.find((element) => element === alias)
|
||||||
return boolean;
|
return boolean
|
||||||
}
|
}
|
||||||
module.exports.getAllData = async (req, res) => {
|
module.exports.getAllData = async (req, res) => {
|
||||||
Minfy.find({})
|
Minfy.find({})
|
||||||
|
@ -48,33 +73,33 @@ module.exports.findUrlById = async (req, res) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.getAliasStatus = async (req, res) => {
|
module.exports.getAliasStatus = async (req, res) => {
|
||||||
try{
|
try {
|
||||||
const alias = req.params.alias;
|
const alias = req.params.alias
|
||||||
const aliasStatus = await Minfy.findOne({ alias });
|
const aliasStatus = await Minfy.findOne({ alias })
|
||||||
|
|
||||||
if(!aliasStatus){
|
if (!aliasStatus) {
|
||||||
return res.status(200).json({success: true});
|
return res.status(200).json({ success: true })
|
||||||
}else{
|
} else {
|
||||||
return res.status(400).json({success: false})
|
return res.status(400).json({ success: false })
|
||||||
}
|
}
|
||||||
}catch (error){
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.addURL = async (req, res) => {
|
module.exports.addURL = async (req, res) => {
|
||||||
const alias = nanoid(5)
|
const alias = nanoid(5)
|
||||||
const minifiedUrl = base_url + alias
|
const minifiedUrl = base_url + alias
|
||||||
|
|
||||||
try{
|
try {
|
||||||
const aliasPresent = await Minfy.findOne({ alias });
|
const aliasPresent = await Minfy.findOne({ alias })
|
||||||
if(aliasPresent){
|
if (aliasPresent) {
|
||||||
return res.status(400).json({success: false});
|
return res.status(400).json({ success: false })
|
||||||
}
|
}
|
||||||
}catch (error){
|
} catch (error) {
|
||||||
console.error(error)
|
console.error(error)
|
||||||
}
|
}
|
||||||
|
|
||||||
Minfy.create({
|
Minfy.create({
|
||||||
originalUrl: req.body.originalUrl,
|
originalUrl: req.body.originalUrl,
|
||||||
alias: alias,
|
alias: alias,
|
||||||
|
@ -87,7 +112,6 @@ module.exports.addURL = async (req, res) => {
|
||||||
console.error(err)
|
console.error(err)
|
||||||
res.sendStatus(500)
|
res.sendStatus(500)
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.deleteUrlData = async (req, res) => {
|
module.exports.deleteUrlData = async (req, res) => {
|
||||||
|
@ -116,15 +140,20 @@ module.exports.updateUrlData = async (req, res) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.addURLAuthed = async (req, res) => {
|
module.exports.addURLAuthed = async (req, res) => {
|
||||||
const { alias, originalUrl } = req.body
|
var { alias, originalUrl } = req.body
|
||||||
if(verifyAlias(alias))
|
if (alias === undefined) {
|
||||||
{
|
return res
|
||||||
res.sendStatus(500);
|
.status(400)
|
||||||
throw new Error('This alias cannot be used, try some another.');
|
.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
|
var createdBy = req.user.data.email
|
||||||
// console.log(req.user);
|
|
||||||
const minifiedUrl = base_url + alias
|
const minifiedUrl = base_url + alias
|
||||||
const data = {
|
const data = {
|
||||||
alias,
|
alias,
|
||||||
|
@ -132,7 +161,7 @@ module.exports.addURLAuthed = async (req, res) => {
|
||||||
minifiedUrl,
|
minifiedUrl,
|
||||||
createdBy,
|
createdBy,
|
||||||
}
|
}
|
||||||
|
|
||||||
Minfy.create(data)
|
Minfy.create(data)
|
||||||
.then((data) => {
|
.then((data) => {
|
||||||
res.send(data)
|
res.send(data)
|
||||||
|
@ -144,17 +173,151 @@ module.exports.addURLAuthed = async (req, res) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports.visitor = async (req, res) => {
|
module.exports.visitor = async (req, res) => {
|
||||||
Minfy.findOneAndUpdate(
|
// console.log(req.ip)
|
||||||
{ alias: req.params.alias },
|
const config = {
|
||||||
{ $inc: { views: 1 } },
|
url: 'https://ip.zxq.co/' + req.ip,
|
||||||
{ new: true }
|
method: 'GET',
|
||||||
)
|
}
|
||||||
.then((data) => {
|
axios(config)
|
||||||
res.send(`views increased`)
|
.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) => {
|
.catch((err) => {
|
||||||
console.error(err)
|
res.send(err)
|
||||||
res.sendStatus(500)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
const jwt = require('jsonwebtoken')
|
|
||||||
const User = require('../models/user')
|
const User = require('../models/user')
|
||||||
|
const { customAlphabet } = require('nanoid')
|
||||||
|
const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyz', 25)
|
||||||
|
|
||||||
module.exports.register = async ({ body: { email, password } }, res) => {
|
module.exports.register = async ({ body: { email, password } }, res) => {
|
||||||
try {
|
try {
|
||||||
|
@ -53,3 +54,19 @@ module.exports.me = async (req, res) => {
|
||||||
return res.sendStatus(500)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -23,3 +23,22 @@ module.exports.auth = async (req, res, next) => {
|
||||||
req.user = user
|
req.user = user
|
||||||
next()
|
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()
|
||||||
|
}
|
||||||
|
|
|
@ -24,6 +24,15 @@ const minifiedUrlSchema = new Schema(
|
||||||
type: String,
|
type: String,
|
||||||
default: 'Anonymous',
|
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 }
|
{ timestamp: true }
|
||||||
)
|
)
|
||||||
|
|
|
@ -14,6 +14,14 @@ const UsersSchema = new Schema(
|
||||||
type: String,
|
type: String,
|
||||||
// required: true,
|
// required: true,
|
||||||
},
|
},
|
||||||
|
profilepic: {
|
||||||
|
type: String,
|
||||||
|
// required: true,
|
||||||
|
},
|
||||||
|
apiKey: {
|
||||||
|
type: String,
|
||||||
|
default: 'NaN',
|
||||||
|
},
|
||||||
hash: String,
|
hash: String,
|
||||||
salt: String,
|
salt: String,
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "url-minify-api",
|
"name": "url-minify-api",
|
||||||
"version": "1.1.0",
|
"version": "1.2.0",
|
||||||
"description": "URL Minify Backend",
|
"description": "URL Minify Backend",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
|
@ -37,7 +37,7 @@
|
||||||
"jsonwebtoken": "^8.5.1",
|
"jsonwebtoken": "^8.5.1",
|
||||||
"mongoose": "^6.1.8",
|
"mongoose": "^6.1.8",
|
||||||
"morgan": "^1.10.0",
|
"morgan": "^1.10.0",
|
||||||
"nanoid": "^3.2.0"
|
"nanoid": "^3.3.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^2.0.15",
|
"nodemon": "^2.0.15",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
const { Router } = require('express')
|
const { Router } = require('express')
|
||||||
const controller = require('../controllers/minify')
|
const controller = require('../controllers/minify')
|
||||||
const { auth } = require('../middlewares/auth')
|
const { auth, apiAuth } = require('../middlewares/auth')
|
||||||
|
|
||||||
const router = Router()
|
const router = Router()
|
||||||
|
|
||||||
|
@ -11,12 +11,13 @@ router.get('/alias/:alias/status', controller.getAliasStatus)
|
||||||
|
|
||||||
router.post('/add', controller.addURL)
|
router.post('/add', controller.addURL)
|
||||||
router.post('/add/custom', auth, controller.addURLAuthed)
|
router.post('/add/custom', auth, controller.addURLAuthed)
|
||||||
|
|
||||||
router.get('/all/user', auth, controller.getAllurlsforUser)
|
router.get('/all/user', auth, controller.getAllurlsforUser)
|
||||||
|
|
||||||
router.patch('/edit/:id', auth, controller.updateUrlData)
|
router.patch('/edit/:id', auth, controller.updateUrlData)
|
||||||
|
|
||||||
router.delete('/delete/:id', auth, controller.deleteUrlData)
|
router.delete('/delete/:id', auth, controller.deleteUrlData)
|
||||||
|
|
||||||
router.get('/:alias/views', controller.visitor)
|
router.get('/:alias/views', controller.visitor)
|
||||||
|
|
||||||
|
router.post('/api/addCustom', apiAuth, controller.addURLAuthed)
|
||||||
|
|
||||||
module.exports = router
|
module.exports = router
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
const { Router } = require('express')
|
const { Router } = require('express')
|
||||||
const controller = require('../controllers/user')
|
const controller = require('../controllers/user')
|
||||||
const { auth } = require('../middlewares/auth')
|
const { auth, apiAuth } = require('../middlewares/auth')
|
||||||
|
|
||||||
const router = Router()
|
const router = Router()
|
||||||
|
|
||||||
router.post('/login', controller.login)
|
router.post('/login', controller.login)
|
||||||
router.post('/register', controller.register)
|
router.post('/register', controller.register)
|
||||||
router.get('/me', auth, controller.me)
|
router.get('/me', auth, controller.me)
|
||||||
|
router.post('/generate-api-key', auth, controller.generateAPIKey)
|
||||||
|
router.get('/api/me', apiAuth, controller.me)
|
||||||
|
|
||||||
module.exports = router
|
module.exports = router
|
||||||
|
|
Loading…
Reference in New Issue