using Deal.Modules.Cards.Application; using Deal.Modules.Kanban.Application; using Deal.Modules.Kanban.Application.Models; namespace Deal.Infrastructure.Services; /// /// Единая точка перехода карточки между контейнерами — реализация порта /// (R4 этапа 9). /// /// /// Маршрутизация цели живёт в домене: цель-стадия пространства «Выбранные» /// () переходит через — /// запись истории движения и сброс напоминания; остальные цели (доски/служебные зоны) — штатный перенос /// дашборда (журнал CardMoves, matchHits, обучение ML). /// Адаптер только нормализует результаты обоих маршрутов к ; снимок карточки /// эндпоинт перечитывает единым чтением. Scoped: зависимости живут в рамках tenant-запроса. /// /// Сервис карточек — единый домен перехода (стадии и контейнеры дашборда). public sealed class CardMover(CardsService cardsService) : ICardMover { /// public async Task MoveAsync( string cardId, string toContainerId, TransitionContext ctx, CancellationToken ct) { // Контекст перехода (инициатор/обучение) учтён внутри маршрутов: дашборд-перенос обучает ML по // цели пользователя, переход по стадии пишет историю и сбрасывает напоминание. Отдельного // ветвления по ctx сейчас нет — оно появится с политиками контейнеров (R4). CardResultDto result = CardsDefaultContainers.Contains(toContainerId) ? await cardsService.MoveStageCardAsync(cardId, toContainerId, ct) : await cardsService.MoveDashboardCardAsync(cardId, toContainerId, ct); return result.Error is not null ? new CardMoveResultDto(result.Error, Exists: true) : new CardMoveResultDto(null, Exists: result.Card is not null); } }