roadie/Roadie.Api.Library/Engines/LabelLookupEngine.cs

192 lines
7.3 KiB
C#
Raw Normal View History

2019-07-03 11:21:29 -05:00
using Microsoft.Extensions.Logging;
2018-12-15 16:35:20 -06:00
using Roadie.Library.Caching;
using Roadie.Library.Configuration;
using Roadie.Library.Data;
using Roadie.Library.Encoding;
using Roadie.Library.Extensions;
using Roadie.Library.SearchEngines.MetaData;
using Roadie.Library.Utility;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using discogs = Roadie.Library.SearchEngines.MetaData.Discogs;
namespace Roadie.Library.Engines
{
public class LabelLookupEngine : LookupEngineBase, ILabelLookupEngine
{
private ILabelSearchEngine DiscogsLabelSearchEngine { get; }
2019-07-03 11:21:29 -05:00
public LabelLookupEngine(IRoadieSettings configuration, IHttpEncoder httpEncoder, IRoadieDbContext context,
2019-07-06 22:16:33 -05:00
ICacheManager cacheManager, ILogger<LabelLookupEngine> logger, discogs.IDiscogsHelper discogsHelper)
2018-12-15 16:35:20 -06:00
: base(configuration, httpEncoder, context, cacheManager, logger)
{
2019-07-06 22:16:33 -05:00
DiscogsLabelSearchEngine = discogsHelper;
2018-12-15 16:35:20 -06:00
}
public async Task<OperationResult<Label>> Add(Label label)
{
SimpleContract.Requires<ArgumentNullException>(label != null, "Invalid Label");
try
{
var now = DateTime.UtcNow;
2019-07-03 11:21:29 -05:00
label.AlternateNames = label.AlternateNames.AddToDelimitedList(new[] { label.Name.ToAlphanumericName() });
2018-12-15 16:35:20 -06:00
if (!label.IsValid)
return new OperationResult<Label>
{
Errors = new Exception[1] { new Exception("Label is Invalid") }
};
2019-07-03 11:21:29 -05:00
DbContext.Labels.Add(label);
var inserted = 0;
2018-12-15 16:35:20 -06:00
try
{
2019-07-03 11:21:29 -05:00
inserted = await DbContext.SaveChangesAsync();
2018-12-15 16:35:20 -06:00
}
catch (Exception ex)
{
2019-07-03 11:21:29 -05:00
Logger.LogError(ex);
2018-12-15 16:35:20 -06:00
}
}
catch (Exception ex)
{
2019-07-03 11:21:29 -05:00
Logger.LogError(ex);
2018-12-15 16:35:20 -06:00
}
2019-07-03 11:21:29 -05:00
2018-12-15 16:35:20 -06:00
return new OperationResult<Label>
{
IsSuccess = label.Id > 0,
Data = label
};
}
2019-01-27 16:49:55 -06:00
public async Task<OperationResult<Label>> GetByName(string labelName, bool doFindIfNotInDatabase = false)
2018-12-15 16:35:20 -06:00
{
try
{
var sw = new Stopwatch();
sw.Start();
2019-07-03 11:21:29 -05:00
var cacheRegion = new Label { Name = labelName }.CacheRegion;
2019-01-27 16:49:55 -06:00
var cacheKey = string.Format("urn:Label_by_name:{0}", labelName);
2019-07-03 11:21:29 -05:00
var resultInCache = CacheManager.Get<Label>(cacheKey, cacheRegion);
2018-12-15 16:35:20 -06:00
if (resultInCache != null)
{
sw.Stop();
return new OperationResult<Label>
{
IsSuccess = true,
OperationTime = sw.ElapsedMilliseconds,
Data = resultInCache
};
}
2019-07-03 11:21:29 -05:00
2019-01-27 16:49:55 -06:00
var searchName = labelName.NormalizeName();
var specialSearchName = labelName.ToAlphanumericName();
2019-07-03 11:21:29 -05:00
var label = (from l in DbContext.Labels
where l.Name.Contains(searchName) ||
2019-01-27 16:49:55 -06:00
l.SortName.Contains(searchName) ||
l.AlternateNames.Contains(searchName) ||
2019-07-03 11:21:29 -05:00
l.AlternateNames.Contains(specialSearchName)
select l
).FirstOrDefault();
2018-12-15 16:35:20 -06:00
sw.Stop();
2019-01-27 16:49:55 -06:00
if (label == null || !label.IsValid)
2018-12-15 16:35:20 -06:00
{
2019-07-03 11:21:29 -05:00
Logger.LogInformation("LabelFactory: Label Not Found By Name [{0}]", labelName);
2018-12-15 16:35:20 -06:00
if (doFindIfNotInDatabase)
{
OperationResult<Label> LabelSearch = null;
try
{
2019-07-03 11:21:29 -05:00
LabelSearch = await PerformMetaDataProvidersLabelSearch(labelName);
2018-12-15 16:35:20 -06:00
}
catch (Exception ex)
{
2019-07-03 11:21:29 -05:00
Logger.LogError(ex);
2018-12-15 16:35:20 -06:00
}
2019-07-03 11:21:29 -05:00
2018-12-15 16:35:20 -06:00
if (LabelSearch.IsSuccess)
{
2019-01-27 16:49:55 -06:00
label = LabelSearch.Data;
2019-07-03 11:21:29 -05:00
var addResult = await Add(label);
2018-12-15 16:35:20 -06:00
if (!addResult.IsSuccess)
{
sw.Stop();
return new OperationResult<Label>
{
OperationTime = sw.ElapsedMilliseconds,
Errors = addResult.Errors
};
}
}
}
}
else
{
2019-07-03 11:21:29 -05:00
CacheManager.Add(cacheKey, label);
2018-12-15 16:35:20 -06:00
}
2019-07-03 11:21:29 -05:00
2018-12-15 16:35:20 -06:00
return new OperationResult<Label>
{
2019-01-27 16:49:55 -06:00
IsSuccess = label != null,
2018-12-15 16:35:20 -06:00
OperationTime = sw.ElapsedMilliseconds,
2019-01-27 16:49:55 -06:00
Data = label
2018-12-15 16:35:20 -06:00
};
}
catch (Exception ex)
{
2019-07-03 11:21:29 -05:00
Logger.LogError(ex);
2018-12-15 16:35:20 -06:00
}
2019-07-03 11:21:29 -05:00
2018-12-15 16:35:20 -06:00
return new OperationResult<Label>();
}
public async Task<OperationResult<Label>> PerformMetaDataProvidersLabelSearch(string LabelName)
{
SimpleContract.Requires<ArgumentNullException>(LabelName != null, "Invalid Label Name");
var sw = new Stopwatch();
sw.Start();
var result = new Label
{
Name = LabelName.ToTitleCase()
};
var resultsExceptions = new List<Exception>();
2019-07-03 11:21:29 -05:00
if (DiscogsLabelSearchEngine.IsEnabled)
2018-12-15 16:35:20 -06:00
{
2019-07-03 11:21:29 -05:00
var discogsResult = await DiscogsLabelSearchEngine.PerformLabelSearch(result.Name, 1);
2018-12-15 16:35:20 -06:00
if (discogsResult.IsSuccess)
{
var d = discogsResult.Data.First();
2019-07-03 11:21:29 -05:00
if (d.Urls != null) result.URLs = result.URLs.AddToDelimitedList(d.Urls);
2018-12-15 16:35:20 -06:00
if (d.AlternateNames != null)
result.AlternateNames = result.AlternateNames.AddToDelimitedList(d.AlternateNames);
2019-07-03 11:21:29 -05:00
if (!string.IsNullOrEmpty(d.LabelName) &&
!d.LabelName.Equals(result.Name, StringComparison.OrdinalIgnoreCase))
result.AlternateNames.AddToDelimitedList(new[] { d.LabelName });
2018-12-15 16:35:20 -06:00
result.CopyTo(new Label
{
2019-07-03 11:21:29 -05:00
Profile = HttpEncoder.HtmlEncode(d.Profile),
2018-12-15 16:35:20 -06:00
DiscogsId = d.DiscogsId,
Name = result.Name ?? d.LabelName.ToTitleCase(),
Thumbnail = d.LabelImageUrl != null ? WebHelper.BytesForImageUrl(d.LabelImageUrl) : null
});
}
2019-07-03 11:21:29 -05:00
if (discogsResult.Errors != null) resultsExceptions.AddRange(discogsResult.Errors);
2018-12-15 16:35:20 -06:00
}
sw.Stop();
return new OperationResult<Label>
{
Data = result,
IsSuccess = result != null,
Errors = resultsExceptions,
OperationTime = sw.ElapsedMilliseconds
};
}
}
}