From e40985b168015ca65e778c1313fe1b712524ccdc Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Sat, 21 Dec 2019 00:10:49 +0300 Subject: [PATCH] api refactor --- config/routes/api.js | 68 +++++++++++++++++++--- config/routes/main.js | 94 ------------------------------- config/server.js | 72 ++++++++++++----------- src/admin/services/api.service.js | 17 +++--- src/main/services/api.service.js | 15 +++-- 5 files changed, 109 insertions(+), 157 deletions(-) diff --git a/config/routes/api.js b/config/routes/api.js index 6a21a60..fe11d31 100644 --- a/config/routes/api.js +++ b/config/routes/api.js @@ -1,18 +1,68 @@ +const fs = require('fs'); + module.exports = function(server, db) { - server.get('/api/v1/items', async (req, res) => { - const items = await db.collection('items').find({}).toArray(); - items.length > 0 ? res.send(items) : res.send({error: 'Товаров в магазине пока что нет.'}); + server.get('/api/items', async (req, res) => { + const items = await db.collection('items').find({}).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: 'Товаров в магазине пока что нет.'}); }); - server.get('/api/v1/items/:category', async (req, res) => { - const items = await db.collection('items').find({category: req.params.category}).toArray(); - items.length > 0 ? res.send(items) : res.send({error: 'Такой категории не существует или там нет товаров.'}); + + server.get('/api/items/:category', async (req, res) => { + 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: 'Товаров в магазине пока что нет.'}); }); - server.get('/api/v1/categories', async (req, res) => { + + server.get('/api/categories', async (req, res) => { const categories = await db.collection('categories').find({}).toArray(); categories.length > 0 ? res.send(categories) : res.send({error: 'Категорий в магазине пока что нет.'}) }); - server.get('/api/v1/categories/:category', async (req, res) => { + + server.get('/api/category/:category', async (req, res) => { const category = await db.collection('categories').find({title: req.params.category}).toArray(); category.length > 0 ? res.send(category) : res.send({error: 'Такой категории не существует.'}); - }) + }); + + server.get('/api/icons', (req, res) => { + const icons = fs.readdirSync('dist/public/img/service-icons'); + res.json(icons); + }); } \ No newline at end of file diff --git a/config/routes/main.js b/config/routes/main.js index 0e24b19..eb5f55a 100644 --- a/config/routes/main.js +++ b/config/routes/main.js @@ -1,97 +1,4 @@ const ObjectID = require('mongodb').ObjectID; -const fs = require('fs'); - -// API -function getItemsRoute(req, res, dbo) { - if (req.query.token === 'yYNfW8ynVO18L1TW5qIkILM1WtWgrVZz') { - if (req.query.items === 'all' && !req.query.category && !req.query.sorting) { - dbo.collection('items').find().toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Товаров в магазине пока что нет.'}); - }); - } else if (req.query.items === 'all' && req.query.sorting && !req.query.category) { - if (req.query.sorting === 'ascending') { - dbo.collection('items').find().sort({price: 1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else if (req.query.sorting === 'descending') { - dbo.collection('items').find().sort({price: -1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else if (req.query.sorting === 'newer') { - dbo.collection('items').find().sort({date: -1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else if (req.query.sorting === 'older') { - dbo.collection('items').find().sort({date: 1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else { - res.send('Введите параметр по убыванию или возрастанию.'); - } - } else if (req.query.items === 'all' && req.query.category && !req.query.sorting) { - dbo.collection('items').find({category: req.query.category}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else if (req.query.items === 'all' && req.query.category && req.query.sorting) { - if (req.query.sorting === 'ascending') { - dbo.collection('items').find({category: req.query.category}).sort({price: 1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else if (req.query.sorting === 'descending') { - dbo.collection('items').find({category: req.query.category}).sort({price: -1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else if (req.query.sorting === 'newer') { - dbo.collection('items').find({category: req.query.category}).sort({date: -1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else if (req.query.sorting === 'older') { - dbo.collection('items').find({category: req.query.category}).sort({date: 1}).toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'Такой категории не существует или там нет товаров.'}); - }); - } else { - res.send('Введите параметр по убыванию или возрастанию.'); - } - } else if (req.query.categories === 'all') { - dbo.collection('categories').find().toArray((err, result) => { - result.length > 0 - ? res.send(result) - : res.send({error: 'На сайте нету категорий'}); - }); - } else if (req.query.icons === 'all') { - const icons = fs.readdirSync('dist/public/img/service-icons'); - res.send(icons); - } else if (req.query.category) { - dbo.collection('categories').find({title: req.query.category}).toArray((err, result) => { - res.send(result); - }); - } else { - res.send('Запрос неверный.'); - } - } else { - res.send('Неверный токен.'); - } -} module.exports = function (server, db) { server.get('/', (req, res) => { @@ -186,5 +93,4 @@ module.exports = function (server, db) { res.render('main/404'); }); }); - server.get('/api', (req, res) => getItemsRoute(req, res, db)); } diff --git a/config/server.js b/config/server.js index ae46de9..55c3614 100644 --- a/config/server.js +++ b/config/server.js @@ -14,40 +14,38 @@ const session = require('express-session'); const methodOverride = require('method-override'); const multer = require('multer'); -MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: true}, (err, client) => { - if (err) return console.log(err) - const db = client.db(db_config.name); - - // Как сохраняем иконки и куда - const storage = multer.diskStorage({ - destination: 'dist/public/img/service-icons', - filename: function(req, file, cb) { - cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)); - } - }); - - // Config - server.use(cors()) - server.use(express.static(path.join(__dirname, '../dist/public'))); - server.use(multer({storage: storage}).single('img')); - server.use(express.urlencoded({ extended: false })); - server.use(flash()); - server.use(session({secret: process.env.SESSION_SECRET,resave: false,saveUninitialized: false})); - server.use(passport.initialize()); - server.use(passport.session()); - ///server.use(express.json()); - server.use(methodOverride('_method')); - server.set('view engine', 'pug'); - server.set('views', path.join(__dirname, '../dist/views')); - - // Routes - require('./routes/main')(server, db); // маршруты сайта - require('./routes/admin')(server, db); // маршрут с формой авторизации админа - require('./routes/control-panel')(server, db); // маршруты с панелью управления - require('./routes/api')(server, db); // rest api - - // 404 Redirect - server.use((req, res) => res.status(404).render('main/404')); - server.listen(3000, () => console.log('Listen port 3000...')); -}) - +MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: true}) + .then((client) => { + const db = client.db(db_config.name); + const storage = multer.diskStorage({ + destination: 'dist/public/img/service-icons', + filename: function(req, file, cb) { + cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)); + } + }); + + // Config + server.use(cors()) + server.use(express.static(path.join(__dirname, '../dist/public'))); + server.use(multer({storage: storage}).single('img')); + server.use(express.urlencoded({ extended: false })); + server.use(express.json()); + server.use(flash()); + server.use(session({secret: process.env.SESSION_SECRET,resave: false,saveUninitialized: false})); + server.use(passport.initialize()); + server.use(passport.session()); + server.use(methodOverride('_method')); + server.set('view engine', 'pug'); + server.set('views', path.join(__dirname, '../dist/views')); + + // Routes + require('./routes/main')(server, db); // маршруты сайта + require('./routes/admin')(server, db); // маршрут с формой авторизации админа + require('./routes/control-panel')(server, db); // маршруты с панелью управления + require('./routes/api')(server, db); // отдача данных клиенту + + // 404 Redirect + server.use((req, res) => res.status(404).render('main/404')); + server.listen(3000, () => console.log('Listen port 3000...')); + }) + .catch((error) => {console.log(error)}); diff --git a/src/admin/services/api.service.js b/src/admin/services/api.service.js index da3b544..aa7e067 100644 --- a/src/admin/services/api.service.js +++ b/src/admin/services/api.service.js @@ -1,5 +1,4 @@ const axios = require('axios'); -const API_TOKEN = 'yYNfW8ynVO18L1TW5qIkILM1WtWgrVZz'; class ApiService { constructor(baseUrl) { @@ -8,7 +7,7 @@ class ApiService { async getCategory(category) { try { - const request = `${this.url}api?token=${API_TOKEN}&category=${encodeURIComponent(category)}`; + const request = `${this.url}/api/category/${encodeURIComponent(category)}`; return useRequest(request); } catch (err) { console.error(err); @@ -17,7 +16,7 @@ class ApiService { async getCategories() { try { - const request = `${this.url}api?token=${API_TOKEN}&categories=all`; + const request = `${this.url}/api/categories`; return useRequest(request); } catch (err) { console.error(err); @@ -27,10 +26,10 @@ class ApiService { async getItems(sorting) { try { if (sorting) { - const request = `${this.url}api?token=${API_TOKEN}&items=all&sorting=${sorting}`; + const request = `${this.url}/api/items?sorting=${sorting}`; return useRequest(request); } else { - const request = `${this.url}api?token=${API_TOKEN}&items=all`; + const request = `${this.url}/api/items`; return useRequest(request); } @@ -42,10 +41,10 @@ class ApiService { async getItemsOne(category, sorting) { try { if (sorting) { - const request = `${this.url}api?token=${API_TOKEN}&items=all&category=${encodeURIComponent(category.toLowerCase())}&sorting=${sorting}`; + const request = `${this.url}/api/items/${encodeURIComponent(category.toLowerCase())}?sorting=${sorting}`; return useRequest(request); } else { - const request = `${this.url}api?token=${API_TOKEN}&items=all&category=${encodeURIComponent(category.toLowerCase())}`; + const request = `${this.url}/api/items/${encodeURIComponent(category.toLowerCase())}`; return useRequest(request); } } catch (err) { @@ -55,7 +54,7 @@ class ApiService { async getIcons() { try { - const request = `${this.url}api?token=${API_TOKEN}&icons=all`; + const request = `${this.url}/api/icons`; return useRequest(request); } catch (err) { console.error(err); @@ -68,4 +67,4 @@ async function useRequest(request) { return await JSON.parse(response.request.response); } -export const apiService = new ApiService('http://localhost:3000/', API_TOKEN); \ No newline at end of file +export const apiService = new ApiService('http://localhost:3000'); \ No newline at end of file diff --git a/src/main/services/api.service.js b/src/main/services/api.service.js index c1fa007..572bf0f 100644 --- a/src/main/services/api.service.js +++ b/src/main/services/api.service.js @@ -1,5 +1,4 @@ const axios = require('axios'); -const API_TOKEN = 'yYNfW8ynVO18L1TW5qIkILM1WtWgrVZz'; class ApiService { constructor(baseUrl) { @@ -8,7 +7,7 @@ class ApiService { async getCategory(category) { try { - const request = `${this.url}api?token=${API_TOKEN}&category=${encodeURIComponent(category)}`; + const request = `${this.url}/api/category/${encodeURIComponent(category)}`; return useRequest(request); } catch (err) { console.error(err); @@ -17,7 +16,7 @@ class ApiService { async getCategories() { try { - const request = `${this.url}api?token=${API_TOKEN}&categories=all`; + const request = `${this.url}/api/categories`; return useRequest(request); } catch (err) { console.error(err); @@ -27,10 +26,10 @@ class ApiService { async getItems(sorting) { try { if (sorting) { - const request = `${this.url}api?token=${API_TOKEN}&items=all&sorting=${sorting}`; + const request = `${this.url}/api/items?sorting=${sorting}`; return useRequest(request); } else { - const request = `${this.url}api?token=${API_TOKEN}&items=all`; + const request = `${this.url}/api/items`; return useRequest(request); } @@ -42,10 +41,10 @@ class ApiService { async getItemsOne(category, sorting) { try { if (sorting) { - const request = `${this.url}api?token=${API_TOKEN}&items=all&category=${encodeURIComponent(category.toLowerCase())}&sorting=${sorting}`; + const request = `${this.url}/api/items/${encodeURIComponent(category.toLowerCase())}?sorting=${sorting}`; return useRequest(request); } else { - const request = `${this.url}api?token=${API_TOKEN}&items=all&category=${encodeURIComponent(category.toLowerCase())}`; + const request = `${this.url}/api/items/${encodeURIComponent(category.toLowerCase())}`; return useRequest(request); } } catch (err) { @@ -59,4 +58,4 @@ async function useRequest(request) { return await JSON.parse(response.request.response); } -export const apiService = new ApiService('http://localhost:3000/', API_TOKEN); \ No newline at end of file +export const apiService = new ApiService('http://localhost:3000'); \ No newline at end of file