orchidmap-front/backend/routes/route/list.js
2019-03-29 12:24:09 +07:00

96 lines
2.3 KiB
JavaScript

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