AnimalAllies - платформа волонтёрской помощи животным, где оказывается ряд услуг: материальная помощь нуждающимся животным, поиск пропавших питомцев, оставление животного на временное на попечительство в виду отъезда и т.д.
- Аутентификация и авторизация на основе разрешений
- Подтверждение учётной записи по почте через сервис уведомлений
- Модуль управления животными и управления видами реализован по ddd
- CRUD операции над всеми сущностями: волонтёр, питомец, порода, вид
- Питомцы обладают позицией, которая отображает их очередность на помощь от волонтера. Позиция может быть изменена в зависимости от условий.
- Возможность обновления профиля пользователя, в качестве обычного клиента и в роли волонтёра
- Мягкое и полное удаление некоторых сущностей
- Хранение файлов (видео и фото) животных или аваторок пользователей в S3 хранилище, которое реализовано в видео отдельного сервиса
- Манипуляции с S3 хранилищем реализованы через AWS SDK S3 и Minio
- Для хранения файлов предусмотрена мультичастичная загрузка
- В модуле заявок на волонтёрство реализована следующая бизнес-логика по ddd:
- Подать заявку на волонтёрство, также проверяется наличие запрета на подачу через доменные события
- Взять заявку на рассмотрение админом (проверка пользователя закрепляется за ним)
- Одобрить заявку на волонтёрство, тогда через RabbiMQ будет отправлена команда на создание аккаунта волонтёра в модуле авторизации
- Отправка заявки админом на доработку с указанием проблемных мест
- Обновление заявки с последующей отправкой на дальнейшее рассмотрение
- Отклонить заявку на волонтёрство с указанием причины, после чего, через доменные события создастся запрет на подачу новых волонтёрских заявок сроком на неделю
- Все важные этапы в процессе рассмотрения заявки уведомляются по почте
- В модуле дискуссий реализована следующая бизнес-логика по ddd:
- Когда админ берёт заявку на рассмотрение в модулей заявок на волонтерство, то в модуле дискуссий через контракты создаётся сущность дискуссии между админом и пользователем для обсуждения вопросов.
- Реализована функциональность, которая закрывает дискуссию для обоих участников
- Реализована функциональность, которая позволяет удалять пользователям свои сообщения в дискуссии
- Реализована функциональность, которая позволяет отправлять сообщений в дискуссии
- Реализована функциональность, которая позволяет обновлять пользователям свои сообщения в дискуссии
- Реализованы разного вида запросы с пагинацией, фильтрацией и сортировкой. Для повышения производительности был использован CQRS. Для команд - ef core, для запросов - dapper
- Написаны юнит-тесты для всей бизнес-логики
- Добавленно кэширование через Redis для повышения производительности запрос и улучшения пользовательского опыта
- Проект переведен на .NET 9
- Внедрен transactional outbox паттерн для обеспечения атомарности в распределенных транзакциях, а также вынесен в nuget пакет
- Добавлены метрики через ElasticSearch, Kibana, Grafana
- Настроен CI/CD
- Написаны интеграционные тесты
- Покрытие юнит-тестами >= 70%
- Покрытие интеграционными-тестами >= 70%
- Реализация полнотекстового поиска на PostgreSql/ElasticSearch
- Реализован файловый сервис
- Реализован сервис уведомлений
- Реализована OAuth 2, интегрированы следующие сервисы: Google, VK, Yandex
- Реализован телеграм-бот
- Реализован сервис событий
- Реализован платёжный сервис
- Реализован сервис поиска пропавших животных через ML.NET
- Скачивание файлов через presigned url
- Загрузка файлов через presigned url
- Удаление файлов через presigned url
- Получения мета-данных файлов из MongoDB
- Мультичастичная загрузка для больших файлов
- Проверка консистентности данных через Hangfire (запланированная задача смотри, сопоставляется ли записи из MongoDB наличие файла в S3 Minio)
- Реализован слой Communication для связи с другими сервисами
- Слой Communication и Contracts добавлен в nu-get
- Реализованы функции для одиночной и многофайловой загрузки
- Реализация отправки писем, используя MailKit и протокол SMTP
- Отправление письма пользователю для подтверждения регистрации
- Возможность настройки сервиса уведомлений: получать уведомление на Email, Telegram, Web
- Создание базовых настроек сервиса с включенными уведомлениями на Email по умолчанию при подтверждённом аккаунте
- Связь с бэкендом по RabbitMQ
- Слой Contracts добавлен в nu-get
- Инвалидация кэша L1 и L2 Redis
- Инвалидация кэша по тегу
- Инвалидация кэша по ключу
- Реализована своя FSM, используя паттерн Command и State
- Кэширование контекст в Redis
- Авторизация в аккаунт
- Уведомление о статусе заявки
- Вспомогательные команды: /help, /info
- Получение информации о своих животных (для волонтёра)
- В разработке
- В разработке
- В разработке
- В разработке
- В разработке
- В разработке
Вот список наиболее значимых фреймворков из предоставленного списка в формате markdown:
| Фреймворк | Версия | Источник |
|---|---|---|
| AWSSDK.S3 | 3.7.414.1 | nuget.org |
| Hangfire | 1.8.15 | nuget.org |
| Hangfire.Core | 1.8.17 | nuget.org |
| Hangfire.PostgreSql | 1.20.10 | nuget.org |
| Microsoft.AspNetCore.OpenApi | 9.0.1 | nuget.org |
| Microsoft.Extensions.Configuration | 9.0.1 | nuget.org |
| Microsoft.Extensions.Logging.Abstractions | 9.0.1 | nuget.org |
| Minio | 6.0.4 | nuget.org |
| MongoDB.Bson | 3.1.0 | nuget.org |
| MongoDB.Driver | 3.1.0 | nuget.org |
| MongoDB.Driver.Core | 2.30.0 | nuget.org |
| Serilog.AspNetCore | 9.0.0 | nuget.org |
| Serilog.Enrichers.Environment | 3.0.1 | nuget.org |
| Serilog.Enrichers.Thread | 4.0.0 | nuget.org |
| Serilog.Exceptions | 8.4.0 | nuget.org |
| Serilog.Sinks.Seq | 9.0.0 | nuget.org |
| Swashbuckle.AspNetCore | 7.2.0 | nuget.org |
| Swashbuckle.AspNetCore.Swagger | 7.2.0 | nuget.org |
| Swashbuckle.AspNetCore.SwaggerGen | 7.2.0 | nuget.org |
| Swashbuckle.AspNetCore.SwaggerUI | 7.2.0 | nuget.org |
| Mass Transit.RabbitMQ | 8.3.6 | nuget.org |
| MediatR | 12.4.1 | nuget.org |
| Dapper | 2.1.66 | nuget.org |
| Microsoft.EntityFrameworkCore | 9.0.1 | nuget.org |
| Microsoft.AspNetCore | 9.0.1 | nuget.org |
| Npgsql | 9.0.2 | nuget.org |
| Npgsql.EntityFrameworkCore.PostgreSQL | 9.0.3 | nuget.org |
| Scrutor | 6.0.1 | nuget.org |
| FluentValidation | 11.11.0 | nuget.org |
| FluentValidation.DependencyInjectionExtensions | 11.11.0 | nuget.org |
| FluentAssertions | 8.0.1 | nuget.org |
| xunit | 2.5.3; 2.9.0; 2.9.3 | nuget.org |
| xunit.runner.visualstudio | 2.8.2; 3.0.2 | nuget.org |
| Microsoft.Extensions.Logging | 9.0.1 | nuget.org |
| Moq | 4.20.72 | nuget.org |
| Serilog.AspNetCore | 9.0.0 | nuget.org |
- Клонируйте репозиторий и перейдите в его папку.
- Установите Docker.
- Установите .NET SDK (тот же, что прописан в global.json), а также EF Core. Последний можно добавить командой:
dotnet tool install --global dotnet-ef-
Настройте файлы appsetting.Docker.json в каждом сервисе, прописав собственные строки подключения (они должны совпадать с указанными в compose.yaml)
-
В Gitlab аккаунте сгенерируйте Personal Access Token, проставьте нужные разрешения
Далее скопируйте токен:
Перейдите в IDE, откройте пакет-менеджер -> источники -> добавьте источник для скачивания nuget-пакетов Ссылка: https://gitlab.com/api/v4/projects/63188031/packages/nuget/index.json
Заполните форму, пароль - это ваш сгенерированный токен
-
Добавить источник для скачивания nu-get пакета
-
Создайте файлы
.envи настройте все описанные там параметры. -
Запустите сборку и подъём контейнера:
docker-compose up -d --build- Создайте миграции к базе данных:
Воспользуйтесь заготовленным скриптом:
.\migrations-add-and-update.cmdТеперь можно использовать бэкенд по адресу http://localhost:8080. Документация к бэкенду доступна в интерфейсе Swagger.
в процессе написания
















