1
0
mirror of https://github.com/bitwarden/server synced 2026-01-27 06:43:19 +00:00

feat: add DeleteMany procedure for EmergencyAccess

This commit is contained in:
Ike Kottlowski
2026-01-23 08:59:51 -05:00
parent 76a9e9fc1f
commit 2f225bfbed
5 changed files with 82 additions and 2 deletions

View File

@@ -30,4 +30,11 @@ public interface IEmergencyAccessRepository : IRepository<EmergencyAccess, Guid>
/// <param name="emergencyAccessKeys">A list of emergency access with updated keys</param>
UpdateEncryptedDataForKeyRotation UpdateForKeyRotation(Guid grantorId,
IEnumerable<EmergencyAccess> emergencyAccessKeys);
/// <summary>
/// Deletes multiple emergency access records by their IDs
/// </summary>
/// <param name="emergencyAccessIds">Ids of records to be deleted</param>
/// <returns>void</returns>
Task DeleteManyAsync(ICollection<Guid> emergencyAccessIds);
}

View File

@@ -9,8 +9,6 @@ using Bit.Infrastructure.Dapper.Repositories;
using Dapper;
using Microsoft.Data.SqlClient;
#nullable enable
namespace Bit.Infrastructure.Dapper.Auth.Repositories;
public class EmergencyAccessRepository : Repository<EmergencyAccess, Guid>, IEmergencyAccessRepository
@@ -152,4 +150,14 @@ public class EmergencyAccessRepository : Repository<EmergencyAccess, Guid>, IEme
}
};
}
/// <inheritdoc />
public async Task DeleteManyAsync(ICollection<Guid> emergencyAccessIds)
{
using var connection = new SqlConnection(ConnectionString);
await connection.ExecuteAsync(
"[dbo].[EmergencyAccess_DeleteMany]",
new { EmergencyAccessIds = emergencyAccessIds },
commandType: CommandType.StoredProcedure);
}
}

View File

@@ -144,4 +144,19 @@ public class EmergencyAccessRepository : Repository<Core.Auth.Entities.Emergency
};
}
/// <inheritdoc />
public async Task DeleteManyAsync(ICollection<Guid> emergencyAccessIds)
{
using (var scope = ServiceScopeFactory.CreateScope())
{
var dbContext = GetDatabaseContext(scope);
var rangeToRemove = from ea in dbContext.EmergencyAccesses
where emergencyAccessIds.Contains(ea.Id)
select ea;
dbContext.EmergencyAccesses.RemoveRange(rangeToRemove);
await dbContext.SaveChangesAsync();
}
}
}

View File

@@ -0,0 +1,25 @@
CREATE PROCEDURE [dbo].[EmergencyAccess_DeleteManyById]
@EmergencyAccessIds [dbo].[GuidIdArray] READONLY
AS
BEGIN
SET NOCOUNT ON
DECLARE @BatchSize INT = 100
-- Delete EmergencyAccess Records
WHILE @BatchSize > 0
BEGIN
BEGIN TRANSACTION
DELETE TOP(@BatchSize) EA
FROM
[dbo].[EmergencyAccess] EA
INNER JOIN
@EmergencyAccessIds EAI ON EAI.Id = EA.Id
SET @BatchSize = @@ROWCOUNT
COMMIT TRANSACTION
END
END
GO

View File

@@ -0,0 +1,25 @@
CREATE OR ALTER PROCEDURE [dbo].[EmergencyAccess_DeleteManyById]
@EmergencyAccessIds [dbo].[GuidIdArray] READONLY
AS
BEGIN
SET NOCOUNT ON
DECLARE @BatchSize INT = 100
-- Delete EmergencyAccess Records
WHILE @BatchSize > 0
BEGIN
BEGIN TRANSACTION
DELETE TOP(@BatchSize) EA
FROM
[dbo].[EmergencyAccess] EA
INNER JOIN
@EmergencyAccessIds EAI ON EAI.Id = EA.Id
SET @BatchSize = @@ROWCOUNT
COMMIT TRANSACTION
END
END
GO