2
0
Fork 0
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:
Steven Hildreth 2019-07-20 11:15:26 -05:00
parent 164a77b477
commit f0df38a97b
4 changed files with 66 additions and 51 deletions
Roadie.Api.Library
Roadie.Api.Services
Roadie.Api/Controllers

View file

@ -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" />

View file

@ -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)

View file

@ -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);

View file

@ -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);
}