## Ответы на вопросы ШМБ от 16.01.2020 ### 1. Описание тестов, схема/правила написания, как запускать. Тесты запускаются следующей командой ``` dotnet.exe test Tests\Compass.Tests ``` На teamcity добавляются параметры ``` dotnet.exe test Tests\Compass.Tests /p:CollectCoverage=true /p:CoverletOutputFormat=teamcity ``` В папке Tests\Compass.Tests следующие тесты ``` /EntityHelperTests - тесты на хелперы для сущностей бд /GraphQLTests - здесь хранятся все тесты на graphql api /Modules - здесь все что относится к rest api /NotificationServiceTests - это тесты сервиса нотификаций /ViewTests - это тесты на view которые лежат в бд ``` Тесты которые задействуют бд нужно наследовать от класса BaseTest, этот класс правильно очищает бд после каждого теста. Для моков используется библиотека Moq. ### 2. Пошаговое/подробное описание авторизации. #### AccountController `Login` - основной ресурс выполняющий аутентификацию по логину/паролю, прописывает токен в куки `ExternalLogin` - точка входа для авторизации через соцсети, далее следуя процедуре oauth соцсеть делает редирект на `ExternalLoginCallback` `ExternalLoginCallback` - завершает процедуру аутентификации через соцсети, прописывает токен в куки `CreateOAuthAccountCode`, `OAuthExchangeCode` - это наша примитивная реализация протокола `OAuth`, чтобы позволить сторонним сервисам (в том числе и нашим) авторизоваться через сайт КЦ. Насколько мне известно эти ресурсы пока не используются. `OAuthExchangeCode` вызывается без авторизации т.к. этот ресурс будет вызывать стороннее приложение которое не имеет токена пользователя, но имеет его одноразовый авторизационный код. ### 3. Описание работы текущего оператора платежей. Используем яндекс кассу. Документация с из api здесь https://kassa.yandex.ru/developers/using-api/basics Наша реализация находится в классах `PaymentPublicMutation` - мутация graphql с которой начинается процедура оплаты `PaymentPublicInsertOperation` - операция которая создает оплату в бд `PaymentPublicPostInsertOperation` - операция которая реализует всю дальнейшую логику после вставки оплаты в бд. В том числе она запускает `PaymentPublicYandexRequestOperation` `PaymentPublicYandexRequestOperation` - реализует непосредственное обращение к кассе и обновляет оплату в бд `OrderController.CaptureYandexPayment` - принимает обратные вызовы от Кассы к нашему серверу с информацией об изменении состояния платежа. Выдача кассовых чеков реализована через сервис https://developers.cloudpayments.ru/. ### 4. Подключение нового оператора платежей. Система дает возможность задать контент провайдеру персональную яндекс кассу. Т.е. в этом случае платежи по курсам провайдера будут идти чего его кассу. Других платежных шлюзов кроме кассы пока не предусмотрено, такой потребности не было. Чтобы добавить другой шлюз нужно дополнить таблицу `Payment`, `PaymentProvider` под потребности этого шлюза, и реализовать необходимые методы в `GraphQl` API и методы обратного вызова от шлюза к серверу, которые он требует, а так же необходимо доработать интерфейс сайта и админку. ### 5. Общая схема работы сайта. Общая схема примерно следующая ![](https://i.imgur.com/IaRIqay.png) Showcase - это скрипты которые встраиваются на сайт ШМБ и отрисовывают курсы в соответствии с заданными настройками. Normalize Proxy - это такой специальный сервис, который нормализует graphql данные по схеме, делали для того чтобы в redux складывать сразу нормализованные данные. Hangfire - часть сервиса api, используется для фоновых задач и задач которые нужно запускать по расписанию. Например рассылки писем. ### 6. Схема работы UI. UI написан на React. Для ШМБ используется js скрипт который рендерит курсы ШМБ в соответствии с заданными настройками. ### 7. Схемы работы Back. См пункт. 5 ### 8. Описание сервисов. См пункт. 5 ### 9. Описание схемы хранения (БД). Не очень понятен вопрос. Схему бд можно посмотреть через стандартные инструменты (например DataGrip от JetBrains или MSSQL Managment Studio). Вцелом все сущности базы данных лежат здесь - `src\Compass.Data\Entities` ### 11. Зачем нужны (какую проблему решают) вью в БД? View в базе данных решают проблему N+1 для graphql запросов, они были созданы для оптимизации кол-ва запросов в БД. ### 12. Причина использования autofac, чего не хватило в стандартном контейнере. Так исторически сложилось, когда начинался проект в dotnet не было своей реализации контейнеров, популярными в то время были autofac и unity. ### 13. Причина использования для доступа к данным LinqToDB, почему не более распространенные энтити или дапер. Так исторически сложилось, когда начинался проект не было EF Core, а в EF на тот момент был ужасный механизм миграций, с которым постоянно были проблемы при командной разработке, + в качестве БД рассматривали postgres. EF тогда поддерживал только MS SQL. ### 14. Какую задачу решает прокся в UI. Имеется ввиду normalize proxy? ### 15. На какую нагрузку рассчитано решение? Решение более менее держит нагрузку 26 rps. Это ~ 150 активных пользователей на сайте (точных метрик нет, расчет основан на данных из GA и не учитывает витрины). Пока что этого хватает. Есть известная область оптимизации, все решения мы описываем в задачах, к сожалению пока некому этим заниматься. ### 17. Закладывалась ли возможность горизонтального масштабирования? Если да, то описание. Не измеряли, текущее решение было сделано давно, хотим перенести хостинг картинок на S3 совместимое хранилище.