Web API для тестового задания на ASP.NET
Задание реализовано с уточнениями, описанными ниже
-
Реализован API на ASP.NET 6
-
Реализована поддержка docker-compose (см. "Локальный запуск")
-
API задокументирован с помощью
Swagger
-
Проект структурирован по принципам
clean architecture
-
Используется
CQRS
черезMediatR
-
В качестве ORM используется
Entity Framework Core
, в качестве СУБДPostgreSql
-
Аутентификация реализована через
JWT
токены -
Используется
Redis
для хэширования -
Написаны модульные и интеграционные тесты
- Модульные тесты с помощью
xUnit
иFluentAssertions
- Интеграционные с помощью
testcontainters
(иrespawn
) (поэтому нужен докер для их прогонки)
- Модульные тесты с помощью
- Авторизация реализована через JWT токены
- Методы связанные с авторизацией перенесены в AuthorizationController, а именно регистрация, аутентификация, обновление токенов и завершение сессий
- + Изменение логина и пароля, потому что была выделена отдельная сущность
UserAccount
(Аккаунт пользователя
), которая содержит данные для авторизации - Так как была реализована JWT авторизация, при проверке правил авторизации не проверяется активен ли авторизованный пользователь, так как подразумевается, что если токен актуален, то и пользователь активен. При попытке авторизации неактивного пользователя вылетает ошибка
- В сущности
user
столбецuser_password
был перенесен вuser_account
и разделён следующим образом:user_account_passwordHash
иuser_account_passwordSalt
. Сделано это для того, чтобы хранить пароли в БД в захэшированном виде
- Самый первый админ в БД создается с логином =
Admin
, а пароль его конфигурируется (см. DbInitExecutor.cs) - Дефолтный пароль "
AdminPassword
"
Значение в docker-compose = "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 авторизации
-
git clone https://github.com/Skye7012/UserApiTestTask.git
-
cd UserApiTestTask
-
docker-compose build
-
docker-compose up
{
"login": "Admin",
"password": "Admin"
}
Volumes для БД будет создан на уровень выше корневой директории