mirror of
https://github.com/muerwre/orchidmap-front.git
synced 2025-04-25 02:56:41 +07:00
96 lines
2.3 KiB
JavaScript
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.floor(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,
|
|
});
|
|
};
|
|
|