diff --git a/LANCommander.Server.Services/Abstractions/IBaseDatabaseService.cs b/LANCommander.Server.Services/Abstractions/IBaseDatabaseService.cs index f1828ed5..74a69a25 100644 --- a/LANCommander.Server.Services/Abstractions/IBaseDatabaseService.cs +++ b/LANCommander.Server.Services/Abstractions/IBaseDatabaseService.cs @@ -34,5 +34,7 @@ namespace LANCommander.Server.Services.Abstractions Task UpdateAsync(T entity); Task DeleteAsync(T entity); + // TODO: Add IBaseDatabaseService<>.DeleteRangeAsync + //Task DeleteRangeAsync(IEnumerable entities); } } diff --git a/LANCommander.Server.Services/MediaService.cs b/LANCommander.Server.Services/MediaService.cs index 7af627d9..4bc121a1 100644 --- a/LANCommander.Server.Services/MediaService.cs +++ b/LANCommander.Server.Services/MediaService.cs @@ -71,6 +71,17 @@ namespace LANCommander.Server.Services await base.DeleteAsync(entity); } + public override async Task DeleteRangeAsync(IEnumerable entities) + { + DeleteLocalMediaFiles(entities); + + var gameIds = entities.Select(x => x.GameId).Distinct(); + var expirationTasks = gameIds.Select(gameId => cache.ExpireGameCacheAsync(gameId)); + await Task.WhenAll(expirationTasks); + + await base.DeleteRangeAsync(entities); + } + public static bool FileExists(Media entity) { var path = GetMediaPath(entity); @@ -264,6 +275,14 @@ namespace LANCommander.Server.Services FileHelpers.DeleteIfExists(GetThumbnailPath(media)); } + public void DeleteLocalMediaFiles(IEnumerable medias) + { + foreach (var media in medias) + { + DeleteLocalMediaFile(media); + } + } + public async Task DownloadMediaAsync(string sourceUrl, Media media) { using (var http = new HttpClient()) diff --git a/LANCommander.Server.Services/_BaseDatabaseService.cs b/LANCommander.Server.Services/_BaseDatabaseService.cs index 8848fbe1..c85aae33 100644 --- a/LANCommander.Server.Services/_BaseDatabaseService.cs +++ b/LANCommander.Server.Services/_BaseDatabaseService.cs @@ -340,7 +340,25 @@ namespace LANCommander.Server.Services Reset(); } } - + + public virtual async Task DeleteRangeAsync(IEnumerable entities) + { + try + { + await cache.ExpireAsync($"{typeof(T).FullName}"); + + using var context = await dbContextFactory.CreateDbContextAsync(); + + context.Set().RemoveRange(entities); + + await context.SaveChangesAsync(); + } + finally + { + Reset(); + } + } + private async Task GetCurrentUserAsync(DatabaseContext context) { var httpContext = httpContextAccessor?.HttpContext; diff --git a/LANCommander.Server/UI/Pages/Games/Components/MediaEditor.razor b/LANCommander.Server/UI/Pages/Games/Components/MediaEditor.razor index c7eb7565..f1387636 100644 --- a/LANCommander.Server/UI/Pages/Games/Components/MediaEditor.razor +++ b/LANCommander.Server/UI/Pages/Games/Components/MediaEditor.razor @@ -6,60 +6,74 @@ @inject ILogger Logger - - - @if (MediaService.FileExists(context)) - { - string originalPath = $"/api/Media/{context.Id}/Download?fileId={context.FileId}"; - string thumbnailPath = context.Thumbnail != null - ? $"/api/Media/{context.Thumbnail?.Id}/Download?fileId={context.Thumbnail?.FileId}" - : $"/api/Media/{context.Id}/Thumbnail?fileId={context.FileId}"; - - if (context.Type == MediaType.Manual) +
+ + + @if (Selected.Any()) { - + @Selected.Count() selected } - else - { - - } - } - - - - } - - - - @{ - var fileInputId = Guid.NewGuid(); - } - - + + + + + @if (MediaService.FileExists(row)) + { + string originalPath = $"/api/Media/{row.Id}/Download?fileId={row.FileId}"; + string thumbnailPath = row.Thumbnail != null + ? $"/api/Media/{row.Thumbnail?.Id}/Download?fileId={row.Thumbnail?.FileId}" + : $"/api/Media/{row.Id}/Thumbnail?fileId={row.FileId}"; + + if (row.Type == MediaType.Manual) + { + + } + else + { + + } + } + + + + } + + + + @{ + var fileInputId = Guid.NewGuid(); + } +
@@ -76,6 +90,9 @@ [Parameter] public Guid GameId { get; set; } [Parameter] public string GameTitle { get; set; } + IEnumerable Selected = new List(); + ITable? ResultsTable; + Settings Settings = SettingService.GetSettings(); MediaType[] AllowedMediaTypes = new MediaType[] @@ -237,6 +254,18 @@ await ValuesChanged.InvokeAsync(Values); } + private async Task DeleteAll() + { + if (!Selected.Any()) + return; + + Values = Values.Except(Selected).ToList(); + await MediaService.DeleteRangeAsync(Selected); + + Selected = []; + ResultsTable.ReloadData(); + } + private async Task RemoveMedia(Media media) { Values.Remove(media);