Skip to content
Open

Es7 #75

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions ,github/workflows/main.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: Publish Docker

on:
push:
branches: [main]

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@main
- name: Publish to registry
uses: elgohr/Publish-Docker-Github-Action@v4
with:
registry: docker.pkg.github.com
name: docker.pkg.github.com/pestsov-v/node-js-without-frameworks/v2.0.0
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
tags: "develop"
6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

46 changes: 46 additions & 0 deletions .idea/workspace.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 90 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Создание приложений на Node.js без фреймворков

Данное приложение затрагивает реализацию как интерфейса командной строки (command line interface - далее CLI), графический
интерфейс (Graphic user interface - далее GUI), проще говоря - frontend часть сайта так и набор эндпоинтов (application programming interface - далее API),
проще говоря Backend часть сайта.

Приложение написано на JavaScript ES5 синтаксисе в без архитектурного стиля в первой версии. Переписано на ES7 синтаксис
со слоеной, модульной, архитектурой во второй версии. И переписано вновь уже на typescript в третьей версии приложения.

## Предназначение и стек технологий

Приложение предназначено для подробного описания и реализации приложений на Node.js без использования фреймворков, а также реализация
приложений на различных синтаксисах JavaScript и языке TypeScript
Стек технологий:
- платформа Node.js
- fs / path - для работы с файлами
- crypto - для шифрования паролей
- url - для работы с URL адресом запроса
- dns - для проверок существующих IP адресов сайтов
- os / v8 - для вывода статистики по работе системы
- readline - для создания CLI
- child_process - для создания отдельного процесса под тяжелые задачи
- zlib - для сжатия файлов логирования
- http / https - для взаимодействия backend и frontend части посредством работы с протоколами
- util - для создания различных debug режимов, для разделения обработки ошибок в различных частях системы

## Запуск приложения

Предлагается три варианта запустить и протестировать приложение: Запуск через архив на хост машине,
и запуск непосредственно через Heroku instance (при запуске через Heroku будет запущена обрезанная версия приложения - без CLI и работы с API).

### Запуск на хост машине

Чтобы запустить приложение на локальной хост машине, необходимо скачать проект из Git-репозитория и разархивировать его, после чего:
- Если версия проекта v1.0.0 или v2.0.0, то зайти в папку server и запустить проект с помощью команды: `node index.js`.
- Если версия проекта v3.0.0, то зайти в папку server и запустить проект с помощью команды: `npm run dev`.

### Запуск через Heroku

Перейти по ссылке.

