Skip to content

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

Notifications You must be signed in to change notification settings

Skye7012/UserApiTestTaskVk

Repository files navigation

UserApiTestTaskVk

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

Table Of Contents

ТЗ

image

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

Реализован API на ASP.NET 6
Реализованы основные и опциональные требования с уточнениями в реализации, описанными ниже

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

API задокументирован с помощью Swagger
Проект структурирован по принципам clean architecture
Используется CQRS через MediatR
В качестве ORM используется Entity Framework Core, в качестве СУБД PostgreSql
Аутентификация реализована через JWT токены

Написаны модульные тесты с помощью xUnit и FluentAssertions

Уточнения по реализации основных требований:

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

  • В сущности user столбец user_password разделён на user_passwordHash и user_passwordSalt, чтобы хранить пароли в БД в захэшированном виде

Ограничение на одного администратора

  • Требование не иметь более одного пользователя с user_group.code = "Admin" реализовано путем инициализации пользователя-админа в БД автоматически (см. DbInitExecutor.cs)
  • Логин пользователя-администратора = "Admin", не конфигурируется
  • Пароль можно сконфигурировать (по дефолту "AdminPassword")
    Значение в docker-compose = "Admin" (см. Учетные данные администратора)

Lock in SignUp

  • Лок при регистрации с задержкой на 5 секунд реализован с помощью библиотеки DistributedLock
  • Время задержки (5 секунд) может конфигурироваться через appSettings

SoftDelete, Metadata

  • Было реализовано мягкое удаление для Пользователя через BlockedUserState, но также был реализован общий интерфейс ISoftDeletable для сущностей, поддерживающих мягкое удаление
  • Поле created_date так же было принято использовать для всех сущностей

Controllers

  • Эндпоинты были разделены по 2 контроллерам: User и Authorization
  • В Authorization находятся все методы, связанные с аутентификацией, учетными данными пользователя

Авторизация

  • К эндпоинтам применены следующие ограничения:
    • Получить список пользователей может только администратор
    • Получить данные пользователя, удалить пользователя, изменить логин пользователя, изменить пароль пользователя, завершить все сессии пользователя может либо администратор, либо лично пользователь, если он активен
    • На регистрацию, аутентификацию, обновления токена ограничений нет

Уточнения по реализации опциональных требований:

Авторизация

  • Реализована не Basic-авторизация, а JWT-авторизация

Пагинация

  • Реализована пагинация и сортировка для получения нескольких пользователей

Unit-тесты

  • Написаны unit-тесты с помощью xUnit

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

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

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

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