From 8331a9a90829a13e1c25ddd0fb53e2bbc8a9c3a8 Mon Sep 17 00:00:00 2001 From: Nikita Maslov <51367582+Nikmas-creator@users.noreply.github.com> Date: Thu, 6 Aug 2020 21:50:06 +0300 Subject: [PATCH 1/3] module1-task3 is completed --- .gitignore | 1 + src/constants.js | 24 ++++++++++ src/service/cli/generate.js | 96 +++++++++++++++++++++++++++++++++++++ src/service/cli/help.js | 22 +++++++++ src/service/cli/index.js | 15 ++++++ src/service/cli/version.js | 12 +++++ src/service/service.js | 17 ++++++- src/utils.js | 16 +++++++ 8 files changed, 202 insertions(+), 1 deletion(-) create mode 100644 src/constants.js create mode 100644 src/service/cli/generate.js create mode 100644 src/service/cli/help.js create mode 100644 src/service/cli/index.js create mode 100644 src/service/cli/version.js create mode 100644 src/utils.js diff --git a/.gitignore b/.gitignore index 69b6e0f..44011bd 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ Thumbs.db # Вспомогательные файлы *.log* +mocks.json node_modules/ # Папка с собранными файлами проекта diff --git a/src/constants.js b/src/constants.js new file mode 100644 index 0000000..dc6e8eb --- /dev/null +++ b/src/constants.js @@ -0,0 +1,24 @@ +'use strict'; + +module.exports.DEFAULT_COMMAND = `--help`; + +module.exports.USER_ARGV_INDEX = 2; + +module.exports.ExitCode = { + error: 1, + success: 0, +}; + +module.exports.HttpCode = { + OK: 200, + CREATED: 201, + NOT_FOUND: 404, + INTERNAL_SERVER_ERROR: 500, + FORBIDDEN: 403, + UNAUTHORIZED: 401, + BAD_REQUEST: 400, +}; + +module.exports.API_PREFIX = `/api`; + +module.exports.MAX_ID_LENGTH = 6; diff --git a/src/service/cli/generate.js b/src/service/cli/generate.js new file mode 100644 index 0000000..7c3bd73 --- /dev/null +++ b/src/service/cli/generate.js @@ -0,0 +1,96 @@ +'use strict'; + +const { + getRandomInt, + shuffle, +} = require(`../../utils`); + +const fs = require(`fs`); +const chalk = require(`chalk`); + +const DEFAULT_COUNT = 1; +const FILE_NAME = `mocks.json`; + +const TITLES = [ + `Продам книги Стивена Кинга`, + `Продам новую приставку Sony Playstation 5`, + `Продам отличную подборку фильмов на VHS`, + `Куплю антиквариат`, + `Куплю породистого кота`, + `Продам коллекцию журналов «Огонёк»`, + `Отдам в хорошие руки подшивку «Мурзилка»`, + `Продам советскую посуду. Почти не разбита`, + `Куплю детские санки` +]; + +const SENTENCES = [ + `Товар в отличном состоянии.`, + `Пользовались бережно и только по большим праздникам.`, + `Продаю с болью в сердце...`, + `Бонусом отдам все аксессуары.`, + `Даю недельную гарантию.`, + `Если товар не понравится — верну всё до последней копейки.`, + `Это настоящая находка для коллекционера!`, + `Если найдёте дешевле — сброшу цену.`, + `Таких предложений больше нет!`, + `При покупке с меня бесплатная доставка в черте города.`, + `Кажется, что это хрупкая вещь.`, + `Мой дед не мог её сломать.`, + `Кому нужен этот новый телефон, если тут такое...`, + `Не пытайтесь торговаться.Цену вещам я знаю.` +]; + +const CATEGORIES = [ + `Книги`, + `Разное`, + `Посуда`, + `Игры`, + `Животные`, + `Журналы`, +]; + +const OfferType = { + OFFER: `offer`, + SALE: `sale`, +}; + + +const SumRestrict = { + MIN: 1000, + MAX: 100000, +}; + +const PictureRestrict = { + MIN: 1, + MAX: 16, +}; + +const getPictureFileName = (number) => `item${number.toString().padStart(2, 0)}.jpg`; + +const generateOffers = (count) => ( + Array(count).fill({}).map(() => ({ + category: [CATEGORIES[getRandomInt(0, CATEGORIES.length - 1)]], + description: shuffle(SENTENCES).slice(1, 5).join(` `), + picture: getPictureFileName(getRandomInt(PictureRestrict.MIN, PictureRestrict.MAX)), + title: TITLES[getRandomInt(0, TITLES.length - 1)], + type: Object.keys(OfferType)[Math.floor(Math.random() * Object.keys(OfferType).length)], + sum: getRandomInt(SumRestrict.MIN, SumRestrict.MAX), + })) +); + +module.exports = { + name: `--generate`, + async run(args) { + const [count] = args; + const countOffer = Number.parseInt(count, 10) || DEFAULT_COUNT; + const content = JSON.stringify(generateOffers(countOffer)); + + fs.writeFile(FILE_NAME, content, (err) => { + if (err) { + return console.error(`Can't write data to file...`); + } + + return console.info(`Operation success. File created.`); + }); + } +}; diff --git a/src/service/cli/help.js b/src/service/cli/help.js new file mode 100644 index 0000000..ab19896 --- /dev/null +++ b/src/service/cli/help.js @@ -0,0 +1,22 @@ +'use strict'; + +const chalk = require(`chalk`); + +module.exports = { + name: `--help`, + run() { + const text = ` + Программа запускает http-сервер и формирует файл с данными для API. + + Гайд: + service.js + + Команды: + --version: выводит номер версии + --help: печатает этот текст + --generate формирует файл mocks.json + `; + + console.log(chalk.grey(text)); + } +}; diff --git a/src/service/cli/index.js b/src/service/cli/index.js new file mode 100644 index 0000000..998bf82 --- /dev/null +++ b/src/service/cli/index.js @@ -0,0 +1,15 @@ +'use strict'; + +const help = require(`./help`); +const generate = require(`./generate`); +const version = require(`./version`); + +const Cli = { + [generate.name]: generate, + [help.name]: help, + [version.name]: version +}; + +module.exports = { + Cli, +}; diff --git a/src/service/cli/version.js b/src/service/cli/version.js new file mode 100644 index 0000000..42a4cb1 --- /dev/null +++ b/src/service/cli/version.js @@ -0,0 +1,12 @@ +'use strict'; + +const chalk = require(`chalk`); +const packageJsonFile = require(`../../../package.json`); + +module.exports = { + name: `--version`, + run() { + const version = packageJsonFile.version; + console.log(chalk.blue(version)); + } +}; diff --git a/src/service/service.js b/src/service/service.js index 77dd3e3..b30d460 100644 --- a/src/service/service.js +++ b/src/service/service.js @@ -1,3 +1,18 @@ 'use strict'; -console.log(`Hello, world!`); +const {Cli} = require(`./cli`); +const { + DEFAULT_COMMAND, + USER_ARGV_INDEX, + ExitCode +} = require(`../constants`); + +const userArguments = process.argv.slice(USER_ARGV_INDEX); +const [userCommand] = userArguments; + +if (userArguments.length === 0 || !Cli[userCommand]) { + Cli[DEFAULT_COMMAND].run(); + process.exit(ExitCode.success); +} + +Cli[userCommand].run(userArguments.slice(1)); diff --git a/src/utils.js b/src/utils.js new file mode 100644 index 0000000..832b499 --- /dev/null +++ b/src/utils.js @@ -0,0 +1,16 @@ +'use strict'; + +module.exports.getRandomInt = (min, max) => { + min = Math.ceil(min); + max = Math.floor(max); + return Math.floor(Math.random() * (max - min + 1)) + min; +}; + +module.exports.shuffle = (someArray) => { + for (let i = someArray.length - 1; i > 0; i--) { + const randomPosition = Math.floor(Math.random() * i); + [someArray[i], someArray[randomPosition]] = [someArray[randomPosition], someArray[i]]; + } + + return someArray; +}; From 3d8b7588c8d2349b69731166206dba3d8c7743d4 Mon Sep 17 00:00:00 2001 From: Nikita Maslov <51367582+Nikmas-creator@users.noreply.github.com> Date: Fri, 7 Aug 2020 12:00:03 +0300 Subject: [PATCH 2/3] Fixed generate command count parameter limitations and eslint error --- src/service/cli/generate.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/service/cli/generate.js b/src/service/cli/generate.js index 7c3bd73..301f8d2 100644 --- a/src/service/cli/generate.js +++ b/src/service/cli/generate.js @@ -80,14 +80,21 @@ const generateOffers = (count) => ( module.exports = { name: `--generate`, - async run(args) { + run(args) { const [count] = args; - const countOffer = Number.parseInt(count, 10) || DEFAULT_COUNT; + let countOffer = Number.parseInt(count, 10) || DEFAULT_COUNT; + + if (countOffer < 1) { + countOffer = DEFAULT_COUNT; + } else if (countOffer > 1000) { + console.error(chalk.red(`Не больше 1000 объявлений`)); + return; + } const content = JSON.stringify(generateOffers(countOffer)); fs.writeFile(FILE_NAME, content, (err) => { if (err) { - return console.error(`Can't write data to file...`); + return console.error(chalk.red(`Can't write data to file...`)); } return console.info(`Operation success. File created.`); From 46b84c0d33feceaeaa6f8b3c1dd0138142a39ce5 Mon Sep 17 00:00:00 2001 From: Nikita Maslov <51367582+Nikmas-creator@users.noreply.github.com> Date: Fri, 7 Aug 2020 18:38:48 +0300 Subject: [PATCH 3/3] hope it's final fix --- src/service/cli/generate.js | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/service/cli/generate.js b/src/service/cli/generate.js index 301f8d2..5ddf19f 100644 --- a/src/service/cli/generate.js +++ b/src/service/cli/generate.js @@ -4,9 +4,9 @@ const { getRandomInt, shuffle, } = require(`../../utils`); - const fs = require(`fs`); const chalk = require(`chalk`); +const {ExitCode} = require(`../../constants`); const DEFAULT_COUNT = 1; const FILE_NAME = `mocks.json`; @@ -88,16 +88,18 @@ module.exports = { countOffer = DEFAULT_COUNT; } else if (countOffer > 1000) { console.error(chalk.red(`Не больше 1000 объявлений`)); - return; + process.exit(ExitCode.error); } const content = JSON.stringify(generateOffers(countOffer)); fs.writeFile(FILE_NAME, content, (err) => { if (err) { - return console.error(chalk.red(`Can't write data to file...`)); + console.error(chalk.red(`Can't write data to file...`)); + process.exit(ExitCode.error); } - return console.info(`Operation success. File created.`); + console.info(`Operation success. File created.`); + process.exit(ExitCode.success); }); } };