Необходимо реализовать API приложение на ASP.NET Core (5 или более поздняя версия).
Требования бизнес-логики и ограничения:
- Формат запроса/ответа должен быть JSON.
- В качестве СУБД необходимо использовать PostgreSQL.
- В качестве ORM необходимо использовать EntityFrameworkCore.
- В качестве моделей данных должны использоваться следующие сущности:
- user (id, login, password, created_date, user_group_id, user_state_id)
- user_group (id, code, description) Возможные значения для code (Admin, User)
- user_state (id, code, description) Возможные значения для code (Active, Blocked)
- Приложение должно позволять добавлять/удалять/получать пользователей. Получить можно как одного, так и всех пользователей (добавление, удаление только по одному). При получении пользователей должна возвращаться полная информация о них (с user_group и user_state).
- Система должна не позволять иметь более одного пользователя с user_group.code="Admin".
- После успешной регистрации нового пользователя, ему должен быть выставлен статус "Active". Добавление нового пользователя должно занимать 5 сек. За это время при попытке добавления пользователя с таким же login должна возвращаться ошибка.
- Удаление пользователя должно осуществляться не путём физического удаления из таблицы, а путём выставления статуса "Blocked" у пользователя.
- Допускается добавлять вспомогательные данные в существующие таблицы.
- В качестве способа авторизации следует использовать Basic-авторизацию.
- Реализовать пагинацию для получения нескольких пользователей.
- Написать unit-тесты с помощью xUnit
- Реализован CRUD для работы с пользователем (поиск, постраничное получение пользователей, удаление, добавление)
- При удалении пользователю выставляется статус "Blocked"
- Методы для работы с пользователем асинхронны
- В качестве ORM используется EFCore
- В качестве БД используется PostgreSQL
- Для регистрации входа в систему используется Basic авторизация
- Все методы контроллеров покрыты тестами (используется XUnit + Moq)
- Все методы контроллеров обладают XML комментариями, для автоматической генерации документации в Swagger
- Добавление пользователя искусственно замедленно (при попытке добавить нового пользователя с занятым login, выдается ошибка Auth.AlreadyExistedUser)
- Добавлена возможность динамически менять максимальное количество администраторов через Options
- Обработка доменных ошибок (занятый login, лимит по количеству администраторов) в приложении осуществлена при помощи библиотеки ErrorOr
- Версионирование API при помощи встроенных инструментов в ASP.NET Core
Чтобы запустить приложение, выполните следующие шаги:
- Склонируйте репозиторий с помощью Git командой:
git clone https://github.com/GonarchX/VKTestBackendTask.git
- Зайдите в директорию
deploy
- Выполните команту "docker-compose up -d" для запуска контейнера с PostgreSQL
- Зайдите в директорию
VKTestBackendTask.Api
- Выполните команду
dotnet ef database update
, которая создаст базу данных и таблицы в соответствии с миграциями - Установите необходимые пакеты и зависимости с помощью команды
dotnet restore
- Запустите приложение с помощью команды
dotnet run
- Откройте в браузере, указанный в консоли адрес (по-умолчанию https://localhost:7233) с путем "/swagger" так, чтобы получившийся адрес выглядел следующим образом: https://localhost:7233/swagger
- Перед вами откроется Swagger, первым делом, необходимо вызвать метод по пути
/api/v1/develop
в секции InitApp, для первоначального заполнения базы данных (добавляются все необходимые user_state(Active, Blocked) и user_group(Admin, User). Повторный вызов метода повторно заполнит базу данных - Зарегистрируйтесь в качестве администратора по пути
/api/v1/auth/registerAsAdmin
- Нажмите на зеленую кнопку "Authorize" в правом верхнем углу, введите ваши личные данные, которые вы использовали для регистрации в качестве администратора.
Таким образом, вы добавите заголовок "Authorization" со значением ваших данных в соответствии с Basic авторизацией. Это необходимо для работы с методами в секции User
Для изменения максимального количества администраторов измените значения поля MaxAdminsCount
внутри appsettings.json