Server: stop a team being archived while a vault is created in it

This commit is contained in:
jaap-jan committed 2026-10-02 14:20:30 +02:00
1 parent ff8a790f6c
commit 965c9a7043
3 files changed
+91 -23

No files matched your search

+13 -10
View File
@@ -255,16 +255,6 @@ internal sealed class TeamService(
throw new InvalidOperationException("Only the owner of a team can archive it.");
}
var vaultCount = await CountVaultsAsync(team.Id, cancellationToken).ConfigureAwait(false);
if (vaultCount > 0)
{
throw new TeamNotEmptyException(
string.Create(
CultureInfo.InvariantCulture,
$"This team still owns {vaultCount} vault(s), and archiving it would take them away from everybody holding a key — including you. Delete those vaults first, which asks about each one and withdraws every key to it."));
}
var now = clock.GetUtcNow();
var archived = await database.ExecuteFreshAsync([team], async () =>
{
@@ -273,6 +263,19 @@ internal sealed class TeamService(
.ConfigureAwait(false);
await using var _ = transaction.ConfigureAwait(false);
// Counted under the lock a vault create takes, so one cannot land between this and the archive.
await TeamLock.AcquireAsync(database, team.Id, cancellationToken).ConfigureAwait(false);
var vaultCount = await CountVaultsAsync(team.Id, cancellationToken).ConfigureAwait(false);
if (vaultCount > 0)
{
throw new TeamNotEmptyException(
string.Create(
CultureInfo.InvariantCulture,
$"This team still owns {vaultCount} vault(s), and archiving it would take them away from everybody holding a key — including you. Delete those vaults first, which asks about each one and withdraws every key to it."));
}
var memberships = await database.TeamMemberships
.Where(m => m.TeamId == team.Id && m.DeletedAtUtc == null)
.ToListAsync(cancellationToken)