Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/milovidov983/social-network-api


https://github.com/milovidov983/social-network-api

Last synced: 2 days ago
JSON representation

Awesome Lists containing this project

README

        

# social-network-api

## Требования

Разработать WebAPI сервис для соцсети, который позволяет сделать следующее:

- Зарегистрировать нового клиента. Клиент при регистрации указывает только имя. Имя должно состоять из букв и пробелов и быть не длиннее 64 символов
- Подписать одного клиента на другого
- Выбрать топ наиболее популярных клиентов. Вызывающий может указать требуемое количество записей

## Описание реализации

### Введение

Приложение состоит из 3-х проектов: сама Api и два проекта с тестами, юнит тесты и интеграционные.
100% покрытия тестами делать не стал, из того что написал, вероятно, можно будет сделать вывод о знакомстве с технологиями.

### Библиотеки

Для целей тестирования были задейстованы библиотеки: [XUnit](https://xunit.net), [AutoFixture](https://github.com/AutoFixture/AutoFixture), [Moq](https://github.com/Moq/moq4/).

Использованные библиотеки в основном приложении:

- Связующий паттерн посредник - библиотека [MediatR](https://github.com/jbogard/MediatR)
- Валидация входящих данных - библиотека [FluentValidation](https://fluentvalidation.net/)
- Доступ к данным - [Dapper](https://dapperlib.github.io/Dapper/) и самописный набор библиотек для типизации SQL запросов [DapperHelpers](https://github.com/milovidov983/DapperHelpers). Почему именно такой выбор, а не [EF](https://github.com/dotnet/efcore) например? Ответ состоит из двух частей, первая часть ответа находиться в введении README проекта [DapperHelpers](https://github.com/milovidov983/DapperHelpers), вторая часть ответа сотоит в том, что с ним я хуже знаком и мне проще оперировать чистым SQL, не переживая за то, что мне может наворотить ORM при построении запроса.

### Описание структуры проекта

Основное приложение разделено на три слоя:
- `Core`
- `Application`
- `Infrastructure`

#### Core

Слой `Core` находится в одноименной директории `Core` и содержит описание основных команд и бизнес логику с основными бизнес моделями. Для своей работы данный слой требует реализованного кем-либо интерфейса `IUsersRepository` для доступа к данным. В директории `Commands` описаны команды, реализующие требования ТЗ, их обработчики и валидаторы входящих данных на основе требований бизнес правил и других ограничений.

#### Application

Основной код слоя `Application` находится в одноименной директории `Application` и реализует API контроллеры, также в нём содержатся описания моделей запросов к API. К этому же слою стоит отнести и файлы `Startup.cs` с логикой запуска и инициализации приложения и файл `Settings.cs` с настройками.

#### Infrastructure

Код слоя `Infrastructure` находится в одноименной директории `Infrastructure`. Он реализует интерфейс `IUsersRepository`, требуемый на уровне бизнес слоя.
В нем описана схема хранения данных, названия таблиц, SQL запросы и логика работы с транзакциями. Так же в слое `Infrastructure` находится реализация поведения валидатора `ValidatorPipelineBehavior`