/
server.js
73 lines (61 loc) · 2.8 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
const express = require('express');
const mongo = require('mongodb').MongoClient;
const bodyParser = require('body-parser');
const shortid = require('shortid');
shortid.characters('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$&');
const app = express();
function checkURL(url) {
const regForUrl = /^(?:(?:https?|ftp):\/\/)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/\S*)?$/;
return (regForUrl.test(url));
}
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/', (request, response) => {
response.sendFile(`${__dirname}/views/index.html`);
});
app.get('/short/:url(*)', (request, response) => {
mongo.connect(process.env.CONNECT_STRING, (error, client) => {
if (error) throw error;
const urlsDB = client.db('freecodecamp-services').collection('urls');
console.log('Database connected'); //eslint-disable-line
const { url } = request.params;
urlsDB.findOne({ url }, { short: 1, _id: 0 }, (err, doc) => {
if (doc != null) {
// console.log('Found one');
return response.json({ original_url: url, short_url: process.env.HOST + doc.short });
}
if (checkURL(url)) {
const short = shortid.generate();
const newDocument = { url, short };
urlsDB.insert([newDocument], (errorInsert) => {
if (errorInsert) {
throw new Error(`Insertion error: ${errorInsert}`); //eslint-disable-line
}
client.close();
});
return response.json({ original_url: url, short_url: process.env.HOST + short });
}
return response.json({ error: 'Invalid Url' });
});
});
});
app.get('/:short', (request, response) => {
mongo.connect(process.env.CONNECT_STRING, (error, client) => {
if (error) throw error;
const urlsDB = client.db('freecodecamp-services').collection('urls');
console.log('Database connected'); //eslint-disable-line
const { short } = request.params;
urlsDB.findOne({ short }, { url: 1, _id: 0 }, (err, doc) => {
if (doc != null) {
return response.redirect(doc.url);
}
return response.json({ error: 'Short link not found' });
});
client.close();
});
});
// Respond not found to all the wrong routes
app.use((req, res) => res.status(404).type('txt').send('Not found'));
// Error Middleware
app.use((err, req, res) => err && res.status(err.status || 500).type('txt').send(err.message || 'SERVER ERROR'));
app.listen(process.env.PORT || 3000);