feat(account): add deletion lifecycle
CI and Deploy / test (pull_request) Successful in 5m18s
CI and Deploy / deploy (pull_request) Has been skipped

This commit is contained in:
cesnimda
2026-08-15 19:03:54 +02:00
parent 1ec9dd037e
commit 842e793f69
28 changed files with 4418 additions and 129 deletions
+59
View File
@@ -0,0 +1,59 @@
namespace JobTrackerApi.Models;
public static class AccountDeletionStatuses
{
public const string Active = "active";
public const string Pending = "pending";
public const string Completed = "completed";
}
public static class AccountDeletionRequestStatuses
{
public const string Pending = "pending";
public const string Processing = "processing";
public const string RetryRequired = "retry_required";
public const string Completed = "completed";
}
public static class AccountDeletionStages
{
public const string Requested = "requested";
public const string QuarantiningFiles = "quarantining_files";
public const string DeletingDatabase = "deleting_database";
public const string PurgingFiles = "purging_files";
public const string RecordingTombstone = "recording_tombstone";
public const string Completed = "completed";
}
public sealed class AccountDeletionRequest
{
public Guid Id { get; set; }
public string OwnerUserId { get; set; } = string.Empty;
public string OwnerKey { get; set; } = string.Empty;
public string RequestedByUserId { get; set; } = string.Empty;
public string Status { get; set; } = AccountDeletionRequestStatuses.Pending;
public string Stage { get; set; } = AccountDeletionStages.Requested;
public int AttemptCount { get; set; }
public int DatabaseRowCount { get; set; }
public int FileCount { get; set; }
public string? WarningJson { get; set; }
public string? LastErrorCategory { get; set; }
public string? LastErrorMessage { get; set; }
public DateTimeOffset RequestedAtUtc { get; set; }
public DateTimeOffset? StartedAtUtc { get; set; }
public DateTimeOffset? CompletedAtUtc { get; set; }
public List<AccountDeletionFile> Files { get; set; } = new();
}
public sealed class AccountDeletionFile
{
public long Id { get; set; }
public Guid AccountDeletionRequestId { get; set; }
public AccountDeletionRequest Request { get; set; } = null!;
public string Category { get; set; } = string.Empty;
public string OriginalPath { get; set; } = string.Empty;
public string QuarantinePath { get; set; } = string.Empty;
public string Status { get; set; } = "planned";
public long ByteSize { get; set; }
public string Sha256 { get; set; } = string.Empty;
}
+2
View File
@@ -32,4 +32,6 @@ public sealed class ApplicationUser : IdentityUser
public DateTime? StripeLastEventCreatedUtc { get; set; }
public bool AiEnabled { get; set; } = true;
public bool ExternalAiProcessingAllowed { get; set; }
public string DeletionStatus { get; set; } = AccountDeletionStatuses.Active;
public DateTimeOffset? DeletionRequestedAtUtc { get; set; }
}