Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: backend 1 ready #1

Merged
merged 2 commits into from
Sep 13, 2023
Merged

feat: backend 1 ready #1

merged 2 commits into from
Sep 13, 2023

Conversation

b0iii2c0de
Copy link
Owner

No description provided.

@denizen24
Copy link

denizen24 commented Sep 6, 2023

Резюме:

Для сдачи работы необходимо набрать от 80 баллов. Все итерации сдаются в одном pull request.

💬️ Вы можете обратиться за разъяснениями по проверке ко мне — напишите в комментариях под этим резюме (обычно отвечаю в течении дня). Если ошибка понятна, но нужна помощь с поиском решения, лучше обратиться к наставнику.

Backend

🚦️ Проверяются только файлы, которые попали в PR.

Критерии, влияющие на работоспособность

  • В репозитории есть все необходимые инфраструктурные файлы:
    • в проекте есть package.json;
    • .editorconfig;
    • .eslintrc, расширяющий конфигурацию airbnb-base, а также необходимые для работы линтера dev-зависимости;
    • .gitignore.
    • в .eslintrc добавлено исключение для _id. Директивы eslint-disable, eslint-disable-line и eslint-disable-next-line запрещены.
  • Нет ошибок линтера. При выполнении команды npx eslint . они должны отсутствовать.
  • В разделе scripts файла package.json есть команды:
    • npm run start, которая запускает сервер на localhost:3000;
    • npm run dev, которая запускает сервер на localhost:3000 с хот релоудом.
  • Описанные роуты работают корректно:
    • запрос на GET /users/me возвращает информацию о пользователе (email и имя);
    • PATCH /users/me — обновляет информацию о пользователе;
    • GET /movies — все сохранённые пользователем фильмы;
    • POST /movies — создаёт фильм с переданными в теле данными;
    • DELETE /movies/movieId — удаляет сохранённый фильмы по _id;
    • POST /signup — создаёт пользователя с переданными в теле данными;
    • POST /signin — возвращает JWT, если в теле запроса переданы правильные почта и пароль.
    • Если вы сохраняете JWT в куках, роут /signout должен удалять JWT из куки.
  • Пользователь не может удалить сохранённый фильм из профиля другого пользователя.
  • Все роуты, кроме /signin и /signup, защищены авторизацией.
  • Роуты пользователей и роуты фильмов описаны в отдельных файлах.
  • Ошибки API обрабатываются:
    • используются статус-коды ошибок: 400, 401, 403, 404, 409, 500;
    • если в запросе что-то не так, сервер возвращает статус ответа, который соответствует типу ошибки;
      • сообщение об ошибке соответсвует ее типу;
    • асинхронные обработчики завершены блоком catch;
    • API не возвращает стандартных ошибок базы данных или Node.js.
  • Реализовано бережное хранение пароля:
    • пароль хранится в виде хеша;
    • API не возвращает хеш пароля клиенту.
  • Валидация реализована верно:
    • Запрос валидируется перед передачей контроллеру. Тело и, где необходимо, заголовки и параметры проверяются по соответствующим схемам. Если запрос не соответствует схеме, обработка не передаётся контроллеру, и клиент получает ошибку валидации.
    • Данные валидируются перед добавлением в базу.
  • В production-режиме адрес базы данных берётся из process.env.
  • К серверу можно обратиться по https по адресу домена, указанному в README.md.
  • Правильно реализовано хранение секретного ключа для создания JWT:
    • для продакшн сборки он хранится в .env файле — этот файл не добавляется в git;
    • в режиме разработки (при process.env.NODE_ENV !== 'production') код запускается и работает и без .env файла.

Хорошие практики

  • Все роуты подключены в файле index.js, который находится в папке routes. Оттуда единый роут подключается в файле app.js.
  • Асинхронные операции реализованы промисами или async/await.
  • Валидация описана в отдельном модуле.
  • Настроено логгирование:
    • запросы и ответы записываются в файл request.log;
    • ошибки записываются в файл error.log;
    • файлы логов не добавляются в репозиторий.
  • Ошибки обрабатываются централизованным обработчиком.
  • Централизованный обработчик ошибок описан в отдельном модуле.
  • API размещено на отдельном поддомене, например api.movies-explorer.nomoreparties.co или API приложения располагается на домене вида: name.zone/api, а не просто name.zone

Рекомендации

  • Для ошибок API созданы классы, расширяющие конструктор Error.
  • Используется модуль Helmet для установки заголовков, связанных с безопасностью.
  • Конфигурация и константы в отдельных файлах:
    • адрес Mongo-сервера в режиме разработки вынесен в отдельный конфигурационный файл;
    • сообщения ответов и ошибок (константы приложения) вынесены в отдельный файл с константами.
  • Настроен rate limiter: число запросов с одного IP в единицу времени ограничено.
  • Rate limiter сконфигурирован в отдельном файле и импортируется в app.js.
  • Для имени базы данных используется bitfilmsdb.

Количество баллов: 83

⚠️ Не удаляйте это резюме. Удаление усложнит и замедлит повторные проверки.

@b0iii2c0de b0iii2c0de merged commit f48a0dc into main Sep 13, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants