Giter Site home page Giter Site logo

news-explorer-api's Introduction

news-explorer-api's People

Contributors

comediant24 avatar

Watchers

 avatar  avatar

news-explorer-api's Issues

Яндекс.Практикум: Проверка дипломной рабты

Здравствуйте. В репозиитории отсутствует оформленный PR с изменениями внесенными в рамках работы над заданием этапа.
Просьба создать PR к следующей итерации проверки.
Результат проверки ниже

Резюме:

Backend

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

  • В репозитории есть все необходимые инфраструктурные файлы:
    • в проекте есть package.json;
      В списке зависимостей присутствует неиспользуемый модуль cookie-parser. Необходимо задействовать его либо исключить из списка зависимостей
    • .editorconfig;
    • .eslintrc, расширяющий конфигурацию airbnb-base, а также необходимые для работы линтера dev-зависимости;
      Плывут отступы в конфигурационном файле линтера. Рекомендую их исправить.
      Это можно сделать, например при помощи автоматического исправления отступов в IDE ( Shift + Alt + F / Ctrl + Shift + I для VSCode в зависимости от используемой вами операционной системы)
    • .gitignore.
    • в .eslintrc добавлено исключение для _id _;
  • Нет ошибок линтера.
    В дипломной работе запрещено отключение или переопределение правил линтера (в т.ч при помощи inline-директив), за исключением no-underscore-dangle
    https://i.imgur.com/QGP795Z.png
  • В разделе scripts файла package.json:
    • есть команда npm run start, которая запускает сервер на localhost:3000;
    • и npm run dev, которая запускает сервер на localhost:3000 с хот релоудом.
  • Когда все зависимости установлены, приложение запускается командой npm run dev без ошибок.
  • Описанные роуты работают корректно:
    • запрос на GET /users/me возвращает информацию о пользователе (email и имя);

    • GET /articles — все сохранённые статьи;
      Метод должен возвращать только карточки созданные данным пользователем
      https://i.imgur.com/JNHzuYh.png

    • POST /articles создаёт статью с переданными в теле данными;
      В случае, если в методе создания публикации возникнет ошибка, отличная от ValidationError она не будет обработана, поскольку отсутствует
      обработчик в ветке по-умолчанию (когда ошибка не попадает ни под одно из условий)
      https://i.imgur.com/FshvQ1j.png

    • DELETE /articles/articleId удаляет статью по _id _;

    • POST /signup создаёт пользователя с переданными в теле данными;
      В случае если в методе создания пользователя возникнет ошибка MongoError - она будет обработана дважды.
      Первый раз в блоке if(...) {...} а затем ниже в next(...)
      Для того чтобы избежать этого оберните альтернативную ветку в else или добавьте остановку выполнения при помощи return
      https://i.imgur.com/JNHzuYh.png

    • POST /signin возвращает JWT, если в теле запроса переданы правильные почта и пароль.

  • Все роуты, кроме /signin и /signup, защищены авторизацией.
  • Роуты пользователей и роуты статей описаны в отдельных файлах.
  • Ошибки API обрабатываются:
    • если в запросе что-то не так, сервер возвращает ответ с ошибкой и её статусом;
    • асинхронные обработчики завершены блоком catch;
    • API не возвращает стандартных ошибок базы данных или Node.js.
  • В production-режиме адрес базы данных берётся из process.env.
  • Реализовано бережное хранение пароля:
    • пароль хранится в зашифрованном виде;
    • API не возвращает хеш пароля клиенту.
  • Данные валидируются перед добавлением в базу.
  • Пользователь не может удалить сохранённую карточку из профиля другого пользователя.
  • К серверу можно обратиться и по http, и по https, обращаясь к домену, указанному в README.md.
  • Правильно реализовано хранение секретного ключа для создания JWT:
    • для продакшн сборки он хранится в .env файле — этот файл не добавляется в git;
    • в режиме разработки (при process.env.NODE_ENV !== 'production') код запускается и работает и без .env файла.

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

  • Асинхронные операции реализованы промисами или async/await.
  • Запрос валидируется перед передачей контроллеру. Тело и, где необходимо, заголовки и параметры, проверяются по соответствующим схемам. Если запрос не соответствует схеме, обработка не передаётся контроллеру, и клиент получает ошибку валидации.
    Согласно требованиям задания отсутствует ограничение на длину поля password
  • Настроено логгирование:
    • запросы и ответы записываются в файл request.log;
      limiter подключен перед логгером запросов.
      Запросы, отклонённые лимитером, не будут добавлены в лог запросов. Необходимо первым в цепочке подключить логгер, а затем limiter
    • ошибки записываются в файл error.log;
    • файлы логов не добавляются в репозиторий.
  • Ошибки обрабатываются централизованным обработчиком.
  • Централизованный обработчик ошибок описан в отдельном модуле.
  • В случае ошибки API возвращает статус ответа, который соответствует типу ошибки.
  • К серверу можно обратиться по https по адресу домена, указанному в README.md.
  • API приложения располагается на домене вида: name.zone/api, а не просто name.zone
  • Все роуты подключены в файле index.js, который находится в папке routes. Оттуда единый роут подключается в файле app.js.

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

  • Для ошибок API созданы классы, расширяющие конструктор Error.
  • Используется модуль Helmet для установки заголовков, связанных с безопасностью.
  • Конфигурация и константы в отдельных файлах:
    • адрес Mongo-сервера в режиме разработки вынесен в отдельный конфигурационный файл;
    • секретный ключ для JWT в режиме разработки вынесен в отдельный конфигурационный файл;
    • константы приложения — сообщения ответов и ошибок — вынесены в отдельный файл с константами.
      Ряд сообщений ошибок определяется непосредственно в коде контроллера (на скриншоте приведено несколько примеров) или в модели данных
      https://i.imgur.com/A4Lsq2k.png
  • Настроен rate limiter: число запросов с одного IP в единицу времени ограничено.
  • rate limiter сконфигурирован в отдельном файле и импортируется в app.js
  • API размещено на отдельном поддомене, например: api.news-explorer.tk.

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

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.