using Raven.Client.Documents; using System; using System.Linq; using System.Text; using System.Threading.Tasks; using zero.Core.Database; using zero.Core.Entities; using zero.Core.Models; using zero.Core.Renderer; namespace zero.Core.Options { public class SearchOptions : ZeroBackofficeCollection, IZeroCollectionOptions { public bool IsEnabled { get; set; } public SearchOptions() { IsEnabled = true; Map(); Map(); } public SearchIndexMap Map(string group = null) where T : ZeroEntity, new() { SearchIndexMap map = new(group); Items.Add(map); return map; } } public class SearchIndexMap { protected Type _type; protected string _group; protected string[] _fields; protected Func _modify; const string mapTemplate = @"map('{collection}', function (x) { return { Id: x.Id, Group: '{group}', Name: x.Name, IsActive: x.IsActive, Fields: [{fields}] }; });"; internal SearchIndexMap(Type type, string group) { _type = type; _group = group; } internal string BuildInstruction(IZeroIndexDefinition index, IDocumentStore store) { return TokenReplacement.Apply(mapTemplate, new() { { "collection", store.Conventions.GetCollectionName(_type) }, { "group", _group }, { "fields", BuildFieldArray(_fields) } }); } internal string BuildFieldArray(string[] fields) { if (fields == null || !fields.Any()) { return String.Empty; } return "x." + String.Join(", x.", fields); } } public class SearchIndexMap : SearchIndexMap where T : ZeroEntity { internal SearchIndexMap(string group) : base(typeof(T), group) {} public SearchIndexMap Display(Action modify = null) { _modify = (x, res) => { modify?.Invoke(x as T, res); return Task.CompletedTask; }; return this; } public SearchIndexMap Display(Func modify = null) { _modify = (x, res) => modify?.Invoke(x as T, res); return this; } public SearchIndexMap Fields(params string[] fieldNames) { _fields = fieldNames; return this; } } }