Привет!
Разрабатывается и тестируется в последней Ubuntu LTS.
Если вы работаете в windows и есть gmail аккаунт, работу можно протестировать в бесплатных облаках google.
https://shell.cloud.google.com/
All virtual users finished
Summary report @ 06:17:28(+0300) 2021-07-07
Scenarios launched: 4800
Scenarios completed: 1800
Requests completed: 11018
Mean response/sec: 35.96
Response time (msec):
min: 0
max: 9854
median: 1713.5
p95: 6652
p99: 8115.3
Scenario counts:
Check Users: 4800 (100%)
Codes:
200: 9196
201: 1822
Errors:
ETIMEDOUT: 3000
All virtual users finished
Summary report @ 06:37:07(+0300) 2021-07-07
Scenarios launched: 4800
Scenarios completed: 1800
Requests completed: 11046
Mean response/sec: 35.98
Response time (msec):
min: 0
max: 9987
median: 7
p95: 103
p99: 5761.8
Scenario counts:
Check Users: 4800 (100%)
Codes:
200: 9218
201: 1828
Errors:
ETIMEDOUT: 3000
Log file: report.json
Нужно установить docker и docker-compose.
Клонировать проект. Ветка dev уже установлена по умолчанию.
В каталоге Task-9-NestJS выполнить.
$ docker-compose up --build
Ожидаемый результат
Чтобы проверить работу, можно запустить тесты
$ npm run test:auth
Чтобы запускать миграции c локального хоста, нужно в /etc/hosts прописать. (В данном случае, это не требуется. Миграции запускаются в контейнере при старте.)
127.0.0.1·postgres
^CTRL + C
$ docker-compose rm
Можно удалить и ренее созданные объекты docker
$ docker system prune -a
$ docker container prune
$ docker image prune -a
$ docker volume prune
$ docker network prune
$ yarn db:drop
$ yarn db:create CreateMigrations
$ yarn db:migrate
$ yarn db:seed
✔️ Guards должны использоваться для работы с авторизацией/аутентификацией +30 баллов
✔️ В приложении должны использоваться модули для разбиения структуры приложения на различные части (User, Board, Task) +30 баллов
✔️ Exception filters должны использоваться для обработки исключений в приложении +30 баллов
✔️ @nestjs/typeorm должен использоваться для работы с базой данных +30 баллов
✔️ Для логирования может использоваться встроенный Logger или кастомная имплементация. +30 баллов
- Логируются в консоль реквесты к users,tasks,boards.
- Ошибки типа error записываются в файл логов с ошибками.
✔️ Все внешние зависимости для модулей/классов должны предоставляться с помощью механизма dependency injection. +30 баллов
✔️ В зависисимости от env переменной USE_FASTIFY Nest.js должен использовать или express или fastify +30 баллов
✔️ Необходимо сравнить производительность Nest.js с использованием express и fastify (можно использовать для этих целей artillery) +30 баллов
✔️ Наличие изменений в тестах либо в workflow минус 200 баллов
✔️ Внесение изменений в репозиторий после дедлайна не считая коммиты, вносящие изменения только в Readme.md и другую документацию) минус 30% от максимального балла за задание (для этого задания 72 балла)
✔️ За отсутствие отдельной ветки для разработки -20 баллов
✔️ За отсутствие Pull Request -20 баллов
✔️ За неполную информацию в описании Pull Request (отсутствует либо некорректен один из 3 обязательных пунктов) -10 баллов
✔️ За каждую ошибку линтера при запуске npm run lint на основе локального конфига -5 баллов (именно errors, не warnings)
✔️ За каждый непроходящий тест npm run test:auth -20 баллов
✔️ Меньше 3 коммитов (не считая коммиты, вносящие изменения только в Readme.md и другую документацию) — -20 баллов
$ curl \
-d '{"login": "admin",
"password": "admin"}' \
-H "Content-Type: application/json" \
-X POST localhost:4000/login \
| python -m json.tool
Возвращает токен:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Ijc1MWI0Yjg0LWFjNDItNDQ1NS1iZjZkLWQ5OWMzNmMzOWQ4MiIsImxvZ2luIjoiYWRtaW4iLCJwYXNzd29yZCI6IiQyYSQxMCR1NkFBN3ZybFRlbEtyMnluZjhMeHVPYlB1MmZUNGc0aWhWVThCR3VFM1dLMlNJWWFFL1ZsLiIsImlhdCI6MTYyNDcwNjIwNn0.UDq8dBHsEPHIVgOrQ093egunpV_QlUhPhrYt1i4ii6s"
}
$ export TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6Ijc1MWI0Yjg0LWFjNDItNDQ1NS1iZjZkLWQ5OWMzNmMzOWQ4MiIsImxvZ2luIjoiYWRtaW4iLCJwYXNzd29yZCI6IiQyYSQxMCR1NkFBN3ZybFRlbEtyMnluZjhMeHVPYlB1MmZUNGc0aWhWVThCR3VFM1dLMlNJWWFFL1ZsLiIsImlhdCI6MTYyNDcwNjIwNn0.UDq8dBHsEPHIVgOrQ093egunpV_QlUhPhrYt1i4ii6s
$ curl \
-d '{"name": "user",
"login": "user",
"password": "user"}' \
-H "Content-Type: application/json" \
-H "authorization: Bearer ${TOKEN}" \
-X POST localhost:4000/users \
| python -m json.tool
возвращает:
{
"id": "705ca36e-b7db-4aca-9e1d-199422f83f59",
"login": "user",
"name": "user"
}
$ curl -s -o /dev/null -w "%{http_code}" \
-H "Content-Type: application/json" \
-X GET localhost:4000/users
Результат - Unauthorized:
401
$ curl -s -o /dev/null -w "%{http_code}" \
-H "Content-Type: application/json" \
-X GET localhost:4000/users \
-H "authorization: Bearer ABCDEFGH"
Результат - Unauthorized:
401
$ curl \
-H "Content-Type: application/json" \
-X GET localhost:4000/users \
-H "authorization: Bearer ${TOKEN}" \
| python -m json.tool
Результат:
[
{
"id": "751b4b84-ac42-4455-bf6d-d99c36c39d82",
"login": "admin",
"name": "admin"
},
{
"id": "705ca36e-b7db-4aca-9e1d-199422f83f59",
"login": "user",
"name": "user"
}
]
Повторяем, чтобы проверить код
$ curl -s -o /dev/null -w "%{http_code}" \
-H "Content-Type: application/json" \
-X GET localhost:4000/users \
-H "authorization: Bearer ${TOKEN}" \
| python -m json.tool
Результат - OK:
200
$ curl -s -o /dev/null -w "%{http_code}" \
-d '{"login": "fake",
"password": "fake"}' \
-H "Content-Type: application/json" \
-X POST localhost:4000/login
Возвращает Forbidden:
403
$ export USER_ID=d55f78af-5ac1-459f-b376-6a50e086aee3
// GET USER BY ID
$ curl \
-H "Content-Type: application/json" \
-X GET localhost:4000/users/${USER_ID} \
-H "authorization: Bearer ${TOKEN}" \
| python -m json.tool
$ npm install -g @nestjs/cli
$ npm install -g typescript
$ cd app/server
$ nest new .
$ nest generate resource users
$ nest generate resource tasks
$ nest generate resource boards
$ nest generate resource login
$ yarn add typeorm bcryptjs pg
$ yarn add @nestjs/typeorm
$ npm install -g artillery@latest\
$ artillery --version
// $ DEBUG=http:response artillery run artillery.yml --output report.json
$ artillery run artillery.yml --output report.json
$ artillery report report.json
Или загрузить файл на сайт: