orchidmap-front/backend/routes/route/list.js
2018-12-13 14:05:30 +07:00

71 lines
1.6 KiB
JavaScript

const { Route, User } = require('../../models');
module.exports = async (req, res) => {
const {
query: {
id, token, title, distance, author, starred,
}
} = req;
const user = await User.findOne({ _id: id, token });
let criteria = {};
if (title) {
criteria = {
...criteria,
$or: [
{ title: new RegExp(title.trim(), 'ig') },
{ _id: new RegExp(title.trim(), 'ig') },
],
};
}
if (!author || !user || (user._id !== author)) {
criteria = {
...criteria,
public: true,
};
}
let list = await Route.find({
...criteria,
}, '_id title distance owner updated_at', { limit: 500 }).populate('owner');
list = list.filter(item => (
!author || item.owner._id === author
));
let limits = list.reduce(({ min, max }, { distance: dist }) => ({
min: Math.ceil(Math.min(dist, min) / 20) * 20,
max: Math.ceil(Math.max(dist, max) / 20) * 20,
}), { min: 999999, max: 0 });
const minDist = parseInt(distance[0], 10);
const maxDist = parseInt(distance[1], 10);
// const maxDist = parseInt(distance[1], 10) > parseInt(distance[0], 10)
// ? parseInt(distance[1], 10)
// : 10000;
if (distance && distance.length === 2) {
list = list.filter(item => (
item.distance >= minDist &&
item.distance <= maxDist
));
}
if (list.length === 0) {
limits = { min: 0, max: 0 };
} else if (limits.max === 0) {
limits = { min: 0, max: 0 };
} else if (limits.min === limits.max) {
limits = { min: limits.max - 20, max: limits.max };
}
res.send({
success: true,
list,
...limits,
});
};