From 21359dd4582ba35bbc3d3795b8a0fd6d0acfb1f2 Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Mon, 16 Dec 2019 20:54:13 +0300 Subject: [PATCH] file structure & control-panel refactor routes --- config/routes/admin.js | 4 +- config/routes/control-panel.js | 147 ++++++++++++++++++ config/routes/{routes.js => main.js} | 148 ------------------- config/server.js | 15 +- package-lock.json | 74 +++++++++- package.json | 1 + src/admin/components/categories.component.js | 1 - 7 files changed, 224 insertions(+), 166 deletions(-) create mode 100644 config/routes/control-panel.js rename config/routes/{routes.js => main.js} (60%) diff --git a/config/routes/admin.js b/config/routes/admin.js index 192fa93..fe936c1 100644 --- a/config/routes/admin.js +++ b/config/routes/admin.js @@ -4,9 +4,7 @@ const passport = require('passport'); const initializePassport = require('../passport.config'); function checkNotAuthenticated(req, res, next) { - if (req.isAuthenticated()) { - return res.redirect('/control-panel'); - } + if (req.isAuthenticated()) return res.redirect('/control-panel'); next(); } diff --git a/config/routes/control-panel.js b/config/routes/control-panel.js new file mode 100644 index 0000000..3f56c8a --- /dev/null +++ b/config/routes/control-panel.js @@ -0,0 +1,147 @@ +const ObjectID = require('mongodb').ObjectID; +const fs = require('fs'); + +function checkAuthenticated(req, res, next) { + if (req.isAuthenticated()) return next(); + res.redirect('/admin'); +} + +module.exports = function(server, db) { + server.get('/control-panel', checkAuthenticated, (req, res) => { + try { + res.render('admin/control-panel', { + name: req.user.name, + email: req.user.email, + title: 'Digital-Store | Панель управления сайтом', + host: req.headers.host, + pageName: ['Главная', 'main'], + }); + } catch (error) { + res.render('main/404'); + } + }); + server.get('/control-panel/items', checkAuthenticated, (req, res) => { + try { + res.render('admin/items', { + name: req.user.name, + email: req.user.email, + title: 'Digital-Store | Товары', + host: req.headers.host, + pageName: ['Товары', 'items'], + }); + } catch (error) { + res.render('main/404'); + } + }); + server.get('/control-panel/categories', checkAuthenticated, async (req, res) => { + try { + const categories = await db.collection('categories').find({}).toArray(); + res.render('admin/categories', { + name: req.user.name, + email: req.user.email, + title: 'Digital-Store | Категории', + host: req.headers.host, + pageName: ['Категории', 'categories'], + categoriesCount: categories.length + }); + } catch (error) { + res.render('main/404'); + } + }); + server.get('/control-panel/content', checkAuthenticated, (req, res) => { + try { + res.render('admin/content', { + name: req.user.name, + email: req.user.email, + title: 'Digital-Store | Контент', + host: req.headers.host, + pageName: ['Контент', 'content'], + }); + } catch (error) { + res.render('main/404'); + } + }); + server.get('/control-panel/administrators', checkAuthenticated, (req, res) => { + try { + res.render('admin/administrators', { + name: req.user.name, + email: req.user.email, + title: 'Digital-Store | Администраторы', + host: req.headers.host, + pageName: ['Администраторы', 'administrators'], + }); + } catch (error) { + res.render('main/404'); + } + }); + server.get('/control-panel/database', checkAuthenticated, (req, res) => { + try { + res.render('admin/database', { + name: req.user.name, + email: req.user.email, + title: 'Digital-Store | Настройка Базы Данных', + host: req.headers.host, + pageName: ['База данных', 'database'], + }); + } catch (error) { + res.render('main/404'); + } + }); + + server.post('/control-panel/categories/create', checkAuthenticated, (req, res) => { + try { + const data = { + title: req.body.title.toLowerCase().trim(), + img: req.body.img, + type: req.body.type, + format: req.body.format + } + db.collection('categories').insertOne(data); + res.redirect('/control-panel/categories'); + } catch { + res.render('main/404'); + } + }); + server.post('/control-panel/categories/delete', checkAuthenticated, (req, res) => { + try { + const data = JSON.parse(req.body.category); + db.collection('categories').deleteOne({"_id": ObjectID(data.id)}); + res.redirect('/control-panel/categories'); + } catch (error) { + res.render('main/404'); + } + }); + server.post('/control-panel/categories/update', checkAuthenticated, (req, res) => { + try { + const data = { + id: req.body.id, + title: req.body.title.toLowerCase().trim(), + originalTitle: req.body.originalTitle.toLowerCase().trim(), + img: req.body.img, + type: req.body.type, + format: req.body.format + } + db.collection('categories').updateOne({"_id": ObjectID(data.id)}, {$set: {title: data.title, img: data.img, type: data.type, format: data.format}}); + db.collection('items').updateMany({"category": data.originalTitle}, {$set: {category: data.title}}); + res.redirect('/control-panel/categories'); + } catch (error) { + res.render('main/404'); + } + }); + server.post('/control-panel/categories/addicon', checkAuthenticated, (req, res) => { + try { + res.redirect('/control-panel/categories'); + } catch (error) { + res.render('main/404'); + } + }); + server.post('/control-panel/categories/dellicon', checkAuthenticated, (req, res) => { + const path = `./dist/public/img/service-icons/${req.body.img}` + try { + fs.unlinkSync(path); + res.redirect('/control-panel/categories'); + } catch (error) { + res.render('main/404'); + } + }); +} \ No newline at end of file diff --git a/config/routes/routes.js b/config/routes/main.js similarity index 60% rename from config/routes/routes.js rename to config/routes/main.js index 2735947..3d0c9bf 100644 --- a/config/routes/routes.js +++ b/config/routes/main.js @@ -1,14 +1,6 @@ const ObjectID = require('mongodb').ObjectID; const fs = require('fs'); -function checkAuthenticated(req, res, next) { - if (req.isAuthenticated()) { - return next(); - } - - res.redirect('/admin'); -} - function indexRoute(req, res, dbo) { dbo.collection('categories').find().toArray((err, result) => { const categories = result.map(category => category.title[0].toUpperCase() + category.title.slice(1)); @@ -169,134 +161,6 @@ function myOrdersRoute(req, res) { }); } -function controlPanelRoute(req, res) { - res.render('admin/control-panel', { - name: req.user.name, - email: req.user.email, - title: 'Digital-Store | Панель управления сайтом', - host: req.headers.host, - pageName: ['Главная', 'main'], - }); -} - -function controlPanelItemsRoute(req, res) { - res.render('admin/items', { - name: req.user.name, - email: req.user.email, - title: 'Digital-Store | Товары', - host: req.headers.host, - pageName: ['Товары', 'items'], - }); -} - -async function controlPanelCategoriesRoute(req, res, db) { - const categories = await db.collection('categories').find({}).toArray(); - res.render('admin/categories', { - name: req.user.name, - email: req.user.email, - title: 'Digital-Store | Категории', - host: req.headers.host, - pageName: ['Категории', 'categories'], - categoriesCount: categories.length - }); -} - -function controlPanelContentRoute(req, res) { - res.render('admin/content', { - name: req.user.name, - email: req.user.email, - title: 'Digital-Store | Контент', - host: req.headers.host, - pageName: ['Контент', 'content'], - }); -} - -function controlPanelAdministratorsRoute(req, res) { - res.render('admin/administrators', { - name: req.user.name, - email: req.user.email, - title: 'Digital-Store | Администраторы', - host: req.headers.host, - pageName: ['Администраторы', 'administrators'], - }); -} - -function controlPanelDatabaseRoute(req, res) { - res.render('admin/database', { - name: req.user.name, - email: req.user.email, - title: 'Digital-Store | Настройка Базы Данных', - host: req.headers.host, - pageName: ['База данных', 'database'], - }); -} - -function controlPanelAddCategory(req, res, db) { - try { - const data = { - title: req.body.title.toLowerCase().trim(), - img: req.body.img, - type: req.body.type, - format: req.body.format - } - db.collection('categories').insertOne(data); - res.redirect('/control-panel/categories'); - } catch { - res.render('main/404'); - } -} - -function controlPanelDellCategory(req, res, db) { - try { - const data = JSON.parse(req.body.category); - db.collection('categories').deleteOne({"_id": ObjectID(data.id)}); - res.redirect('/control-panel/categories'); - } catch (error) { - console.log(error); - res.render('main/404'); - } -} - -function controlPanelUpdCategory(req, res, db) { - try { - const data = { - id: req.body.id, - title: req.body.title.toLowerCase().trim(), - originalTitle: req.body.originalTitle.toLowerCase().trim(), - img: req.body.img, - type: req.body.type, - format: req.body.format - } - db.collection('categories').updateOne({"_id": ObjectID(data.id)}, {$set: {title: data.title, img: data.img, type: data.type, format: data.format}}); - db.collection('items').updateMany({"category": data.originalTitle}, {$set: {category: data.title}}); - res.redirect('/control-panel/categories'); - - } catch (error) { - console.log(error); - res.render('main/404'); - } -} - -function controlPanelAddIcon(req, res, db) { - try { - res.redirect('/control-panel/categories'); - } catch (error) { - console.log(error); - res.render('main/404'); - } -} - -function controlPanelDellIcon(req, res, db) { - const path = `./dist/public/img/service-icons/${req.body.img}` - try { - fs.unlinkSync(path); - res.redirect('/control-panel/categories'); - } catch (error) { - console.log(error); - res.render('main/404'); - } -} - module.exports = function (server, db) { server.get('/', (req, res) => indexRoute(req, res, db)); server.get('/api', (req, res) => getItemsRoute(req, res, db)); @@ -305,16 +169,4 @@ module.exports = function (server, db) { server.get('/comments', (req, res) => commentsRoute(req, res, db)); server.get('/my-orders', (req, res) => myOrdersRoute(req, res, db)); server.get('/product/:id', (req, res) => onePageItemRoute(req, res, db)); - server.get('/control-panel', checkAuthenticated, (req, res) => controlPanelRoute(req, res)); - server.get('/control-panel/items', checkAuthenticated, (req, res) => controlPanelItemsRoute(req, res)); - server.get('/control-panel/categories', checkAuthenticated, (req, res) => controlPanelCategoriesRoute(req, res, db)); - server.get('/control-panel/content', checkAuthenticated, (req, res) => controlPanelContentRoute(req, res)); - server.get('/control-panel/administrators', checkAuthenticated, (req, res) => controlPanelAdministratorsRoute(req, res)); - server.get('/control-panel/database', checkAuthenticated, (req, res) => controlPanelDatabaseRoute(req, res)); - - server.post('/control-panel/categories/create', checkAuthenticated, (req, res) => controlPanelAddCategory(req, res, db)); - server.post('/control-panel/categories/delete', checkAuthenticated, (req, res) => controlPanelDellCategory(req, res, db)); - server.post('/control-panel/categories/update', checkAuthenticated, (req, res) => controlPanelUpdCategory(req, res, db)); - server.post('/control-panel/categories/addicon', checkAuthenticated, (req, res) => controlPanelAddIcon(req, res, db)); - server.post('/control-panel/categories/dellicon', checkAuthenticated, (req, res) => controlPanelDellIcon(req, res, db)); } diff --git a/config/server.js b/config/server.js index 272f21d..d1efbee 100644 --- a/config/server.js +++ b/config/server.js @@ -18,12 +18,13 @@ MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: t 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()) @@ -31,21 +32,17 @@ MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: t 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(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/routes')(server, db); - require('./routes/admin')(server, db); + require('./routes/main')(server, db); // маршруты сайта + require('./routes/admin')(server, db); // маршрут с формой авторизации админа + require('./routes/control-panel')(server, db); // маршруты с панелью управления // 404 Redirect server.use((req, res) => res.status(404).render('main/404')); diff --git a/package-lock.json b/package-lock.json index 6c5d7af..d46a1f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2297,11 +2297,15 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==" + }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, "requires": { "ms": "^2.1.1" } @@ -3105,6 +3109,11 @@ "resolve-dir": "^1.0.1" } }, + "flatted": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", + "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==" + }, "flush-write-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", @@ -3173,6 +3182,16 @@ "readable-stream": "^2.0.0" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -3850,8 +3869,7 @@ "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handle-thing": { "version": "2.0.0", @@ -4487,6 +4505,14 @@ } } }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -4554,6 +4580,18 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, + "log4js": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.1.0.tgz", + "integrity": "sha512-fSCHMYsMJbHwfNTuMlopVVcfkKwIRLh5mpNZGB2oBbnSmr3yUTo4tL4xGBA0/q29xowlu96eTXGghJFNhPXMnA==", + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.3" + } + }, "loglevel": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", @@ -4872,8 +4910,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multer": { "version": "1.4.2", @@ -5914,6 +5951,11 @@ "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "dev": true }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==" + }, "right-align": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", @@ -6546,6 +6588,23 @@ "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, + "streamroller": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.3.tgz", + "integrity": "sha512-AegmvQsscTRhHVO46PhCDerjIpxi7E+d2GxgUDu+nzw/HuLnUdxHWr6WQ+mVn/4iJgMKKFFdiUwFcFRDvcjCtw==", + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==" + } + } + }, "streamsearch": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", @@ -6891,6 +6950,11 @@ "imurmurhash": "^0.1.4" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/package.json b/package.json index 0d3e5a9..4f4055c 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "express": "^4.17.1", "express-flash": "0.0.2", "express-session": "^1.17.0", + "log4js": "^6.1.0", "method-override": "^3.0.0", "mongodb": "^3.3.4", "multer": "^1.4.2", diff --git a/src/admin/components/categories.component.js b/src/admin/components/categories.component.js index de56778..2369834 100644 --- a/src/admin/components/categories.component.js +++ b/src/admin/components/categories.component.js @@ -19,7 +19,6 @@ export class CategoriesComponent extends Component { this.$dellIconFrom.addEventListener('submit', this.dellIcon.bind(this)); this.$addForm.addEventListener('submit', this.addCategory.bind(this)); this.$deleteForm.addEventListener('submit', this.deleteCategory.bind(this)); - this.$editSelect.addEventListener('change', this.insertData); } }