diff --git a/config/database.js b/config/database.js new file mode 100644 index 0000000..2c7d67c --- /dev/null +++ b/config/database.js @@ -0,0 +1,4 @@ +module.exports = { + url: 'mongodb://localhost:27017/', + name: 'digital_store' +} \ No newline at end of file diff --git a/config/routes/routes.js b/config/routes/routes.js index ec18a37..9611c5b 100644 --- a/config/routes/routes.js +++ b/config/routes/routes.js @@ -1,154 +1,118 @@ -const MongoClient = require('mongodb').MongoClient; -const dbName = 'digital_store'; -const routes = { - // Index - indexRoute: function (req, res) { - MongoClient.connect(`mongodb://localhost:27017/${dbName}`, { - useNewUrlParser: true, - useUnifiedTopology: true - }, (err, db) => { - if (err) throw err; +const db = require('../database'); +const dbName = db.name; - const dbo = db.db(dbName); +function indexRoute(req, res, db) { + const dbo = db.db(dbName); + + dbo.collection('storeInfo').find().toArray((err, result) => { + if (err) throw err; + const array = Object.keys(result[0].items) + const categories = array.map(cat => { + return cat[0].toUpperCase() + cat.slice(1); + }); + res.render('index', { + pageName: 'index', + categories + }); + }) +} + +function getItemsRoute(req, res, db) { + const dbo = db.db(dbName); + + const queryOptions = { + auth: 'yYNfW8ynVO18L1TW5qIkILM1WtWgrVZz', + option: 'all' + } + + // установка кэша при отдачи json данных + //res.setHeader("Cache-Control", "public, max-age=20"); + + if (req.query.auth === queryOptions.auth) { + if (req.query.option === queryOptions.option) { dbo.collection('storeInfo').find().toArray((err, result) => { if (err) throw err; - const array = Object.keys(result[0].items) - const categories = array.map(cat => { - return cat[0].toUpperCase() + cat.slice(1); - }); - res.render('index', { - pageName: 'index', - categories - }); - db.close(); + res.send(result[0].items); }) - }); - }, - // How-to-buy - howToBuyRoute: function (req, res) { - res.render('how-to-buy', { - pageName: 'how-to-buy' - }); - }, - - // Contacts - contactsRoute: function (req, res) { - res.render('contacts', { - pageName: 'contacts' - }); - }, - - // Comments - commentsRoute: function (req, res) { - res.render('comments', { - pageName: 'comments' - }); - }, - - // My-orders - myOrdersRoute: function (req, res) { - res.render('my-orders', { - pageName: 'my-orders' - }); - }, - - // GetItems - getItemsRoute: function (req, res) { - const queryOptions = { - auth: 'yYNfW8ynVO18L1TW5qIkILM1WtWgrVZz', - option: 'all' - } - res.setHeader("Cache-Control", "public, max-age=20"); - - if (req.query.auth === queryOptions.auth) { - if (req.query.option === queryOptions.option) { - MongoClient.connect(`mongodb://localhost:27017/${dbName}`, { - useNewUrlParser: true, - useUnifiedTopology: true - }, (err, db) => { - if (err) throw err; - - const dbo = db.db(dbName); - dbo.collection('storeInfo').find().toArray((err, result) => { - if (err) throw err; - res.send(result[0].items); - db.close(); - }) - }); - } else if (!req.query.option && req.query.category) { - MongoClient.connect(`mongodb://localhost:27017/${dbName}`, { - useNewUrlParser: true, - useUnifiedTopology: true - }, (err, db) => { - if (err) throw err; - - const dbo = db.db(dbName); - dbo.collection('storeInfo').find().toArray((err, result) => { - if (err) throw err; - const query = result[0].items[req.query.category] - if (query != undefined) { - res.send(query); - } else { - res.send('Товары в этой категории не найдены или такой категории нет') - } - db.close(); - }) - }); - } else { - res.send('Запрос неверный'); - } + } else if (!req.query.option && req.query.category) { + dbo.collection('storeInfo').find().toArray((err, result) => { + if (err) throw err; + const query = result[0].items[req.query.category] + if (query != undefined) { + res.send(query); + } else { + res.send('Товары в этой категории не найдены или такой категории нет') + } + }) } else { - res.send('Неверный токен'); + res.send('Запрос неверный'); } - }, - - // OnePageItem - onePageItem: function (req, res) { - const query = { - id: req.params.id - } - MongoClient.connect(`mongodb://localhost:27017/${dbName}`, { - useNewUrlParser: true, - useUnifiedTopology: true - }, (err, db) => { - if (err) throw err; - - const dbo = db.db(dbName); - dbo.collection('storeInfo').find().toArray((err, result) => { - if (err) throw err; - const items = result[0].items; - const keys = Object.keys(result[0].items); - - keys.forEach(key => { - items[key].forEach(item => { - if (item._id != undefined) { - if (item._id == query.id) { - res.render('product', { - title: item.title, - image: item.image, - count: item.count, - category: item.category[0].toUpperCase() + item.category.slice(1), - price: item.price, - description: item.description - }); - } - } - }) - }) - db.close(); - }) - }); - + } else { + res.send('Неверный токен'); } } -module.exports = function (server) { - server.get('/', routes.indexRoute); - server.get('/how-to-buy', routes.howToBuyRoute); - server.get('/contacts', routes.contactsRoute); - server.get('/comments', routes.commentsRoute); - server.get('/my-orders', routes.myOrdersRoute); - server.get('/product/:id', routes.onePageItem); - server.get('/store-api', routes.getItemsRoute); +function onePageItemRoute(req, res, db) { + const dbo = db.db(dbName); + + dbo.collection('storeInfo').find().toArray((err, result) => { + if (err) throw err; + const items = result[0].items; + const keys = Object.keys(result[0].items); + let itemFind = false; + keys.forEach(key => { + items[key].forEach(item => { + if (item._id != undefined) { + if (item._id == req.params.id) { + itemFind = true; + res.render('product', { + title: item.title, + image: item.image, + count: item.count, + category: item.category[0].toUpperCase() + item.category.slice(1), + price: item.price, + description: item.description + }); + } + } + }) + }); + if (!itemFind) res.send('Error 404'); + }) +} + +function howToBuyRoute(req, res, db) { + res.render('how-to-buy', { + pageName: 'how-to-buy' + }); +} + +function contactsRoute(req, res, db) { + res.render('contacts', { + pageName: 'contacts' + }); +} + +function commentsRoute(req, res, db) { + res.render('comments', { + pageName: 'comments' + }); +} + +function myOrdersRoute(req, res, db) { + res.render('my-orders', { + pageName: 'my-orders' + }); +} + + +module.exports = function (server, db) { + server.get('/', (req, res) => indexRoute(req, res, db)); + server.get('/how-to-buy', (req, res) => howToBuyRoute(req, res, db)); + server.get('/contacts', (req, res) => contactsRoute(req, res, 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('/store-api', (req, res) => getItemsRoute(req, res, db)); } \ No newline at end of file diff --git a/config/server.js b/config/server.js index ef62426..854e6d8 100644 --- a/config/server.js +++ b/config/server.js @@ -1,16 +1,25 @@ +const MongoClient = require('mongodb').MongoClient; +const db = require('./database'); const express = require('express'); const server = express(); const path = require('path'); -// Pug config -server.use(express.static(path.join(__dirname, '../dist/public'))); -// server.use('/css', express.static(__dirname + '../dist/public/css')); -server.set('view engine', 'pug'); -server.set('views', path.join(__dirname, '../dist/views')); -require('./routes/routes')(server); -// 404 Redirect -server.use((req, res) => res.status(404).send('Error 404')); -server.listen(3000, () => console.log('Listen port 3000...')); \ No newline at end of file + +MongoClient.connect(db.url, {useNewUrlParser: true, useUnifiedTopology: true}, (err, database) => { + if (err) return console.log(err) + + // Pug config + server.use(express.static(path.join(__dirname, '../dist/public'))); + // server.use('/css', express.static(__dirname + '../dist/public/css')); + server.set('view engine', 'pug'); + server.set('views', path.join(__dirname, '../dist/views')); + + require('./routes/routes')(server, database); + // 404 Redirect + server.use((req, res) => res.status(404).send('Error 404')); + server.listen(3000, () => console.log('Listen port 3000...')); +}) + diff --git a/dist/public/css/media.css b/dist/public/css/media.css index 5edae44..dab0ed6 100644 --- a/dist/public/css/media.css +++ b/dist/public/css/media.css @@ -34,7 +34,11 @@ width: 100%; } } - +@media (min-width: 768px) { + .items .items-list__info { + min-width: 435px; + } +} @media (max-width: 768px) { .items .items-list { flex-wrap: wrap; diff --git a/dist/public/css/style.css b/dist/public/css/style.css index 67d0dfb..9572183 100644 --- a/dist/public/css/style.css +++ b/dist/public/css/style.css @@ -435,7 +435,6 @@ footer .container { .items-list__info { margin-top: 5px; - min-width: 435px; } .list-icon, diff --git a/dist/public/js/bundle.js b/dist/public/js/bundle.js index 977635b..5678c1b 100644 --- a/dist/public/js/bundle.js +++ b/dist/public/js/bundle.js @@ -3894,7 +3894,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CategoryComponent\", function() { return CategoryComponent; });\n/* harmony import */ var _core_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/component */ \"./src/js/core/component.js\");\n/* harmony import */ var _services_api_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/api.service */ \"./src/js/services/api.service.js\");\n/* harmony import */ var _templates_itemsOne_template__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../templates/itemsOne.template */ \"./src/js/templates/itemsOne.template.js\");\n/* harmony import */ var _templates_items_template__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../templates/items.template */ \"./src/js/templates/items.template.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n\n\n\n\nvar CategoryComponent =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(CategoryComponent, _Component);\n\n function CategoryComponent(id, _ref) {\n var _this;\n\n var items = _ref.items;\n\n _classCallCheck(this, CategoryComponent);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(CategoryComponent).call(this, id));\n _this.items = items;\n return _this;\n }\n\n _createClass(CategoryComponent, [{\n key: \"init\",\n value: function init() {\n if (this.$el) {\n this.$el.addEventListener('click', buttonHandler.bind(this));\n }\n }\n }]);\n\n return CategoryComponent;\n}(_core_component__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\nfunction buttonHandler(e) {\n var category, fData, html, _fData, categories, _html;\n\n return regeneratorRuntime.async(function buttonHandler$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n e.preventDefault();\n\n if (!(e.target.dataset.category && e.target.dataset.category != 'all')) {\n _context.next = 13;\n break;\n }\n\n this.items.onShow();\n activeLink(e);\n category = e.target.dataset.category.toLowerCase();\n _context.next = 7;\n return regeneratorRuntime.awrap(_services_api_service__WEBPACK_IMPORTED_MODULE_1__[\"apiService\"].getItemsOne(category));\n\n case 7:\n fData = _context.sent;\n html = Object(_templates_itemsOne_template__WEBPACK_IMPORTED_MODULE_2__[\"renderItemsOne\"])(category, fData);\n this.items.onHide();\n document.querySelector('#roster').insertAdjacentHTML('afterbegin', html);\n _context.next = 23;\n break;\n\n case 13:\n if (!(e.target.dataset.category === 'all')) {\n _context.next = 23;\n break;\n }\n\n this.items.onShow();\n activeLink(e);\n _context.next = 18;\n return regeneratorRuntime.awrap(_services_api_service__WEBPACK_IMPORTED_MODULE_1__[\"apiService\"].getItems());\n\n case 18:\n _fData = _context.sent;\n categories = Object.keys(_fData);\n _html = Object(_templates_items_template__WEBPACK_IMPORTED_MODULE_3__[\"renderItems\"])(categories, _fData);\n this.items.onHide();\n document.querySelector('#roster').insertAdjacentHTML('afterbegin', _html);\n\n case 23:\n case \"end\":\n return _context.stop();\n }\n }\n }, null, this);\n}\n\nfunction activeLink(e) {\n e.target.parentNode.parentNode.querySelectorAll('li a').forEach(function (li) {\n return li.classList.remove('active');\n });\n e.target.classList.add('active');\n}\n\n//# sourceURL=webpack:///./src/js/components/category.component.js?"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"CategoryComponent\", function() { return CategoryComponent; });\n/* harmony import */ var _core_component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../core/component */ \"./src/js/core/component.js\");\n/* harmony import */ var _services_api_service__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/api.service */ \"./src/js/services/api.service.js\");\n/* harmony import */ var _templates_itemsOne_template__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../templates/itemsOne.template */ \"./src/js/templates/itemsOne.template.js\");\n/* harmony import */ var _templates_items_template__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../templates/items.template */ \"./src/js/templates/items.template.js\");\nfunction _typeof(obj) { if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\n\n\n\n\nvar CategoryComponent =\n/*#__PURE__*/\nfunction (_Component) {\n _inherits(CategoryComponent, _Component);\n\n function CategoryComponent(id, _ref) {\n var _this;\n\n var items = _ref.items;\n\n _classCallCheck(this, CategoryComponent);\n\n _this = _possibleConstructorReturn(this, _getPrototypeOf(CategoryComponent).call(this, id));\n _this.items = items;\n return _this;\n }\n\n _createClass(CategoryComponent, [{\n key: \"init\",\n value: function init() {\n if (this.$el) {\n this.$el.addEventListener('click', buttonHandler.bind(this));\n }\n }\n }]);\n\n return CategoryComponent;\n}(_core_component__WEBPACK_IMPORTED_MODULE_0__[\"Component\"]);\n\nfunction buttonHandler(e) {\n var category, fData, html, _fData, categories, _html;\n\n return regeneratorRuntime.async(function buttonHandler$(_context) {\n while (1) {\n switch (_context.prev = _context.next) {\n case 0:\n e.preventDefault();\n\n if (!(e.target.dataset.category && e.target.dataset.category != 'all')) {\n _context.next = 13;\n break;\n }\n\n this.items.onShow();\n activeLink(e);\n category = e.target.dataset.category.toLowerCase();\n _context.next = 7;\n return regeneratorRuntime.awrap(_services_api_service__WEBPACK_IMPORTED_MODULE_1__[\"apiService\"].getItemsOne(category));\n\n case 7:\n fData = _context.sent;\n html = Object(_templates_itemsOne_template__WEBPACK_IMPORTED_MODULE_2__[\"renderItemsOne\"])(category, fData);\n this.items.onHide();\n document.querySelector('#roster').insertAdjacentHTML('afterbegin', html);\n _context.next = 23;\n break;\n\n case 13:\n if (!(e.target.dataset.category === 'all')) {\n _context.next = 23;\n break;\n }\n\n this.items.onShow();\n activeLink(e);\n _context.next = 18;\n return regeneratorRuntime.awrap(_services_api_service__WEBPACK_IMPORTED_MODULE_1__[\"apiService\"].getItems());\n\n case 18:\n _fData = _context.sent;\n categories = Object.keys(_fData);\n _html = Object(_templates_items_template__WEBPACK_IMPORTED_MODULE_3__[\"renderItems\"])(categories, _fData);\n this.items.onHide();\n document.querySelector('#roster').insertAdjacentHTML('afterbegin', _html);\n\n case 23:\n case \"end\":\n return _context.stop();\n }\n }\n }, null, this);\n}\n\nfunction activeLink(e) {\n Array.from(e.target.parentNode.parentNode.querySelectorAll('li a')).forEach(function (li) {\n return li.classList.remove('active');\n });\n e.target.classList.add('active');\n}\n\n//# sourceURL=webpack:///./src/js/components/category.component.js?"); /***/ }), diff --git a/package-lock.json b/package-lock.json index 83a0da1..e5fc7a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1261,15 +1261,6 @@ } } }, - "axios-cache-adapter": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/axios-cache-adapter/-/axios-cache-adapter-2.5.0.tgz", - "integrity": "sha512-YcMPdMoqmSLoZx7A5YD/PdYGuX6/Y9M2tHBhaIXvXrPeGgNnbW7nb3+uArWlT53WGHLfclnu2voMmS7jGXVg6A==", - "requires": { - "cache-control-esm": "1.0.0", - "lodash": "^4.17.11" - } - }, "babel-loader": { "version": "8.0.6", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz", @@ -1659,11 +1650,6 @@ "unset-value": "^1.0.0" } }, - "cache-control-esm": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/cache-control-esm/-/cache-control-esm-1.0.0.tgz", - "integrity": "sha512-Fa3UV4+eIk4EOih8FTV6EEsVKO0W5XWtNs6FC3InTfVz+EjurjPfDXY5wZDo/lxjDxg5RjNcurLyxEJBcEUx9g==" - }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", diff --git a/package.json b/package.json index ba7d6c2..2cd070f 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ "dependencies": { "@babel/polyfill": "^7.7.0", "axios": "^0.19.0", - "axios-cache-adapter": "^2.5.0", "express": "^4.17.1", "mongodb": "^3.3.4", "pug": "^2.0.4" diff --git a/src/js/components/category.component.js b/src/js/components/category.component.js index 4113840..7b8ec1c 100644 --- a/src/js/components/category.component.js +++ b/src/js/components/category.component.js @@ -41,6 +41,6 @@ async function buttonHandler(e) { } function activeLink(e) { - e.target.parentNode.parentNode.querySelectorAll('li a').forEach(li => li.classList.remove('active')); + Array.from(e.target.parentNode.parentNode.querySelectorAll('li a')).forEach(li => li.classList.remove('active')); e.target.classList.add('active'); } \ No newline at end of file