mirror of
https://github.com/sphildreth/roadie
synced 2025-02-17 21:48:27 +00:00
ability to delete collection of tracks.
This commit is contained in:
parent
164a77b477
commit
f0df38a97b
4 changed files with 66 additions and 51 deletions
Roadie.Api.Library
Roadie.Api.Services
Roadie.Api/Controllers
|
@ -10,8 +10,8 @@
|
|||
<ItemGroup>
|
||||
<PackageReference Include="AutoCompare.Core" Version="1.0.0" />
|
||||
<PackageReference Include="CsvHelper" Version="12.1.2" />
|
||||
<PackageReference Include="EFCore.BulkExtensions" Version="2.4.9" />
|
||||
<PackageReference Include="FluentFTP" Version="25.0.6" />
|
||||
<PackageReference Include="EFCore.BulkExtensions" Version="2.5.1" />
|
||||
<PackageReference Include="FluentFTP" Version="26.0.2" />
|
||||
<PackageReference Include="Hashids.net" Version="1.2.2" />
|
||||
<PackageReference Include="HtmlAgilityPack" Version="1.11.9" />
|
||||
<PackageReference Include="IdSharp.Common" Version="1.0.1" />
|
||||
|
@ -22,7 +22,7 @@
|
|||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.2.6" />
|
||||
<PackageReference Include="Microsoft.Extensions.Caching.Redis" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
|
||||
<PackageReference Include="Microsoft.PowerShell.SDK" Version="6.2.1" />
|
||||
<PackageReference Include="Microsoft.PowerShell.SDK" Version="6.2.2" />
|
||||
<PackageReference Include="MimeMapping" Version="1.0.1.12" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
|
||||
<PackageReference Include="NodaTime" Version="2.4.6" />
|
||||
|
|
|
@ -73,10 +73,12 @@ namespace Roadie.Api.Services
|
|||
{
|
||||
var result = await ArtistService.Delete(user, artist);
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
return new OperationResult<bool>
|
||||
{
|
||||
Errors = result.Errors
|
||||
};
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
@ -111,9 +113,7 @@ namespace Roadie.Api.Services
|
|||
|
||||
try
|
||||
{
|
||||
await ReleaseService.DeleteReleases(user,
|
||||
DbContext.Releases.Where(x => x.ArtistId == artist.Id).Select(x => x.RoadieId).ToArray(),
|
||||
doDeleteFiles);
|
||||
await ReleaseService.DeleteReleases(user, DbContext.Releases.Where(x => x.ArtistId == artist.Id).Select(x => x.RoadieId).ToArray(), doDeleteFiles);
|
||||
await DbContext.SaveChangesAsync();
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
@ -314,65 +314,68 @@ namespace Roadie.Api.Services
|
|||
};
|
||||
}
|
||||
|
||||
public async Task<OperationResult<bool>> DeleteTrack(ApplicationUser user, Guid trackId, bool? doDeleteFile)
|
||||
public async Task<OperationResult<bool>> DeleteTracks(ApplicationUser user, IEnumerable<Guid> trackIds, bool? doDeleteFile)
|
||||
{
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
var errors = new List<Exception>();
|
||||
|
||||
var track = DbContext.Tracks.Include(x => x.ReleaseMedia)
|
||||
.Include(x => x.ReleaseMedia.Release)
|
||||
.Include(x => x.ReleaseMedia.Release.Artist)
|
||||
.FirstOrDefault(x => x.RoadieId == trackId);
|
||||
try
|
||||
foreach (var trackId in trackIds)
|
||||
{
|
||||
if (track == null)
|
||||
var track = DbContext.Tracks.Include(x => x.ReleaseMedia)
|
||||
.Include(x => x.ReleaseMedia.Release)
|
||||
.Include(x => x.ReleaseMedia.Release.Artist)
|
||||
.FirstOrDefault(x => x.RoadieId == trackId);
|
||||
try
|
||||
{
|
||||
await LogAndPublish($"DeleteTrack Unknown Track [{trackId}]", LogLevel.Warning);
|
||||
return new OperationResult<bool>(true, $"Track Not Found [{trackId}]");
|
||||
}
|
||||
|
||||
DbContext.Tracks.Remove(track);
|
||||
await DbContext.SaveChangesAsync();
|
||||
if (doDeleteFile ?? false)
|
||||
{
|
||||
string trackPath = null;
|
||||
try
|
||||
if (track == null)
|
||||
{
|
||||
trackPath = track.PathToTrack(Configuration);
|
||||
if (File.Exists(trackPath))
|
||||
{
|
||||
File.Delete(trackPath);
|
||||
Logger.LogWarning($"x For Track `{track}`, Deleted File [{trackPath}]");
|
||||
}
|
||||
await LogAndPublish($"DeleteTracks Unknown Track [{trackId}]", LogLevel.Warning);
|
||||
return new OperationResult<bool>(true, $"Track Not Found [{trackId}]");
|
||||
}
|
||||
|
||||
var trackThumbnailName = track.PathToTrackThumbnail(Configuration);
|
||||
if (File.Exists(trackThumbnailName))
|
||||
DbContext.Tracks.Remove(track);
|
||||
await DbContext.SaveChangesAsync();
|
||||
if (doDeleteFile ?? false)
|
||||
{
|
||||
string trackPath = null;
|
||||
try
|
||||
{
|
||||
File.Delete(trackThumbnailName);
|
||||
Logger.LogWarning($"x For Track `{track}`, Deleted Thumbnail File [{trackThumbnailName}]");
|
||||
trackPath = track.PathToTrack(Configuration);
|
||||
if (File.Exists(trackPath))
|
||||
{
|
||||
File.Delete(trackPath);
|
||||
Logger.LogWarning($"x For Track `{track}`, Deleted File [{trackPath}]");
|
||||
}
|
||||
|
||||
var trackThumbnailName = track.PathToTrackThumbnail(Configuration);
|
||||
if (File.Exists(trackThumbnailName))
|
||||
{
|
||||
File.Delete(trackThumbnailName);
|
||||
Logger.LogWarning($"x For Track `{track}`, Deleted Thumbnail File [{trackThumbnailName}]");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError(ex,
|
||||
string.Format("Error Deleting File [{0}] For Track [{1}] Exception [{2}]", trackPath,
|
||||
track.Id, ex.Serialize()));
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError(ex,
|
||||
string.Format("Error Deleting File [{0}] For Track [{1}] Exception [{2}]", trackPath,
|
||||
track.Id, ex.Serialize()));
|
||||
}
|
||||
|
||||
await ReleaseService.ScanReleaseFolder(user, track.ReleaseMedia.Release.RoadieId, false, track.ReleaseMedia.Release);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError(ex);
|
||||
await LogAndPublish("Error deleting track.");
|
||||
errors.Add(ex);
|
||||
}
|
||||
|
||||
await ReleaseService.ScanReleaseFolder(user, track.ReleaseMedia.Release.RoadieId, false, track.ReleaseMedia.Release);
|
||||
sw.Stop();
|
||||
await LogAndPublish($"DeleteTracks `{track}`, By User `{user}`", LogLevel.Information);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logger.LogError(ex);
|
||||
await LogAndPublish("Error deleting track.");
|
||||
errors.Add(ex);
|
||||
}
|
||||
|
||||
sw.Stop();
|
||||
await LogAndPublish($"DeleteTrack `{track}`, By User `{user}`", LogLevel.Information);
|
||||
CacheManager.Clear();
|
||||
return new OperationResult<bool>
|
||||
{
|
||||
|
@ -381,6 +384,7 @@ namespace Roadie.Api.Services
|
|||
OperationTime = sw.ElapsedMilliseconds,
|
||||
Errors = errors
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
public async Task<OperationResult<bool>> DeleteUser(ApplicationUser applicationUser, Guid userId)
|
||||
|
|
|
@ -20,7 +20,7 @@ namespace Roadie.Api.Services
|
|||
|
||||
Task<OperationResult<bool>> DeleteReleaseSecondaryImage(ApplicationUser user, Guid releaseId, int index);
|
||||
|
||||
Task<OperationResult<bool>> DeleteTrack(ApplicationUser user, Guid trackId, bool? doDeleteFile);
|
||||
Task<OperationResult<bool>> DeleteTracks(ApplicationUser user, IEnumerable<Guid> trackIds, bool? doDeleteFile);
|
||||
|
||||
Task<OperationResult<bool>> DeleteUser(ApplicationUser applicationUser, Guid id);
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ using Roadie.Library.Caching;
|
|||
using Roadie.Library.Configuration;
|
||||
using Roadie.Library.Identity;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
@ -82,11 +83,21 @@ namespace Roadie.Api.Controllers
|
|||
return Ok(result);
|
||||
}
|
||||
|
||||
[HttpPost("delete/tracks")]
|
||||
[ProducesResponseType(200)]
|
||||
public async Task<IActionResult> DeleteTracks([FromBody]IEnumerable<Guid> ids, bool? doDeleteFile)
|
||||
{
|
||||
var result = await AdminService.DeleteTracks(await UserManager.GetUserAsync(User), ids, doDeleteFile);
|
||||
if (!result.IsSuccess) return StatusCode((int)HttpStatusCode.InternalServerError);
|
||||
return Ok(result);
|
||||
}
|
||||
|
||||
|
||||
[HttpPost("delete/track/{id}")]
|
||||
[ProducesResponseType(200)]
|
||||
public async Task<IActionResult> DeleteTrack(Guid id, bool? doDeleteFile)
|
||||
{
|
||||
var result = await AdminService.DeleteTrack(await UserManager.GetUserAsync(User), id, doDeleteFile);
|
||||
var result = await AdminService.DeleteTracks(await UserManager.GetUserAsync(User), new Guid[1] { id }, doDeleteFile);
|
||||
if (!result.IsSuccess) return StatusCode((int)HttpStatusCode.InternalServerError);
|
||||
return Ok(result);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue