@@ -161,6 +161,8 @@ public static IEndpointRouteBuilder MapGitProtectApi(this IEndpointRouteBuilder
161161 Provider = providerType ,
162162 Name = $ "{ providerType } Backup",
163163 Status = BackupTaskStatus . Pending ,
164+ TaskType = BackupTaskType . Backup ,
165+ Trigger = BackupTaskTrigger . Manual ,
164166 Progress = 0
165167 } ;
166168
@@ -200,6 +202,8 @@ public static IEndpointRouteBuilder MapGitProtectApi(this IEndpointRouteBuilder
200202 RepositoryId = repoId ,
201203 Name = $ "{ repo . FullName } Backup",
202204 Status = BackupTaskStatus . Pending ,
205+ TaskType = BackupTaskType . Backup ,
206+ Trigger = BackupTaskTrigger . Manual ,
203207 Progress = 0
204208 } ;
205209
@@ -362,10 +366,46 @@ public static IEndpointRouteBuilder MapGitProtectApi(this IEndpointRouteBuilder
362366 return Results . BadRequest ( new { message = "Storage is not configured." } ) ;
363367 }
364368
365- var cutoff = DateTimeOffset . UtcNow . AddDays ( - policy . RetentionDays ) ;
366- var deleted = await storageService . DeleteBackupsOlderThanAsync ( storage , cutoff , cancellationToken ) ;
369+ var task = new BackupTask
370+ {
371+ Name = "Retention Prune" ,
372+ Status = BackupTaskStatus . Running ,
373+ TaskType = BackupTaskType . Prune ,
374+ Trigger = BackupTaskTrigger . Manual ,
375+ Progress = 0 ,
376+ StartedAt = DateTime . UtcNow
377+ } ;
378+
379+ db . BackupTasks . Add ( task ) ;
380+ await db . SaveChangesAsync ( cancellationToken ) ;
381+
382+ try
383+ {
384+ var cutoff = DateTimeOffset . UtcNow . AddDays ( - policy . RetentionDays ) ;
385+ var deleted = await storageService . DeleteBackupsOlderThanAsync ( storage , cutoff , cancellationToken ) ;
386+
387+ task . Status = BackupTaskStatus . Success ;
388+ task . Progress = 100 ;
389+ task . CompletedAt = DateTime . UtcNow ;
390+ task . Message = deleted > 0
391+ ? $ "Deleted { deleted } backup object(s) older than { cutoff . UtcDateTime : g} ."
392+ : "No expired backups were found." ;
367393
368- return Results . Ok ( new RetentionPruneResultDto ( deleted , cutoff . UtcDateTime ) ) ;
394+ await db . SaveChangesAsync ( cancellationToken ) ;
395+
396+ return Results . Ok ( new RetentionPruneResultDto ( deleted , cutoff . UtcDateTime ) ) ;
397+ }
398+ catch ( Exception ex )
399+ {
400+ task . Status = BackupTaskStatus . Failed ;
401+ task . Progress = 100 ;
402+ task . CompletedAt = DateTime . UtcNow ;
403+ task . Message = ex . Message ;
404+
405+ await db . SaveChangesAsync ( cancellationToken ) ;
406+
407+ return Results . Problem ( "Retention prune failed." ) ;
408+ }
369409 } ) ;
370410
371411 api . MapGet ( "/dashboard" , async ( GitProtectDbContext db , CancellationToken cancellationToken ) =>
@@ -434,6 +474,8 @@ private static BackupTaskDto ToTaskDto(BackupTask task)
434474 task . Provider ,
435475 task . RepositoryId ,
436476 task . Status ,
477+ task . TaskType ,
478+ task . Trigger ,
437479 task . Progress ,
438480 task . CreatedAt ,
439481 task . StartedAt ,
@@ -501,7 +543,8 @@ private static async Task<ProviderConfig> GetOrCreateProviderAsync(GitProtectDbC
501543 private static Task < bool > IsProviderBackupInProgressAsync ( GitProtectDbContext db , ProviderType provider , CancellationToken cancellationToken )
502544 {
503545 return db . BackupTasks . AnyAsync ( t =>
504- t . Provider == provider
546+ t . TaskType == BackupTaskType . Backup
547+ && t . Provider == provider
505548 && t . RepositoryId == null
506549 && ( t . Status == BackupTaskStatus . Pending || t . Status == BackupTaskStatus . Running ) ,
507550 cancellationToken ) ;
@@ -510,7 +553,8 @@ private static Task<bool> IsProviderBackupInProgressAsync(GitProtectDbContext db
510553 private static Task < bool > IsRepositoryBackupInProgressAsync ( GitProtectDbContext db , ProviderType provider , int repoId , CancellationToken cancellationToken )
511554 {
512555 return db . BackupTasks . AnyAsync ( t =>
513- t . Provider == provider
556+ t . TaskType == BackupTaskType . Backup
557+ && t . Provider == provider
514558 && t . RepositoryId == repoId
515559 && ( t . Status == BackupTaskStatus . Pending || t . Status == BackupTaskStatus . Running ) ,
516560 cancellationToken ) ;
0 commit comments