-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
155 lines (132 loc) · 4.83 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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
// server.js
// where your node app starts
// init project
var express = require('express');
var app = express();
var dns = require('dns');
var bodyParser = require('body-parser');
var upload = require('multer')({ dest: 'uploads/'});
var shortid = require('shortid');
var urltools = require('url');
require('dotenv').config();
require('./database/connect');
const ObjectID = require('mongodb').ObjectID;
const Url = require('./database/Url');
const User = require('./database/User');
// enable CORS (https://en.wikipedia.org/wiki/Cross-origin_resource_sharing)
// so that your API is remotely testable by FCC
var cors = require('cors');
app.use(cors({ optionSuccessStatus: 200 })); // some legacy browsers choke on 204
// http://expressjs.com/en/starter/static-files.html
app.use(express.static('public'));
app.use(bodyParser.urlencoded({ extended: false }));
const router = express.Router();
// http://expressjs.com/en/starter/basic-routing.html
app.get("/", function (req, res) {
res.sendFile(__dirname + '/views/index.html');
});
// Timestamps
router.get("/timestamp/:date_string?", function (req, res) {
const dateString = req.params.date_string;
const unix = Date.parse(dateString || new Date())
const date = new Date(unix || Number(dateString));
console.log(date);
const response = unix || date.getTime() ? { utc: date.toUTCString(), unix: date.getTime() } : { error: 'Invalid Date' };
res.json(response);
});
// Request header parser
router.get("/whoami", function (req, res) {
const ipaddress = req.ip;
const language = req.headers["accept-language"];
const software = req.headers["user-agent"];
res.json({ ipaddress, language, software });
});
// URL shortener
router.post("/shorturl/new", function (req, res) {
const hostname = urltools.parse(req.body.url).hostname;
if (!hostname) res.json({ error: 'invalid URL'});
else {
dns.lookup(hostname, (error) => {
if (error) res.json({ error: 'invalid URL' });
else {
const url = req.body.url;
const hash = shortid.generate();
Url.create({ url, hash }, (err, data) => {
if (err) res.json({ err });
else res.json({ original_url: data.url, short_url: data.hash });
});
}
});
}
});
router.get("/shorturl/:hash", function (req, res) {
Url.findOne({ hash: req.params.hash }, (err, data) => {
res.redirect(data.url);
});
});
router.post('/exercise/new-user', async (req, res) => {
const user = await User.create({ username: req.body.username });
res.json({ username: user.username, _id: user._id });
});
router.get('/exercise/users', async (req, res) => {
const users = await User.find().select('_id username');
res.json(users)
});
router.post('/exercise/add', async (req, res) => {
const { userId, description, duration, date } = req.body;
const exercise = { description, duration: Number(duration), date: date ? new Date(date) : new Date() }
const user = await User.findByIdAndUpdate(userId, { $push: { exercises: exercise} });
const { _id, username } = user;
res.json({ _id, username, ...exercise, date: exercise.date.toDateString() });
});
router.get('/exercise/log', async (req, res) => {
const { from, to } = req.query;
const filters = [];
if (from) filters.push({ $gte: ['$$this.date', new Date(req.query.from)] })
if (to) filters.push({ $lte: ['$$this.date', new Date(req.query.to)]});
const user = (await User.aggregate([
{ $match: { _id: ObjectID(req.query.userId) } },
{ $project: { exercises: {
$slice: [{
$filter: {
input: "$exercises",
cond: { $and: filters }
}}, Number(req.query.limit) || { $size: "$exercises"} ],
}}},
]))[0];
console.log(user);
const { _id, username, exercises } = user;
const count = exercises.length;
const log = exercises.map(({ description, duration, date }) => ({ description, duration, date: date.toDateString() }));
res.json({ _id, username, count, log });
});
router.post('/fileanalyse', upload.single('upfile'), (req, res) => {
const { originalname: name, mimetype: type, size } = req.file;
res.json({ name, type, size });
});
// Not found middleware
router.use((req, res, next) => {
return next({ status: 404, message: 'not found!' })
})
// Error Handling middleware
router.use((err, req, res, next) => {
let errCode, errMessage
if (err.errors) {
// mongoose validation error
errCode = 400 // bad request
const keys = Object.keys(err.errors)
// report the first validation error
errMessage = err.errors[keys[0]].message
} else {
// generic or custom error
errCode = err.status || 500
errMessage = err.message || 'Internal Server Error'
}
res.status(errCode).type('txt')
.send(errMessage)
})
app.use('/api', router);
// listen for requests :)
var listener = app.listen(process.env.PORT, function () {
console.log('Your app is listening on port ' + listener.address().port);
});