using CollabDAL.DTO.CollabInvite; using CollabDAL.Query.CollabInvite; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; namespace CollabDAL.CustomCode.CollabInvite; public class CollabInviteDAL(IQueryExecutor _qe) : ICollabInviteDAL { public async Task GetInviteByTokenAsync( string token, CancellationToken ct) { return await _qe.QuerySingleAsync( new LoginDTO(), CollabInviteQB.GET_INVITE_BY_TOKEN, new { InviteToken = token }).ConfigureAwait(false); } public async Task> GetPendingInvitesForUserAsync( string userId, LoginDTO login, CancellationToken ct) { var result = await _qe.QueryAsync( login, CollabInviteQB.GET_PENDING_INVITES_FOR_USER, new { UserId = userId, login.DatabaseName }).ConfigureAwait(false); return result.ToList(); } public async Task CreateInviteAsync(CollabSessionInviteDTO dto, LoginDTO login, CancellationToken ct) { // Generate unique token inside DAL before INSERT dto.InviteToken = Guid.NewGuid().ToString("N")[..16].ToUpper(); return await _qe.ExecuteScalarAsync( login, CollabInviteQB.CREATE_INVITE, new { dto.SessionId, dto.InviteToken, dto.InvitedUserId, dto.OfferedRole, dto.ExpiresAt, CreatedBy = login.UserCode, login.DatabaseName, }).ConfigureAwait(false); } public async Task UpdateInviteStatusAsync( Guid inviteId, string status, LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabInviteQB.UPDATE_INVITE_STATUS, new { InviteId = inviteId, Status = status, login.DatabaseName }).ConfigureAwait(false); } public async Task ExpireStaleInvitesAsync(LoginDTO login, CancellationToken ct) { await _qe.ExecuteAsync( login, CollabInviteQB.EXPIRE_STALE_INVITES, null).ConfigureAwait(false); } }