file structure & control-panel refactor routes

This commit is contained in:
Sergey Yarkov 2019-12-16 20:54:13 +03:00
parent 3bb00b2318
commit 21359dd458
7 changed files with 224 additions and 166 deletions

View File

@ -4,9 +4,7 @@ const passport = require('passport');
const initializePassport = require('../passport.config'); const initializePassport = require('../passport.config');
function checkNotAuthenticated(req, res, next) { function checkNotAuthenticated(req, res, next) {
if (req.isAuthenticated()) { if (req.isAuthenticated()) return res.redirect('/control-panel');
return res.redirect('/control-panel');
}
next(); next();
} }

View File

@ -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');
}
});
}

View File

@ -1,14 +1,6 @@
const ObjectID = require('mongodb').ObjectID; const ObjectID = require('mongodb').ObjectID;
const fs = require('fs'); const fs = require('fs');
function checkAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
res.redirect('/admin');
}
function indexRoute(req, res, dbo) { function indexRoute(req, res, dbo) {
dbo.collection('categories').find().toArray((err, result) => { dbo.collection('categories').find().toArray((err, result) => {
const categories = result.map(category => category.title[0].toUpperCase() + category.title.slice(1)); 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) { module.exports = function (server, db) {
server.get('/', (req, res) => indexRoute(req, res, db)); server.get('/', (req, res) => indexRoute(req, res, db));
server.get('/api', (req, res) => getItemsRoute(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('/comments', (req, res) => commentsRoute(req, res, db));
server.get('/my-orders', (req, res) => myOrdersRoute(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('/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));
} }

View File

@ -18,12 +18,13 @@ MongoClient.connect(db_config.url, {useNewUrlParser: true, useUnifiedTopology: t
if (err) return console.log(err) if (err) return console.log(err)
const db = client.db(db_config.name); const db = client.db(db_config.name);
// Как сохраняем иконки и куда
const storage = multer.diskStorage({ const storage = multer.diskStorage({
destination: 'dist/public/img/service-icons', destination: 'dist/public/img/service-icons',
filename: function(req, file, cb) { filename: function(req, file, cb) {
cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname)); cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname));
} }
}) });
// Config // Config
server.use(cors()) 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(multer({storage: storage}).single('img'));
server.use(express.urlencoded({ extended: false })); server.use(express.urlencoded({ extended: false }));
server.use(flash()); server.use(flash());
server.use(session({ server.use(session({secret: process.env.SESSION_SECRET,resave: false,saveUninitialized: false}));
secret: process.env.SESSION_SECRET,
resave: false,
saveUninitialized: false
}));
server.use(passport.initialize()); server.use(passport.initialize());
server.use(passport.session()); server.use(passport.session());
server.use(methodOverride('_method')); server.use(methodOverride('_method'));
server.set('view engine', 'pug'); server.set('view engine', 'pug');
server.set('views', path.join(__dirname, '../dist/views')); server.set('views', path.join(__dirname, '../dist/views'));
// Routes // Routes
require('./routes/routes')(server, db); require('./routes/main')(server, db); // маршруты сайта
require('./routes/admin')(server, db); require('./routes/admin')(server, db); // маршрут с формой авторизации админа
require('./routes/control-panel')(server, db); // маршруты с панелью управления
// 404 Redirect // 404 Redirect
server.use((req, res) => res.status(404).render('main/404')); server.use((req, res) => res.status(404).render('main/404'));

74
package-lock.json generated
View File

@ -2297,11 +2297,15 @@
"integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=",
"dev": true "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": { "debug": {
"version": "4.1.1", "version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"requires": { "requires": {
"ms": "^2.1.1" "ms": "^2.1.1"
} }
@ -3105,6 +3109,11 @@
"resolve-dir": "^1.0.1" "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": { "flush-write-stream": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz",
@ -3173,6 +3182,16 @@
"readable-stream": "^2.0.0" "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": { "fs-readdir-recursive": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
@ -3850,8 +3869,7 @@
"graceful-fs": { "graceful-fs": {
"version": "4.2.3", "version": "4.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
"integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ=="
"dev": true
}, },
"handle-thing": { "handle-thing": {
"version": "2.0.0", "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": { "jstransformer": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", "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", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" "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": { "loglevel": {
"version": "1.6.6", "version": "1.6.6",
"resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz",
@ -4872,8 +4910,7 @@
"ms": { "ms": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
"dev": true
}, },
"multer": { "multer": {
"version": "1.4.2", "version": "1.4.2",
@ -5914,6 +5951,11 @@
"integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=",
"dev": true "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": { "right-align": {
"version": "0.1.3", "version": "0.1.3",
"resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
@ -6546,6 +6588,23 @@
"integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==",
"dev": true "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": { "streamsearch": {
"version": "0.1.2", "version": "0.1.2",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
@ -6891,6 +6950,11 @@
"imurmurhash": "^0.1.4" "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": { "unpipe": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",

View File

@ -26,6 +26,7 @@
"express": "^4.17.1", "express": "^4.17.1",
"express-flash": "0.0.2", "express-flash": "0.0.2",
"express-session": "^1.17.0", "express-session": "^1.17.0",
"log4js": "^6.1.0",
"method-override": "^3.0.0", "method-override": "^3.0.0",
"mongodb": "^3.3.4", "mongodb": "^3.3.4",
"multer": "^1.4.2", "multer": "^1.4.2",

View File

@ -19,7 +19,6 @@ export class CategoriesComponent extends Component {
this.$dellIconFrom.addEventListener('submit', this.dellIcon.bind(this)); this.$dellIconFrom.addEventListener('submit', this.dellIcon.bind(this));
this.$addForm.addEventListener('submit', this.addCategory.bind(this)); this.$addForm.addEventListener('submit', this.addCategory.bind(this));
this.$deleteForm.addEventListener('submit', this.deleteCategory.bind(this)); this.$deleteForm.addEventListener('submit', this.deleteCategory.bind(this));
this.$editSelect.addEventListener('change', this.insertData);
} }
} }