using ECPDAL.Communication.DTOs; namespace ECPBLL.Communication.Interfaces; /// /// Abstraction over the CommunicationHub SignalR push (plan: "BLL — not the endpoint — pushes /// via IHubContext<CommunicationHub, ICommunicationClient>"). The concrete implementation /// lives in ECPSL.Communication (where the Hub type itself must live, per CLAUDE.md's SignalR /// folder rule) and is registered against this interface in CommunicationModule.Register — /// ECPBLL.Communication never references ECPSL.Communication directly, which would create a circular /// project reference (SL already depends on BLL). This keeps BLL's ASP.NET-type-free rule intact /// while still letting BLL be the layer that decides when/what to push, per architecture rules. /// public interface ICommunicationPushService { Task PushCommentAsync(int objectTypeId, int objectId, CommentThreadDTO comment, CancellationToken ct); Task PushReplyAsync(int objectTypeId, int objectId, CommentThreadDTO reply, CancellationToken ct); Task PushReactionAsync(int objectTypeId, int objectId, CommentReactionDTO reaction, CancellationToken ct); Task PushStatusChangeAsync(int objectTypeId, int objectId, int commentThreadId, byte newStatus, CancellationToken ct); Task PushMentionAsync(int mentionedUserId, CommentMentionDTO mention, CancellationToken ct); Task PushErrorAsync(int userId, string errorMessage, CancellationToken ct); }