2019-08-14 05:54:13 -04:00
|
|
|
import express from 'express';
|
2019-08-14 09:05:49 -04:00
|
|
|
import bodyParser from 'body-parser';
|
2019-08-14 05:54:13 -04:00
|
|
|
|
2019-08-19 09:31:35 -04:00
|
|
|
import { authUser, getNewUserAPIKey, logout } from './services/user';
|
2019-08-14 05:54:13 -04:00
|
|
|
import { queryLocation } from './services/search';
|
|
|
|
|
2019-08-14 09:05:49 -04:00
|
|
|
import buildingsRouter from './routes/buildingsRouter';
|
2019-08-19 09:31:35 -04:00
|
|
|
import usersRouter from './routes/usersRouter';
|
2019-08-14 05:54:13 -04:00
|
|
|
|
|
|
|
|
2019-08-19 09:31:35 -04:00
|
|
|
const server = express.Router();
|
2019-08-14 05:54:13 -04:00
|
|
|
|
2019-08-14 09:05:49 -04:00
|
|
|
// parse POSTed json body
|
|
|
|
server.use(bodyParser.json());
|
2019-08-14 05:54:13 -04:00
|
|
|
|
2019-08-14 09:05:49 -04:00
|
|
|
server.use('/buildings', buildingsRouter);
|
2019-08-19 09:31:35 -04:00
|
|
|
server.use('/users', usersRouter);
|
2019-08-15 11:12:01 -04:00
|
|
|
|
2019-08-14 05:54:13 -04:00
|
|
|
// POST user auth
|
|
|
|
server.post('/login', function (req, res) {
|
|
|
|
authUser(req.body.username, req.body.password).then(function (user: any) { // TODO: remove any
|
|
|
|
if (user.user_id) {
|
|
|
|
req.session.user_id = user.user_id;
|
|
|
|
} else {
|
|
|
|
req.session.user_id = undefined;
|
|
|
|
}
|
|
|
|
res.send(user);
|
|
|
|
}).catch(function (error) {
|
|
|
|
res.send(error);
|
|
|
|
})
|
|
|
|
});
|
|
|
|
|
|
|
|
// POST user logout
|
|
|
|
server.post('/logout', function (req, res) {
|
2019-08-15 11:12:01 -04:00
|
|
|
logout(req.session).then(() => {
|
2019-08-14 05:54:13 -04:00
|
|
|
res.send({ success: true });
|
2019-08-15 11:12:01 -04:00
|
|
|
}).catch(err => {
|
|
|
|
console.error(err);
|
|
|
|
res.send({ error: 'Failed to end session'});
|
2019-08-14 05:54:13 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// POST generate API key
|
|
|
|
server.post('/api/key', function (req, res) {
|
|
|
|
if (!req.session.user_id) {
|
|
|
|
res.send({ error: 'Must be logged in' });
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
getNewUserAPIKey(req.session.user_id).then(function (apiKey) {
|
|
|
|
res.send(apiKey);
|
|
|
|
}).catch(function (error) {
|
|
|
|
res.send(error);
|
|
|
|
});
|
|
|
|
})
|
|
|
|
|
|
|
|
// GET search
|
|
|
|
server.get('/search', function (req, res) {
|
|
|
|
const searchTerm = req.query.q;
|
|
|
|
if (!searchTerm) {
|
|
|
|
res.send({
|
|
|
|
error: 'Please provide a search term'
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
queryLocation(searchTerm).then((results) => {
|
|
|
|
if (typeof (results) === 'undefined') {
|
|
|
|
res.send({
|
|
|
|
error: 'Database error'
|
|
|
|
})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
res.send({
|
|
|
|
results: results.map(item => {
|
|
|
|
// map from DB results to GeoJSON Feature objects
|
|
|
|
const geom = JSON.parse(item.st_asgeojson)
|
|
|
|
return {
|
|
|
|
type: 'Feature',
|
|
|
|
attributes: {
|
|
|
|
label: item.search_str,
|
|
|
|
zoom: item.zoom || 9
|
|
|
|
},
|
|
|
|
geometry: geom
|
|
|
|
}
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}).catch(function (error) {
|
|
|
|
res.send(error);
|
|
|
|
});
|
|
|
|
})
|
|
|
|
|
2019-08-14 09:13:14 -04:00
|
|
|
server.use((req, res) => {
|
|
|
|
res.status(404).json({ error: 'Resource not found'});
|
|
|
|
})
|
|
|
|
|
2019-08-16 05:57:15 -04:00
|
|
|
export default server;
|