mirror of
https://github.com/sphildreth/roadie
synced 2024-09-21 07:01:58 +00:00
123 lines
4.3 KiB
C#
123 lines
4.3 KiB
C#
using Mapster;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.Extensions.Logging;
|
|
using Newtonsoft.Json;
|
|
using Roadie.Api.Hubs;
|
|
using Roadie.Library;
|
|
using Roadie.Library.Caching;
|
|
using Roadie.Library.Configuration;
|
|
using Roadie.Library.Encoding;
|
|
using Roadie.Library.Enums;
|
|
using Roadie.Library.Extensions;
|
|
using Roadie.Library.Identity;
|
|
using Roadie.Library.Models;
|
|
using Roadie.Library.Models.Pagination;
|
|
using Roadie.Library.Models.Releases;
|
|
using Roadie.Library.Models.Statistics;
|
|
using Roadie.Library.Models.Users;
|
|
using Roadie.Library.Processors;
|
|
using Roadie.Library.Utility;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Linq.Dynamic.Core;
|
|
using System.Threading.Tasks;
|
|
using data = Roadie.Library.Data;
|
|
|
|
namespace Roadie.Api.Services
|
|
{
|
|
public class AdminService : ServiceBase, IAdminService
|
|
{
|
|
private IEventMessageLogger EventMessageLogger { get; }
|
|
|
|
private ILogger MessageLogger
|
|
{
|
|
get
|
|
{
|
|
return this.EventMessageLogger as ILogger;
|
|
}
|
|
}
|
|
|
|
protected IHubContext<ScanActivityHub> ScanActivityHub { get; }
|
|
|
|
public AdminService(IRoadieSettings configuration,
|
|
IHttpEncoder httpEncoder,
|
|
IHttpContext httpContext,
|
|
data.IRoadieDbContext context,
|
|
ICacheManager cacheManager,
|
|
ILogger<ArtistService> logger,
|
|
IHubContext<ScanActivityHub> scanActivityHub
|
|
)
|
|
: base(configuration, httpEncoder, context, cacheManager, logger, httpContext)
|
|
{
|
|
this.ScanActivityHub = scanActivityHub;
|
|
this.EventMessageLogger = new EventMessageLogger();
|
|
this.EventMessageLogger.Messages += EventMessageLogger_Messages;
|
|
}
|
|
|
|
private void EventMessageLogger_Messages(object sender, EventMessage e)
|
|
{
|
|
Task.WaitAll(this.LogAndPublish(e.Message, e.Level));
|
|
}
|
|
|
|
public async Task<OperationResult<bool>> ScanInboundFolder(ApplicationUser user, bool isReadOnly = false)
|
|
{
|
|
var d = new DirectoryInfo(this.Configuration.InboundFolder);
|
|
var dest = new DirectoryInfo(this.Configuration.LibraryFolder);
|
|
|
|
var sw = new Stopwatch();
|
|
sw.Start();
|
|
|
|
long processedFiles = 0;
|
|
await this.LogAndPublish($"** Processing Folder: [{d.FullName}]");
|
|
|
|
long processedFolders = 0;
|
|
var folderProcessor = new FolderProcessor(this.Configuration, this.HttpEncoder, this.Configuration.LibraryFolder, this.DbContext, this.CacheManager, this.MessageLogger);
|
|
foreach (var folder in Directory.EnumerateDirectories(d.FullName).ToArray())
|
|
{
|
|
await folderProcessor.Process(new DirectoryInfo(folder), isReadOnly);
|
|
processedFolders++;
|
|
}
|
|
if (!isReadOnly)
|
|
{
|
|
folderProcessor.DeleteEmptyFolders(d);
|
|
}
|
|
sw.Stop();
|
|
await this.LogAndPublish($"**Completed!Processed Folders[{ processedFolders }], Processed Files[{ processedFiles}] : Elapsed Time[{ sw.Elapsed}]");
|
|
return new OperationResult<bool>
|
|
{
|
|
Data = true,
|
|
IsSuccess = true,
|
|
OperationTime = sw.ElapsedMilliseconds
|
|
};
|
|
}
|
|
|
|
|
|
|
|
private async Task LogAndPublish(string message, LogLevel level = LogLevel.Trace)
|
|
{
|
|
switch (level)
|
|
{
|
|
case LogLevel.Trace:
|
|
this.Logger.LogTrace(message);
|
|
break;
|
|
case LogLevel.Debug:
|
|
this.Logger.LogDebug(message);
|
|
break;
|
|
case LogLevel.Information:
|
|
this.Logger.LogInformation(message);
|
|
break;
|
|
case LogLevel.Warning:
|
|
this.Logger.LogWarning(message);
|
|
break;
|
|
case LogLevel.Critical:
|
|
this.Logger.LogCritical(message);
|
|
break;
|
|
}
|
|
await this.ScanActivityHub.Clients.All.SendAsync("SendSystemActivity", message);
|
|
}
|
|
}
|
|
}
|