Files
jsmr/JSMR.Application/Logging/LoggingExtensions.cs
Brian Bicknell 2418bd0a8f
All checks were successful
ci / build-test (push) Successful in 2m17s
ci / publish-image (push) Has been skipped
Updated search logic. More UI updates.
2025-11-17 21:05:55 -05:00

91 lines
3.7 KiB
C#

using JSMR.Application.Circles.Queries.Search;
using JSMR.Application.Common.Search;
using JSMR.Application.Creators.Queries.Search.Contracts;
using JSMR.Application.Tags.Queries.Search.Contracts;
using JSMR.Application.VoiceWorks.Queries.Search;
namespace JSMR.Application.Logging;
public static class LoggingExtensions
{
public static object ToLogObject<TCriteria, TSortField>(this SearchOptions<TCriteria, TSortField> searchOptions)
where TCriteria : new()
where TSortField : struct, Enum
{
return new LogObjectBuilder()
.Add("PageNumber", searchOptions.PageNumber)
.Add("PageSize", searchOptions.PageSize)
.Add("Criteria", MapCriteriaToLogObject(searchOptions.Criteria))
//.AddIfNotEmpty("Sort", searchOptions.SortOptions.ToLogObject())
.Build();
}
private static object MapCriteriaToLogObject<TCriteria>(TCriteria criteria) => criteria switch
{
VoiceWorkSearchCriteria voiceWorkSearchCriteria => voiceWorkSearchCriteria.ToLogObject(),
CircleSearchCriteria circleSearchCriteria => circleSearchCriteria.ToLogObject(),
TagSearchCriteria tagSearchCriteria => tagSearchCriteria.ToLogObject(),
CreatorSearchCriteria creatorSearchCriteria => creatorSearchCriteria.ToLogObject(),
_ => criteria!
};
public record SortLog(int Index, string Field, string Direction);
public static object ToLogObject<TSortField>(this IEnumerable<SortOption<TSortField>> sort)
where TSortField : struct, Enum
{
return sort.Select((sortOption, index) =>
new {
Index = index,
Field = sortOption.Field.ToString(),
Direction = sortOption.Direction.ToString()
}
).ToList();
}
public static object ToLogObject(this VoiceWorkSearchCriteria criteria)
{
return new LogObjectBuilder()
.AddIfNotEmpty("Keywords", criteria.Keywords)
.AddIfNotEmpty("Title", criteria.Title)
.AddIfNotEmpty("Circle", criteria.Circle)
.Add("Locale", criteria.Locale)
.AddIfNotEmpty("SaleStatus", criteria.SaleStatus.ToString())
.AddIfNotEmpty("CircleStatus", criteria.CircleStatus.ToString())
.AddIfNotEmpty("TagStatus", criteria.TagStatus.ToString())
.AddIfNotEmpty("CreatorStatus", criteria.CreatorStatus.ToString())
.AddIfNotEmpty("AgeRatings", criteria.AgeRatings)
.AddIfNotEmpty("Languages", criteria.SupportedLanguages)
.AddIfNotEmpty("TagIds", criteria.TagIds, preview: 5)
.AddIfNotEmpty("CreatorIds", criteria.CreatorIds, preview: 5)
.Add("IncludeAllTags", criteria.IncludeAllTags ? true : null)
.Add("IncludeAllCreators", criteria.IncludeAllCreators ? true : null)
.Add("MinDownloads", criteria.MinDownloads)
.Add("MaxDownloads", criteria.MaxDownloads)
.Add("ReleaseDateStart", criteria.ReleaseDateStart)
.Add("ReleaseDateEnd", criteria.ReleaseDateEnd)
.Build();
}
public static object ToLogObject(this CircleSearchCriteria criteria)
{
return new LogObjectBuilder()
.AddIfNotEmpty("Name", criteria.Name)
.AddIfNotEmpty("Status", criteria.Status?.ToString())
.Build();
}
public static object ToLogObject(this TagSearchCriteria criteria)
{
return new LogObjectBuilder()
.AddIfNotEmpty("Name", criteria.Name)
.Build();
}
public static object ToLogObject(this CreatorSearchCriteria criteria)
{
return new LogObjectBuilder()
.AddIfNotEmpty("Name", criteria.Name)
.Build();
}
}