public async Task <IReadOnlyList <IConfigurationEntry> > GetEntries(string component, ConfigurationPath pathPrefix, bool forPages = false, bool recursive = true) { var filterBuilder = new FilterDefinitionBuilder <MongoDbConfigurationDocument>(); if (string.IsNullOrWhiteSpace(component)) { component = "root"; } var filter = filterBuilder.Eq(a => a.Component, component); if (!ConfigurationPath.IsNullOrEmpty(pathPrefix)) { filter = recursive ? filterBuilder.Regex(a => a.Path, new Regex(pathPrefix.ToString(asPrefix: true))) : filterBuilder.Eq(a => a.Path, pathPrefix.ToString()); } if (forPages) { filter = filter & filterBuilder.Eq(a => a.VisibleToPages, true); } var results = await settingsCollectionData.FindAsync(filter); var records = await results.ToListAsync(); return(records.Select(doc => RebuildConfigurationEntry(doc)).ToList()); }
public async Task <IConfigurationEntry> GetEntry(string component, ConfigurationPath path) { var filterBuilder = new FilterDefinitionBuilder <MongoDbConfigurationDocument>(); var filter = filterBuilder.Eq(a => a.Path, path.ToString()); if (string.IsNullOrWhiteSpace(component)) { component = RootComponentName; } filter &= filterBuilder.Eq(a => a.Component, component); var entries = await settingsCollectionData.FindAsync(filter); var result = await entries.FirstOrDefaultAsync(); return(result == null ? default : RebuildConfigurationEntry(result)); }
private static IEnumerable <string> ExtractLocationFragments(ConfigurationPath path) { var fragments = path.ToString().Split('/'); return(fragments.Take(fragments.Length - 1).SkipWhile(x => x == "")); }
public async Task <IConfigurationEntry> EnsureForEntry(string component, ConfigurationPath path, ConfigurationValue value, ConfigurationValueMeaning?meaning = null, string label = null, bool?visibleForPages = null) { var filterBuilder = new FilterDefinitionBuilder <MongoDbConfigurationDocument>(); if (string.IsNullOrWhiteSpace(component)) { component = RootComponentName; } var pathFilter = filterBuilder.Eq(a => a.Path, path.ToString()) & filterBuilder.Eq(a => a.Component, component); var entries = await settingsCollectionData.FindAsync(pathFilter); bool creatingNow = false; var entry = await entries.FirstOrDefaultAsync(); if (entry == null) { if (value == null) { throw new ArgumentNullException(nameof(value), "Value is mandatory in EnsureForEntity operation when no configuration value found in database"); } creatingNow = true; entry = new MongoDbConfigurationDocument { Component = string.IsNullOrWhiteSpace(component) ? null : component, Path = path, ValueType = value.Type.ToString() }; } if (meaning.HasValue) { entry.Meaning = meaning.Value.ToString(); } if (label != null) { entry.Label = label; } if (visibleForPages.HasValue) { entry.VisibleToPages = visibleForPages.Value; } if (creatingNow) { ApplyValueToConfigurationEntry(entry, value); await settingsCollectionData.InsertOneAsync(entry); } else { var updateBuilder = new UpdateDefinitionBuilder <MongoDbConfigurationDocument>(); List <UpdateDefinition <MongoDbConfigurationDocument> > updates = new List <UpdateDefinition <MongoDbConfigurationDocument> >(); if (visibleForPages.HasValue) { entry.VisibleToPages = visibleForPages.Value; updates.Add(updateBuilder.Set(a => a.VisibleToPages, entry.VisibleToPages)); } if (!string.IsNullOrWhiteSpace(label)) { entry.Label = label; updates.Add(updateBuilder.Set(a => a.Label, label)); } if (meaning.HasValue) { entry.Meaning = meaning.Value.ToString(); updates.Add(updateBuilder.Set(a => a.Meaning, meaning.ToString())); } if (value != null) { ApplyValueToConfigurationEntry(entry, value); updates.Add(updateBuilder.Set(a => a.ValueType, entry.ValueType)); updates.Add(updateBuilder.Set(a => a.StringValue, entry.StringValue)); updates.Add(updateBuilder.Set(a => a.BooleanValue, entry.BooleanValue)); updates.Add(updateBuilder.Set(a => a.LongValue, entry.LongValue)); updates.Add(updateBuilder.Set(a => a.DoubleValue, entry.DoubleValue)); updates.Add(updateBuilder.Set(a => a.BytesValue, entry.BytesValue)); } var builder = new FilterDefinitionBuilder <MongoDbConfigurationDocument>(); var filter = builder.Eq(a => a.Id, entry.Id); await settingsCollectionData.UpdateOneAsync(filter, updateBuilder.Combine(updates)); foreach (var change in updates) { } } return(RebuildConfigurationEntry(entry)); }