using CollabDAL.DTO.CollabParticipant; using CollabDAL.DTO.CollabSession; using CollabDAL.Query.CollabParticipant; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace CollabDAL.CustomCode.CollabParticipant; public class CollabParticipantDAL(IQueryExecutor _qe) : ICollabParticipantDAL { public async Task> GetParticipantsBySessionAsync( Guid sessionId, LoginDTO login, CancellationToken ct) { var result = await _qe.QueryAsync( login, CollabParticipantQB.GET_PARTICIPANTS_BY_SESSION, new { SessionId = sessionId, login.DatabaseName }).ConfigureAwait(false); return result.ToList(); } public async Task GetParticipantByConnectionAsync( string connectionId, LoginDTO login, CancellationToken ct) { // ConnectionId is globally unique — no DatabaseName filter (see QB comment) return await _qe.QuerySingleAsync( login, CollabParticipantQB.GET_PARTICIPANT_BY_CONNECTION, new { ConnectionId = connectionId }).ConfigureAwait(false); } public async Task GetActiveParticipantAsync( Guid sessionId, string userId, LoginDTO login, CancellationToken ct) { return await _qe.QuerySingleAsync( login, CollabParticipantQB.GET_ACTIVE_PARTICIPANT, new { SessionId = sessionId, UserId = userId, login.DatabaseName }).ConfigureAwait(false); } public async Task GetControlHolderAsync( Guid sessionId, LoginDTO login, CancellationToken ct) { return await _qe.QuerySingleAsync( login, CollabParticipantQB.GET_CONTROL_HOLDER, new { SessionId = sessionId, login.DatabaseName }).ConfigureAwait(false); } public async Task AddParticipantAsync(CollabParticipantDTO dto, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabParticipantQB.ADD_PARTICIPANT, new { dto.SessionId, dto.UserId, dto.DisplayName, dto.Role, dto.HasControl, dto.CursorColor, dto.DatabaseName, }).ConfigureAwait(false); } public async Task UpdateParticipantLeftAsync( Guid sessionId, string userId, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabParticipantQB.UPDATE_PARTICIPANT_LEFT, new { SessionId = sessionId, UserId = userId, login.DatabaseName }).ConfigureAwait(false); } public async Task UpdateParticipantConnectionAsync( UpdateParticipantConnectionSaveDTO dto, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabParticipantQB.UPDATE_PARTICIPANT_CONNECTION, new { dto.SessionId, dto.UserId, dto.ConnectionId, dto.IsActive, login.DatabaseName, }).ConfigureAwait(false); } public async Task GrantControlAsync(GrantControlSaveDTO dto, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabParticipantQB.GRANT_CONTROL, new { dto.SessionId, dto.TargetUserId, login.DatabaseName }).ConfigureAwait(false); } public async Task RevokeAllControlAsync(Guid sessionId, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabParticipantQB.REVOKE_ALL_CONTROL, new { SessionId = sessionId, login.DatabaseName }).ConfigureAwait(false); } public async Task UpdateHeartbeatAsync( Guid sessionId, string userId, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabParticipantQB.UPDATE_HEARTBEAT, new { SessionId = sessionId, UserId = userId, login.DatabaseName }).ConfigureAwait(false); } }