## Оглавление
- [Создание приложений на Node.js без фреймворков](#создание-приложений-на-nodejs-без-фреймворков)
- [Предназначение и стек технологий](#предназначение-и-стек-технологий)
- [Запуск приложения](#запуск-приложения)
- [Запуск на хост машине](#запуск-на-хост-машине)
- [Запуск через Heroku](#запуск-через-heroku)
- [Оглавление](#оглавление)
- [v1.0.0 - JavaScript ES5](#v100---javascript-es5)
- [v2.0.0 - JavaScript ES7](#v200---javascript-es7)
- [v3.0.0 - TypeScript](#v300---typescript)
- [API](#api)
- [Command line interface (CLI)](#command-line-interface-cli)
- [Graphical user interface (GUI)](#graphical-user-interface-gui)

## [v1.0.0 - JavaScript ES5](wiki/v1.0.0.md)

Здесь описан краткий обзор версии. Чтобы посмотреть полную информацию о версии нажмите: [v1.0.0 - JavaScript ES5](wiki/v1.0.0.md)

Топорный вариант работы, когда весь модуль находится в одном файле. Использование var, а главный архитектурный вариант работы - создание
объектов - контейнеров, куда как свойства добавляются методы - анонимные функции-callback.

Результат? Разработка проходит быстро и топорно, но само приложение является абсолютно не масштабируемым, поскольку через больше становится
глобальные объекты - контейнеры, тем сложнее поддерживать его зависимости.



## [v2.0.0 - JavaScript ES7](wiki/v2.0.0.md)

Здесь описан краткий обзор версии. Чтобы посмотреть полную информацию о версии нажмите: [v2.0.0 - JavaScript ES7](wiki/v2.0.0.md)

Архитектурный вариант, когда сущности разделены, а каждый элемент сущности выведен в отдельный свой файл. Простым языком, если в первой версии
все сущности были внутри одного объекта - контейнера, то теперь каждая сущность - это отдельная ветка с кодом. Сам код является слоёным:
все константы и строковые значения вынесены в отдельным файл, работа с базой данных или файловой системой в файл сервиса, который реализовывает только эту логику
и т.д.

Результат? Разработка проходит средне по времени, но само приложение является масштабируемым, поскольку сущности и функционал разделен как и файлами, так и классами.

## [v3.0.0 - TypeScript](wiki/v3.0.0.md)

Здесь описан краткий обзор версии. Чтобы посмотреть полную информацию о версии нажмите: [v3.0.0 - TypeScript](wiki/v3.0.0.md)

Больше типизации и возможность масштабировать приложение? TypeScript это предоставляет, проверяя все входящие данные и результат выполнения функций. Таким образом позволяя
организовать более производительный код из-за большей работы Turbofan интерпретатора и нормализации bytecode.

## API

## Command line interface (CLI)

## Graphical user interface (GUI)
4 changes: 2 additions & 2 deletions server/config/variables.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ env.staging = {
};

env.testing = {
httpPort: 4010,
httpsPort: 4011,
httpPort: 4012,
httpsPort: 4013,
envName: "staging",
hashingSecret: "ThisIsSecret",
maxChecks: 5,
Expand Down
2 changes: 1 addition & 1 deletion server/data/checks/5w1lnrzfxpiton97vlop.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"id":"5w1lnrzfxpiton97vlop","userPhone":"1234567890","protocol":"http","url":"22.com","method":"get","code":[200,201],"time":1,"state":"down","lastChecked":1654013853778}
{"id":"5w1lnrzfxpiton97vlop","userPhone":"1234567890","protocol":"http","url":"22.com","method":"get","code":[200,201],"time":1,"state":"down","lastChecked":1654778635729}
2 changes: 1 addition & 1 deletion server/data/checks/ehc676fk8musszifow4a.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"id":"ehc676fk8musszifow4a","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654013853490}
{"id":"ehc676fk8musszifow4a","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654778635203}
2 changes: 1 addition & 1 deletion server/data/checks/se910nfq1x8xr9bo64jz.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"id":"se910nfq1x8xr9bo64jz","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654013853490}
{"id":"se910nfq1x8xr9bo64jz","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654778635203}
1 change: 0 additions & 1 deletion server/data/logs/5w1lnrzfxpiton97vlop-1654013853294.gz.b64

This file was deleted.

2 changes: 1 addition & 1 deletion server/data/logs/5w1lnrzfxpiton97vlop.log
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"check":{"id":"5w1lnrzfxpiton97vlop","userPhone":"1234567890","protocol":"http","url":"22.com","method":"get","code":[200,201],"time":1,"state":"down","lastChecked":1654013847274},"outcome":{"error":false,"responseCode":308},"state":"down","alert":false,"timeOfCheck":1654013853778}
{"check":{"id":"5w1lnrzfxpiton97vlop","userPhone":"1234567890","protocol":"http","url":"22.com","method":"get","code":[200,201],"time":1,"state":"down","lastChecked":1654764249334},"outcome":{"error":false,"responseCode":308},"state":"down","alert":false,"timeOfCheck":1654778635729}
1 change: 0 additions & 1 deletion server/data/logs/ehc676fk8musszifow4a-1654013786767.gz.b64

This file was deleted.

1 change: 0 additions & 1 deletion server/data/logs/ehc676fk8musszifow4a-1654013853294.gz.b64

This file was deleted.

2 changes: 1 addition & 1 deletion server/data/logs/ehc676fk8musszifow4a.log
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"check":{"id":"ehc676fk8musszifow4a","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654013847763},"outcome":{"error":false,"responseCode":301},"state":"down","alert":false,"timeOfCheck":1654013853489}
{"check":{"id":"ehc676fk8musszifow4a","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654764249018},"outcome":{"error":false,"responseCode":301},"state":"down","alert":false,"timeOfCheck":1654778635203}
1 change: 0 additions & 1 deletion server/data/logs/se910nfq1x8xr9bo64jz-1654013786767.gz.b64

This file was deleted.

1 change: 0 additions & 1 deletion server/data/logs/se910nfq1x8xr9bo64jz-1654013853294.gz.b64

This file was deleted.

1 change: 1 addition & 0 deletions server/data/logs/se910nfq1x8xr9bo64jz-1654778635027.gz.b64
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
H4sIAAAAAAAACmWQsW7DMAxE934GZyGQZNmpvPoD0j3o4Mq0nVY2XYlBgwb+91ItkKUjj8d3B94hzBg+oL3DZYAWMnqj1/HT3J5vyb9R496/QcE1Y3qZaUWxVL4yVuvaeVlsiZgCRdFn5q1YUxkmoiniIdAi0oI8U6FPyDIGGoRzFoay2rwq4MsiglWQuecSMdDXKsbYZ+5KPZRj09Tu2DjrbH2sdgV0ZaFjaY4pUYJ27GNGBQnzRmvG7jem0mb/B+4jJn4clPjT2P394RHjtfH70w/hX7y2IAEAAA==
2 changes: 1 addition & 1 deletion server/data/logs/se910nfq1x8xr9bo64jz.log
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"check":{"id":"se910nfq1x8xr9bo64jz","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654013846975},"outcome":{"error":false,"responseCode":301},"state":"down","alert":false,"timeOfCheck":1654013853490}
{"check":{"id":"se910nfq1x8xr9bo64jz","userPhone":"3931200549","protocol":"http","url":"google.com","method":"get","code":[200,201],"time":2,"state":"down","lastChecked":1654764249019},"outcome":{"error":false,"responseCode":301},"state":"down","alert":false,"timeOfCheck":1654778635202}
9 changes: 9 additions & 0 deletions server/src/core/color.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const RED = "\x1b[31m%s\x1b[0m";
const GREEN = "\x1b[32m%s\x1b[0m";

const color = {
red: RED,
green: GREEN,
};

module.exports = color;
7 changes: 7 additions & 0 deletions server/src/core/tester/tester.constants.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
exports.START_REPOST_MESSAGE = "НАЧАЛО ОТЧЁТА ТЕСТИРОВАНИЯ";
exports.END_REPOST_MESSAGE = "КОНЕЦ ОТЧЁТА ТЕСТИРОВАНИЯ";
exports.START_ERRORS_MESSAGE = "НАЧАЛО ДЕТАЛЕЙ ВОЗНИКШИХ ОШИБОК";
exports.END_ERRORS_MESSAGE = "КОНЕЦ ДЕТАЛЕЙ ВОЗНИКШИХ ОШИБОК";
exports.TOTAL_TEST_MESSAGE = "Всего тестов: ";
exports.PASS_MESSAGE = "Успешно пройденых: ";
exports.FAIL_MESSAGE = "Не пройденых: ";
15 changes: 15 additions & 0 deletions server/src/core/tester/tester.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const http = require("http");

const TesterHelper = require("./tester.helper");

class TesterController {
getRequest(path, callback) {
const reqDetails = TesterHelper.makeGetRequest(path);
const req = http.request(reqDetails, (res) => {
callback(res);
});
req.end();
}
}

module.exports = new TesterController();
8 changes: 8 additions & 0 deletions server/src/core/tester/tester.files.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
const { unit, user } = require("../../modules/api/user/tests/tests.index");

tests = {};

tests.unit = unit;
tests.user = user;

module.exports = tests;
15 changes: 15 additions & 0 deletions server/src/core/tester/tester.graphic.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
class TesterGraphic {
emptyLine() {
console.log("");
}

headerLine(header) {
console.log(`--------------------${header}--------------------`);
}

resultLine(message, result) {
console.log(message, result);
}
}

module.exports = new TesterGraphic();
55 changes: 55 additions & 0 deletions server/src/core/tester/tester.helper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
const config = require("../../../config/variables.config");
const color = require("../color");
const TesterGraphic = require("./tester.graphic");

const {
START_REPOST_MESSAGE,
START_ERRORS_MESSAGE,
END_ERRORS_MESSAGE,
END_REPOST_MESSAGE,
TOTAL_TEST_MESSAGE,
PASS_MESSAGE,
FAIL_MESSAGE,
} = require("./tester.constants");

class TesterHelper {
makeGetRequest(path) {
const requestDetails = {
protocol: "http:",
hostname: "localhost",
port: config.httpPort,
path: path,
headers: {
"Content-Type": "application/json",
},
};

return requestDetails;
}

produceTestReport(limit, successes, errors) {
TesterGraphic.emptyLine();
TesterGraphic.headerLine(START_REPOST_MESSAGE);
TesterGraphic.emptyLine();
TesterGraphic.resultLine(TOTAL_TEST_MESSAGE, limit);
TesterGraphic.resultLine(PASS_MESSAGE, successes);
TesterGraphic.resultLine(FAIL_MESSAGE, errors.length);
TesterGraphic.emptyLine();

if (errors.length > 0) {
TesterGraphic.headerLine(START_ERRORS_MESSAGE);
TesterGraphic.emptyLine();
errors.forEach(function (testError) {
console.log(color.red, testError.name);
console.log(testError.error);
TesterGraphic.emptyLine();
});
TesterGraphic.headerLine(END_ERRORS_MESSAGE);
}

TesterGraphic.headerLine(END_REPOST_MESSAGE);
process.exit(0);
}
}

module.exports = new TesterHelper();
5 changes: 5 additions & 0 deletions server/src/core/tester/tester.module.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
process.env.NODE_ENV = "testing";
const tests = require("./tester.files");
const TesterRunner = require("./tester.runner");

TesterRunner.runTests(tests);
Loading