UnitHack — система для управления задачами с автоматизацией и синхронизацией между пользователями и событиями.
Проект создан для кейса компании Victory Group в рамках хакатона UnitHack 2026. Платформа помогает командам вести проекты, управлять задачами на kanban-досках, назначать исполнителей, использовать теги и получать уведомления о важных изменениях.
UnitHack позволяет:
- регистрироваться и авторизовываться в системе
- создавать команды и управлять участниками
- менять роли участников внутри команды
- создавать проекты внутри команд
- создавать kanban-доски для проектов
- добавлять, переименовывать и удалять колонки
- создавать, обновлять, перемещать и удалять задачи
- назначать задачи пользователям
- добавлять дедлайны, приоритеты и описания задач
- создавать теги для kanban-доски
- прикреплять теги к задачам
- получать уведомления о создании, изменении и перемещении задач
- работать с интерфейсом через статический frontend
UnitHack построен вокруг командной работы с задачами:
- Teams — команды, участники и роли
- Projects — проекты, привязанные к командам
- Kanban — доски внутри проектов
- Columns — колонки kanban-досок
- Tasks — задачи с исполнителем, приоритетом, дедлайном и порядком
- Tags — теги для группировки задач
- Notifications — уведомления о событиях задач
- Realtime — доставка уведомлений через SignalR
- Automation events — публикация событий через outbox и RabbitMQ
- Склонируйте репозиторий.
git clone https://github.com/prlzrakk/UnitHack.git
cd UnitHack- Создайте
.envна основе.env.example.
Пример переменных окружения:
# ASP.NET
ASPNETCORE_URLS=http://+:8080
ASPNETCORE_ENVIRONMENT=Development
# JWT
JWT_SECRET=your_super_secret_key_32_chars_minimum
# Database
DB_HOST=db
DB_PORT=5432
DB_NAME=unithack
DB_USER=postgres
DB_PASSWORD=postgres
# RabbitMQ
RabbitMq__Host=rabbitmq
RabbitMq__Port=5672
RabbitMq__Username=guest
RabbitMq__Password=guest
RabbitMq__Exchange=kanban.events- Запустите проект через Docker Compose.
docker compose up -d --build- После запуска будут доступны:
- frontend/backend:
http://localhost:8080 - nginx:
http://localhost - PostgreSQL:
localhost:5332 - RabbitMQ AMQP:
localhost:5672 - RabbitMQ Management UI:
http://localhost:15672 - Swagger в Development-режиме:
http://localhost:8080/swagger
Тестовый пользователь для входа:
- логин:
test@gmail.com - пароль:
testirovka
Для запуска тестов:
dotnet test- HTML
- CSS
- JavaScript
- SignalR client
Статический frontend находится в Api/wwwroot.
Основные страницы:
auth.html— авторизацияindex.html— главная страницаteams.html— командыproject.html— проектыkanban.html— kanban-доскаuser.html— профиль пользователя
- C#
- .NET
- ASP.NET Core Web API
- MediatR
- FluentValidation
- JWT authentication
- Swagger / OpenAPI
- SignalR
Backend реализован в проекте Api.
- PostgreSQL
- Entity Framework Core
- Npgsql
В базе данных есть сущности для:
- пользователей
- команд
- участников команд
- проектов
- kanban-досок
- колонок
- задач
- тегов
- уведомлений
- событий задач
- правил автоматизации
- outbox-событий
- RabbitMQ
- Outbox pattern
- Background workers
- SignalR
RabbitMQ используется для публикации и обработки событий задач. SignalR используется для realtime-уведомлений пользователей.
- Docker
- Docker Compose
- Nginx
- GitHub Actions
- xUnit
POST /api/users— регистрация пользователяGET /api/users/me— текущий пользовательGET /api/users?query=&limit=— поиск пользователейPOST /api/auth/sessions— создание сессииPOST /api/auth/tokens/refresh— обновление access/refresh token
GET /api/teams— список команд пользователяGET /api/teams/{teamId}— команда по idPOST /api/teams— создание командыPOST /api/teams/{teamId}/members— добавление участникаDELETE /api/teams/{teamId}/members/{userId}— удаление участникаPATCH /api/teams/{teamId}/members/{userId}/role— изменение роли участника
POST /api/teams/{teamId}/projects— создание проектаGET /api/projects/{projectId}— проект по idGET /api/teams/{teamId}/projects— проекты командыDELETE /api/projects/{projectId}— удаление проекта
POST /api/projects/{projectId}/kanbans— создание kanban-доскиGET /api/projects/{projectId}/kanbans— все kanban-доски проектаGET /api/kanbans/{kanbanId}— kanban-доска по idPUT /api/kanbans/{kanbanId}— переименование kanban-доскиDELETE /api/kanbans/{kanbanId}— удаление kanban-доски
POST /api/kanbans/{kanbanId}/columns— создание колонкиPUT /api/columns/{columnId}— переименование колонкиDELETE /api/columns/{columnId}— удаление колонки
POST /api/kanbans/{kanbanId}/tasks— создание задачиPUT /api/tasks/{taskId}— обновление задачиPATCH /api/tasks/{taskId}— перемещение задачиDELETE /api/tasks/{taskId}— удаление задачи
GET /api/kanbans/{kanbanId}/tags— теги kanban-доскиPOST /api/kanbans/{kanbanId}/tags— создание тегаPUT /api/tags/{tagId}— переименование тегаDELETE /api/tags/{tagId}— удаление тегаGET /api/tasks/{taskId}/tags— теги задачиPOST /api/tasks/{taskId}/tags/{tagId}— прикрепить тег к задачеDELETE /api/tasks/{taskId}/tags/{tagId}— открепить тег от задачи
GET /api/notifications— все уведомления пользователяGET /api/notifications/unread— непрочитанные уведомленияGET /api/notifications/{notificationId}— уведомление по idPATCH /api/notifications/{notificationId}/read— отметить уведомление прочитаннымPUT /api/notifications/read-all— отметить все уведомления прочитанными
В проекте предусмотрена синхронизация событий задач и realtime-уведомления.
Как это работает:
- Пользователь создает, обновляет или перемещает задачу.
- Backend создает событие задачи.
- Событие сохраняется в outbox.
OutboxWorkerпубликует pending-события в RabbitMQ.NotificationWorkerчитает события из очереди.- Для пользователя создается уведомление.
- Уведомление отправляется через SignalR.
SignalR hub:
/hubs/notifications
RabbitMQ queue:
notifications:events
Основные части решения:
Api— ASP.NET Core приложение, API-контроллеры, middleware, SignalR hub и статический frontendClient.Models— DTO, enum-ы и конфигурационные модели, общие для API и клиентаCore— слой для доменной и прикладной логикиInfrastructure— база данных, Entity Framework Core, репозитории, JWT/security, RabbitMQ, workersTests— тестовый проект
Проект следует feature-based структуре: каждая крупная возможность вынесена в отдельную папку внутри Api/Application/Features.
Пример:
Api/Application/Features/
├── Auth
├── Columns
├── Kanban
├── Notifications
├── Projects
├── Tags
├── TaskTags
├── Tasks
├── Teams
└── Users