Skip to content

Web API для тестового задания на ASP.NET

Notifications You must be signed in to change notification settings

Skye7012/UserApiTestTask

Repository files navigation

UserApiTestTask

Web API для тестового задания на ASP.NET

Table Of Contents

ТЗ

image

Общее описание

Задание реализовано с уточнениями, описанными ниже

  • Реализован API на ASP.NET 6

  • Реализована поддержка docker-compose (см. "Локальный запуск")

  • API задокументирован с помощью Swagger

  • Проект структурирован по принципам clean architecture

  • Используется CQRS через MediatR

  • В качестве ORM используется Entity Framework Core, в качестве СУБД PostgreSql

  • Аутентификация реализована через JWT токены

  • Используется Redis для хэширования

  • Написаны модульные и интеграционные тесты

    • Модульные тесты с помощью xUnit и FluentAssertions
    • Интеграционные с помощью testcontaintersrespawn) (поэтому нужен докер для их прогонки)

Уточнения по реализации:

Авторизация

  • Авторизация реализована через JWT токены
  • Методы связанные с авторизацией перенесены в AuthorizationController, а именно регистрация, аутентификация, обновление токенов и завершение сессий
  • + Изменение логина и пароля, потому что была выделена отдельная сущность UserAccount (Аккаунт пользователя), которая содержит данные для авторизации
  • Так как была реализована JWT авторизация, при проверке правил авторизации не проверяется активен ли авторизованный пользователь, так как подразумевается, что если токен актуален, то и пользователь активен. При попытке авторизации неактивного пользователя вылетает ошибка

Поле user_password сущности user

  • В сущности user столбец user_password был перенесен в user_account и разделён следующим образом: user_account_passwordHash и user_account_passwordSalt. Сделано это для того, чтобы хранить пароли в БД в захэшированном виде

Первый Admin

Метаданные создания, обновления и удаления

  • Метаданные создания, обновления есть у всех сущностей, а метаданные удаления у сущностей поддерживающих мягкое удаление
  • Так как в JWT Токене для валидности данных используются клеймы user_id и user_account_id. Было принято решение использовать Redis для хэширования логина по user_account_id для заполнения полей created_by, modified_by, revoked_by
  • Однако все равно возникает проблема из-за метода изменение логина: в данном сценарии при изменении логина придется во всех сущностях искать и менять поля метаданных ..._by на новый логин. Это сложная операция и тут появляется проблема, которую нужно решить либо убиранием метода смены логина, либо сменой значений полей ..._by на user_account_id, а не login. Несмотря на сильные отклонения от ТЗ, этот момент я уже решил не менять и оставить как есть

Эндпоинты

  • Создание пользователя — "/Authorization/SignUp"
  • 6 и 7 эндпоинты по получению данных о пользователя были реализованы в одном эндпоинте из-за JWT авторизации

Локальный запуск

Учетные данные пользователя-администратора:

{
  "login": "Admin",
  "password": "Admin"
}

Volumes для БД будет создан на уровень выше корневой директории