172 lines
6.4 KiB
JavaScript

const fs = require('fs');
const ObjectID = require('mongodb').ObjectID;
function checkAuthenticated(req, res, next) {
if (req.isAuthenticated()) return next();
res.redirect('/admin');
}
module.exports = function(server, db) {
server.get('/api/items', async (req, res) => {
if (req.query.q) {
try {
const items = await db.collection('items').find({title: {$regex: req.query.q, $options: "i"}}, {limit: 5}).toArray();
res.json(items);
} catch {
res.status(500).render('main/404');
}
} else {
try {
const items = await db.collection('items').find({}).toArray(),
info = await db.collection('info').find({}).toArray(),
sortBy = req.query.sorting;
if (items.length > 0) {
// устанавливаем count для каждого товара.
info.forEach(info => db.collection('items').updateOne({
"_id": ObjectID(info._id)
}, {
$set: {
count: info.data.length
}
}));
switch (sortBy) {
case 'ascending':
res.json(items.sort((a, b) => a.price - b.price));
break;
case 'descending':
res.json(items.sort((a, b) => b.price - a.price));
break;
case 'newer':
res.json(items.sort((a, b) => b.date - a.date));
break;
case 'older':
res.json(items.sort((a, b) => a.date - b.date));
break;
default:
res.json(items);
break;
}
} else res.send({
error: 'Товаров в магазине пока что нет.'
});
} catch {
res.status(500).render('main/404');
}
}
});
server.get('/api/items/page/:page', async (req, res) => {
try {
const page = parseInt(req.params.page),
limit = 5,
items = await db.collection('items').find({}, {skip: limit * (page - 1), limit}).toArray();
items.length > 0 && !isNaN(page) ? res.json(items) : res.json({error: 'Такой страницы не существует.'});
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/items/data', checkAuthenticated, async (req, res) => {
try {
const data = await db.collection('info').find({}).toArray();
res.json(data);
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/buyers', checkAuthenticated, async (req, res) => {
try {
const buyers = await db.collection('buyers').find({}).toArray();
if (buyers.length > 0) {
res.json(buyers);
} else res.send({
error: 'Покупателей в магазине пока что нет.'
});
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/buyers/:bill_id', checkAuthenticated, async (req, res) => {
try {
const buyers = await db.collection('buyers').find({bill_id: req.params.bill_id}).toArray();
res.json(buyers);
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/buyers/page/:page', checkAuthenticated, async (req, res) => {
try {
const page = parseInt(req.params.page),
limit = 5,
buyers = await db.collection('buyers').find({}, {skip: limit * (page - 1), limit}).toArray();
buyers.length > 0 && !isNaN(page) ? res.json(buyers) : res.json({error: 'Такой страницы не существует.'});
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/items/:category', async (req, res) => {
try {
const items = await db.collection('items').find({
category: req.params.category
}).toArray(),
sortBy = req.query.sorting;
if (items.length > 0) {
switch (sortBy) {
case 'ascending':
res.json(items.sort((a, b) => a.price - b.price));
break;
case 'descending':
res.json(items.sort((a, b) => b.price - a.price));
break;
case 'newer':
res.json(items.sort((a, b) => b.date - a.date));
break;
case 'older':
res.json(items.sort((a, b) => a.date - b.date));
break;
default:
res.json(items);
break;
}
} else res.send({
error: 'Товаров в магазине пока что нет.'
});
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/categories', async (req, res) => {
try {
const categories = await db.collection('categories').find({}).toArray();
categories.length > 0 ? res.json(categories) : res.send({error: 'Категорий в магазине пока что нет.'});
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/category/:category', async (req, res) => {
try {
const category = await db.collection('categories').find({title: req.params.category}).toArray();
category.length > 0 ? res.json(category) : res.send({error: 'Такой категории не существует.'});
} catch {
res.status(500).render('main/404');
}
});
server.get('/api/icons', checkAuthenticated, (req, res) => {
try {
const icons = fs.readdirSync('dist/public/img/service-icons');
res.json(icons);
} catch {
res.status(500).render('main/404');
}
});
}