using StickyBoard.Core.Models; using StickyBoard.Core.Models.BoardsAndCards; namespace StickyBoard.Core.Repositories.BoardsAndCards.Contracts; public interface IBoardMemberRepository { // Overrides only (promote / demote / block) Task AddOrUpdateAsync(BoardMember entity, CancellationToken ct); // Removes override -> falls back to workspace role Task RemoveAsync(Guid boardId, Guid userId, CancellationToken ct); // Checks if override exists (NOT effective membership) Task HasOverrideAsync(Guid boardId, Guid userId, CancellationToken ct); // Effective role (board override -> workspace fallback) Task GetEffectiveRoleAsync(Guid boardId, Guid userId, CancellationToken ct); // All effective members of a board (excluding Blocked) Task> GetEffectiveByBoardAsync(Guid boardId, CancellationToken ct); // All boards for a user (excluding Blocked) Task> GetEffectiveByUserAsync(Guid userId, CancellationToken ct); // Raw overrides (admin/audit/debug) Task> GetOverridesByBoardAsync(Guid boardId, CancellationToken ct); Task> GetOverridesByUserAsync(Guid userId, CancellationToken ct); }