18 Commits
0.4.0 ... 0.5.1

Author SHA1 Message Date
b871e4295d 🚀RELEASE 0.5.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 10:03:16 +02:00
0945060a49 Added optional filtering by provider 2021-08-21 10:02:52 +02:00
f7eae96b8c Shortened return to avoid variable memory asignment 2021-08-21 10:01:24 +02:00
c2a50a1480 Changed object property order (just for us pesky humans to improve readability) 2021-08-21 09:59:57 +02:00
bb99c2dcd1 Added endpoint to query over all visited urls 2021-08-21 09:59:14 +02:00
e8382fb579 🚀RELEASE 0.5.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 09:56:21 +02:00
b5321377bd Reverted last change since we can defer it from the provider 2021-08-21 09:54:55 +02:00
6e26bbbf5f Changed the way visits entrys get compiled to enable provider visits count searches over the default api 2021-08-21 09:53:17 +02:00
59e178476e Removed visits 404 resolution 2021-08-21 09:51:25 +02:00
824c109a42 Server now inserts provider on visit 2021-08-21 09:49:45 +02:00
f48159b31b Added migration for visits provider 2021-08-21 09:46:28 +02:00
6195001d4b Added package script for migration creation 2021-08-21 09:45:57 +02:00
0afa80345d 🚀RELEASE 0.4.3
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 07:35:41 +02:00
dbb0d177b8 Fixed auth error crashing the entire server thanks to fastify handling stuff not the same way that they do in the docs.....
closes #1
2021-08-21 07:35:13 +02:00
4ffc06db7b 🚀RELEASE 0.4.2
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-18 17:47:16 +02:00
588f3bae89 Changed register api route and added user deletion route 2021-08-18 17:46:49 +02:00
d889432ce8 🚀RELEASE 0.4.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-18 17:39:01 +02:00
44830f08bc Fixed jwtcount not being recognized 2021-08-18 17:38:47 +02:00
4 changed files with 103 additions and 28 deletions

View File

