Система динамических статусов и распорядка дня (внимание на модули, некоторые сменили нэйминг) #2
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
В рамках мессенджера необходимо реализовать систему "Presence 2.0". Это не просто индикатор online/offline, а полноценная система статусов с медиа-контентом, временем жизни (TTL) и возможностью планирования распорядка дня.
User Stories
Functional Requirements
expires_at.Acceptance Criteria (AC)
UserStatusChangedивент при смене статуса.Database Schema Design
Для обеспечения высокой производительности и гибкости используется гибридный подход.
PostgreSQL (Relational Core)
Используется для хранения структуры расписаний и текущих состояний.
3. Status Lifecycle & Logic Pipeline
Status Lifecycle & Business Logic
Состояния статуса
expires_at.Re-evaluate.Логика переключения (Pipeline)
current_presence, поставитьis_override = true, вычислитьexpires_at.user_schedulesна наличие подходящего по времениschedule_item.UserStatusChangedDomainEvent.user_presence_{userId}.Backend Implementation Guide (Modular Monolith)
Domain Layer (DDD)
UserPresence.ScheduleRule(инкапсулирует логику Cron или интервалов),StatusContent(текст + ссылка на медиа).PresenceEvaluator— содержит логику определения "Какой статус должен быть у пользователя прямо сейчас?".Application Layer (MediatR / CQRS)
SetManualStatusCommand: установка разового статуса.DefineScheduleCommand: создание/обновление распорядка дня.ResetStatusCommand: принудительный сброс к расписанию.GetPresenceByUserIdQuery: высокопроизводительный запрос (Read Model из Postgres).Infrastructure Layer
Job.schedule_itemsдля активных пользователей (или использует оптимизированную очередь событий).PresenceModule.NotifyStatusChanged(Guid userId, StatusDto newStatus).Integration with MinIO
MediaModule.media_id.