using System; using System.Collections.Generic; using System.Reflection; using System.Runtime.Serialization; using Umbraco.Core.Models.Entities; namespace Umbraco.Core.Models { /// /// Represents a consent. /// [Serializable] [DataContract(IsReference = true)] internal class Consent : EntityBase, IConsent { private static PropertySelectors _selector; private bool _current; private string _source; private string _context; private string _action; private ConsentState _state; private string _comment; // ReSharper disable once ClassNeverInstantiated.Local private class PropertySelectors { public readonly PropertyInfo Current = ExpressionHelper.GetPropertyInfo(x => x.Current); public readonly PropertyInfo Source = ExpressionHelper.GetPropertyInfo(x => x.Source); public readonly PropertyInfo Context = ExpressionHelper.GetPropertyInfo(x => x.Context); public readonly PropertyInfo Action = ExpressionHelper.GetPropertyInfo(x => x.Action); public readonly PropertyInfo State = ExpressionHelper.GetPropertyInfo(x => x.State); public readonly PropertyInfo Comment = ExpressionHelper.GetPropertyInfo(x => x.Comment); } private static PropertySelectors Selectors => _selector ?? (_selector = new PropertySelectors()); /// public bool Current { get => _current; set => SetPropertyValueAndDetectChanges(value, ref _current, Selectors.Current); } /// public string Source { get => _source; set { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentException(nameof(value)); SetPropertyValueAndDetectChanges(value, ref _source, Selectors.Source); } } /// public string Context { get => _context; set { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentException(nameof(value)); SetPropertyValueAndDetectChanges(value, ref _context, Selectors.Context); } } /// public string Action { get => _action; set { if (string.IsNullOrWhiteSpace(value)) throw new ArgumentException(nameof(value)); SetPropertyValueAndDetectChanges(value, ref _action, Selectors.Action); } } /// public ConsentState State { get => _state; // note: we probably should validate the state here, but since the // enum is [Flags] with many combinations, this could be expensive set => SetPropertyValueAndDetectChanges(value, ref _state, Selectors.State); } /// public string Comment { get => _comment; set => SetPropertyValueAndDetectChanges(value, ref _comment, Selectors.Comment); } /// public IEnumerable History => HistoryInternal; /// /// Gets the previous states of this consent. /// internal List HistoryInternal { get; set; } } }