@@ -2,12 +2,55 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC. All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [0.5.1](https://git.odit.services/kauft.es/linkylinky/compare/0.5.0...0.5.1)
- Added endpoint to query over all visited urls [`bb99c2d`](https://git.odit.services/kauft.es/linkylinky/commit/bb99c2dcd1ce89af1bc27a035be5265345d2a05f)
- Added optional filtering by provider [`0945060`](https://git.odit.services/kauft.es/linkylinky/commit/0945060a49ed35c038df2c04bbd07174bc5654ca)
- Shortened return to avoid variable memory asignment [`f7eae96`](https://git.odit.services/kauft.es/linkylinky/commit/f7eae96b8c3479d333fc00bc36bce451733700db)
- Changed object property order (just for us pesky humans to improve readability) [`c2a50a1`](https://git.odit.services/kauft.es/linkylinky/commit/c2a50a14807e223987464c63fac6d67ed98b1a93)
#### [0.5.0](https://git.odit.services/kauft.es/linkylinky/compare/0.4.3...0.5.0)
> 21 August 2021
- 🚀RELEASE 0.5.0 [`e8382fb`](https://git.odit.services/kauft.es/linkylinky/commit/e8382fb579f769364693974cbe74ce06e9810a9a)
- Removed visits 404 resolution [`59e1784`](https://git.odit.services/kauft.es/linkylinky/commit/59e178476e8f7e64de92ae23e859b87680e7af64)
- Added migration for visits provider [`f48159b`](https://git.odit.services/kauft.es/linkylinky/commit/f48159b31bcaf7c7449c89fb1e3851bcb04f5e3c)
- Reverted last change since we can defer it from the provider [`b532137`](https://git.odit.services/kauft.es/linkylinky/commit/b5321377bde9bd7de13e2eee4dd38a072cf0d4a3)
- Changed the way visits entrys get compiled to enable provider visits count searches over the default api [`6e26bbb`](https://git.odit.services/kauft.es/linkylinky/commit/6e26bbbf5f29e4c1eaa56c5dc41ab77c192d0cfb)
- Server now inserts provider on visit [`824c109`](https://git.odit.services/kauft.es/linkylinky/commit/824c109a420efd0e1e6de01d93827020f3fe5a5f)
- Added package script for migration creation [`6195001`](https://git.odit.services/kauft.es/linkylinky/commit/6195001d4b701d39470ff4be0e265f9afb288e78)
#### [0.4.3](https://git.odit.services/kauft.es/linkylinky/compare/0.4.2...0.4.3)
> 21 August 2021
- Fixed auth error crashing the entire server thanks to fastify handling stuff not the same way that they do in the docs..... [`#1`](https://git.odit.services/kauft.es/linkylinky/issues/1)
- 🚀RELEASE 0.4.3 [`0afa803`](https://git.odit.services/kauft.es/linkylinky/commit/0afa80345d47e09e20d4365634f8532248b2044c)
#### [0.4.2](https://git.odit.services/kauft.es/linkylinky/compare/0.4.1...0.4.2)
> 18 August 2021
- Changed register api route and added user deletion route [`588f3ba`](https://git.odit.services/kauft.es/linkylinky/commit/588f3bae8980f76461d20e15475ec797078b0b54)
- 🚀RELEASE 0.4.2 [`4ffc06d`](https://git.odit.services/kauft.es/linkylinky/commit/4ffc06db7bb84bc7bfc9c57a80927f7201185274)
#### [0.4.1](https://git.odit.services/kauft.es/linkylinky/compare/0.4.0...0.4.1)
> 18 August 2021
- 🚀RELEASE 0.4.1 [`d889432`](https://git.odit.services/kauft.es/linkylinky/commit/d889432ce8a403f6a609423eaf458a5904dc5b98)
- Fixed jwtcount not being recognized [`44830f0`](https://git.odit.services/kauft.es/linkylinky/commit/44830f08bc212f8079b5ac2da3d51eedbe6d5c41)
#### [0.4.0](https://git.odit.services/kauft.es/linkylinky/compare/0.3.0...0.4.0) #### [0.4.0](https://git.odit.services/kauft.es/linkylinky/compare/0.3.0...0.4.0)
> 18 August 2021
- Basic jwt implementation :party: [`75473ca`](https://git.odit.services/kauft.es/linkylinky/commit/75473cabe79975296e473002e16d3abafbd2635e) - Basic jwt implementation :party: [`75473ca`](https://git.odit.services/kauft.es/linkylinky/commit/75473cabe79975296e473002e16d3abafbd2635e)
- Implemented jwtcount basics [`48cc380`](https://git.odit.services/kauft.es/linkylinky/commit/48cc380504206ea08b3a5082f19ad10bdd7cf773) - Implemented jwtcount basics [`48cc380`](https://git.odit.services/kauft.es/linkylinky/commit/48cc380504206ea08b3a5082f19ad10bdd7cf773)
- Implemented jwt count validation and update on logout [`558b69e`](https://git.odit.services/kauft.es/linkylinky/commit/558b69eeaa78ea015473c674d5f919d64128a930) - Implemented jwt count validation and update on logout [`558b69e`](https://git.odit.services/kauft.es/linkylinky/commit/558b69eeaa78ea015473c674d5f919d64128a930)
- Switched to fastify-auth to support multiple auth providers [`6420ffb`](https://git.odit.services/kauft.es/linkylinky/commit/6420ffb055f08348c54cd08a193aba5fe5ebc13a) - Switched to fastify-auth to support multiple auth providers [`6420ffb`](https://git.odit.services/kauft.es/linkylinky/commit/6420ffb055f08348c54cd08a193aba5fe5ebc13a)
- 🚀RELEASE 0.4.0 [`1cd3ebf`](https://git.odit.services/kauft.es/linkylinky/commit/1cd3ebf8c5a9413b93ab49c8813dad5c5c547cb2)
- All authenticated entpoints now accept jwtauth [`2b22063`](https://git.odit.services/kauft.es/linkylinky/commit/2b22063a81193c3d698525a050ef300e542c1f05) - All authenticated entpoints now accept jwtauth [`2b22063`](https://git.odit.services/kauft.es/linkylinky/commit/2b22063a81193c3d698525a050ef300e542c1f05)
#### [0.3.0](https://git.odit.services/kauft.es/linkylinky/compare/0.2.0...0.3.0) #### [0.3.0](https://git.odit.services/kauft.es/linkylinky/compare/0.2.0...0.3.0)

View File

@@ -0,0 +1,10 @@
exports.up = function(knex) {
return knex.schema.table('visits', function (table) {
table.text('provider').defaultTo("N/A");
});
};
exports.down = function(knex) {
};

View File

@@ -1,6 +1,6 @@
{ {
"name": "@odit/shortener-backend", "name": "@odit/shortener-backend",
"version": "0.4.0", "version": "0.5.1",
"main": "index.js", "main": "index.js",
"license": "MIT", "license": "MIT",
"private": false, "private": false,
@@ -20,7 +20,8 @@
"dev": "nodemon src/server.js", "dev": "nodemon src/server.js",
"start": "node src/server.js", "start": "node src/server.js",
"migrate": "knex migrate:latest", "migrate": "knex migrate:latest",
"release": "release-it" "release": "release-it",
"create:migration": "knex migrate:make"
}, },
"dependencies": { "dependencies": {
"argon2": "^0.28.2", "argon2": "^0.28.2",

View File

@@ -45,44 +45,54 @@ fastify.decorate('verifyJWT', function async(request, reply, done) {
fastify.jwt.verify(token, async (err, decoded) => { fastify.jwt.verify(token, async (err, decoded) => {
if (err) { if (err) {
fastify.log.error(err) fastify.log.error("JWT validation failed:")
done(new Error("JWT Validation failed")) done(new Error("JWT Validation failed"));
}
else {
if (!decoded.payload) {
done(new Error("JWT is empty"));
} }
fastify.log.info(`Token verified. User is ${decoded.payload.user}`); fastify.log.info(`Token verified. User is ${decoded.payload.user}`);
request.user = decoded.payload.user;
const jwtcount = (await knex.select('jwtcount') const jwtcount = (await knex.select('jwtcount')
.from('users') .from('users')
.where('username', '=', decoded.payload.user) .where('username', '=', decoded.payload.user)
.limit(1))[0].jwtcount; .limit(1))[0].jwtcount;
if (decoded.payload.jwtcount < jwtcount || !decoded.payload.jwtcount) { if (decoded.payload.jwtcount < jwtcount) {
fastify.log.error("Auth ended at jwtcount") fastify.log.error("Auth ended at jwtcount")
done(new Error("JWT in no longer valid")) done(new Error("JWT in no longer valid"))
} }
else {
fastify.log.info(`JWT count verified`); fastify.log.info(`JWT count verified`);
request.user = decoded.payload.user;
done() done()
}
}
}) })
}) })
//Automagic Amazn redirects on /a/ //Automagic Amazn redirects on /a/
fastify.get('/a/:id', async (req, res) => { fastify.get('/a/:id', async (req, res) => {
res.redirect(302, `https://amazon.de/dp/${req.params.id}`) res.redirect(302, `https://amazon.de/dp/${req.params.id}`)
await knex('visits').insert({ shortcode: req.params.id, provider: 'a' });
}) })
//Automagic Youtube redirects on /yt/ //Automagic Youtube redirects on /yt/
fastify.get('/yt/:id', async (req, res) => { fastify.get('/yt/:id', async (req, res) => {
res.redirect(302, `https://youtu.be/${req.params.id}`) res.redirect(302, `https://youtu.be/${req.params.id}`)
await knex('visits').insert({ shortcode: req.params.id, provider: 'yt' });
}) })
//Automagic Youtube Playlist redirects on /ytpl/ //Automagic Youtube Playlist redirects on /ytpl/
fastify.get('/ytpl/:id', async (req, res) => { fastify.get('/ytpl/:id', async (req, res) => {
res.redirect(302, `https://youtube.com/playlist?list=${req.params.id}`) res.redirect(302, `https://youtube.com/playlist?list=${req.params.id}`)
await knex('visits').insert({ shortcode: req.params.id, provider: 'ytpl' });
}) })
//Automagic ebay item redirects on /e/ //Automagic ebay item redirects on /e/
fastify.get('/e/:id', async (req, res) => { fastify.get('/e/:id', async (req, res) => {
res.redirect(302, `https://ebay.de/itm/${req.params.id}`) res.redirect(302, `https://ebay.de/itm/${req.params.id}`)
await knex('visits').insert({ shortcode: req.params.id, provider: 'e' });
}) })
//Normal shorturls //Normal shorturls
@@ -101,7 +111,7 @@ fastify.get('/:shortcode', async (req, res) => {
return 404 return 404
} }
res.redirect(302, target[0].target); res.redirect(302, target[0].target);
await knex('visits').insert({ shortcode }); await knex('visits').insert({ shortcode, provider: 'native' });
}) })
//Create new url schema //Create new url schema
@@ -223,7 +233,7 @@ fastify.get('/api/:shortcode', async (req, res) => {
//User registration //User registration
fastify.post('/api/register', async (req, res) => { fastify.post('/api/auth/register', async (req, res) => {
if (!config.registrationEnabled) { if (!config.registrationEnabled) {
res.statusCode = 400; res.statusCode = 400;
return "Registration was disabled by your admin"; return "Registration was disabled by your admin";
@@ -257,7 +267,7 @@ fastify.post('/api/register', async (req, res) => {
//Anything in here has some kind of auth //Anything in here has some kind of auth
fastify.after(() => { fastify.after(() => {
//Get url api route //Get url visits api route
fastify.get('/api/:shortcode/visits', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, res) => { fastify.get('/api/:shortcode/visits', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, res) => {
const shortcode = req.params.shortcode; const shortcode = req.params.shortcode;
@@ -266,21 +276,24 @@ fastify.after(() => {
return 404; return 404;
} }
const exists = await knex.select('shortcode', 'target') const visits = await knex.select('timestamp', 'provider')
.from('urls')
.where('shortcode', '=', shortcode)
.limit(1);
if (exists.length == 0) {
return 404;
}
const visits = await knex.select('timestamp')
.from('visits') .from('visits')
.where('shortcode', '=', shortcode); .where('shortcode', '=', shortcode);
return visits; return visits;
}); });
//Get all visits api route
fastify.get('/api/visits', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, res) => {
if(req.query.provider){
return await knex.select('shortcode', 'provider', 'timestamp')
.from('visits')
.where("provider", "=", req.query.provider);
}
return await knex.select('shortcode', 'provider', 'timestamp')
.from('visits');
});
//Get url api route //Get url api route
fastify.delete('/api/:shortcode', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, res) => { fastify.delete('/api/:shortcode', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, res) => {
const shortcode = req.params.shortcode; const shortcode = req.params.shortcode;
@@ -347,6 +360,14 @@ fastify.after(() => {
return "Done!"; return "Done!";
}); });
fastify.post('/api/auth/deleteme', { onRequest: fastify.auth([fastify.basicAuth, fastify.verifyJWT]) }, async (req, reply) => {
await knex('users')
.where('username', '=', req.user)
.delete();
return "Done!";
});
}); });