using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.ComponentModel; using System.Collections.ObjectModel; namespace Model { /// /// A user is an entity with a name, a surname, mail, profilePict and a list of priority. /// This user can login with an Id and a password /// [DataContract(Name = "user")] public class User : IEquatable , INotifyPropertyChanged { #region Private Attributes [DataMember] private string _name = ""; [DataMember] private string _surname = ""; [DataMember] private string _mail = ""; [DataMember(Name = "priorities")] public ObservableCollection _priorities { get; private set; } = new ObservableCollection { Priority.Gourmet, Priority.Economic, Priority.Fast, Priority.Light, Priority.Easy }; public event PropertyChangedEventHandler? PropertyChanged; #endregion #region Properties /// /// Property to get Name of users and a setter /// /// Setter have Exception which is trigger when Name is null public string Name { get { return _name; } set { _name = value; OnPropertyChanged(); } } /// /// Property to get Surname of users and a setter /// /// Setter have Exception which is trigger when Surname is null public string Surname { get { return _surname; } set { _surname = value; OnPropertyChanged(); } } /// /// Property to get mail of users and a setter /// /// User's mail will serve to log the user. So there's no setter, just an init. User will enter one time his email at his /// account creation. public string Mail { get { return _mail; } private init { if (string.IsNullOrWhiteSpace(value)) { throw new ArgumentException("Impossible d'avoir un champ Email vide!"); } _mail = value; } } /// /// The user's hashed password. The hashed method is defined with the PasswordManager. ///
See: . ///
[DataMember(Name = "hashedpass")] public string Password { get; private set; } = ""; /// /// For now, we define the ProfilePict as a string which is "PhotoParDefaut" /// when the value is null. /// [DataMember(Name = "profilepic")] public string ProfilePict { get; private set; } = "default_picture.png"; /// /// This is the list of priorities specific tu the user. This list is initiate /// by default. User could change it at will. /// public ReadOnlyObservableCollection Priorities { get; private set; } #endregion #region Methods public override bool Equals(object? other) { if (ReferenceEquals(other, null)) return false; if (ReferenceEquals(other, this)) return true; if (GetType() != other.GetType()) return false; return Equals(other as User); } public bool Equals(User? other) { if (other == null) return false; if (other == this) return true; return Name.Equals(other.Name) && Surname.Equals(other.Surname) && Mail.Equals(other.Mail); } public override int GetHashCode() { throw new NotImplementedException(); } protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { if (PropertyChanged != null) PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } public override string ToString() { return $"{Name} {Surname}"; } #endregion #region Constructors /// /// Construtors of user. /// /// The name of the user /// The surname of the user /// The user needs an email to login. /// The password of the new user. public User(string name, string surname, string mail, string hashedPassword) { Name = name; Surname = surname; Mail = mail; Password = hashedPassword; Priorities = new ReadOnlyObservableCollection(_priorities); } /// /// Profile picture of the new user. public User(string name, string surname, string mail, string hashedPassword, string profilePict) : this(name, surname, mail, hashedPassword) { ProfilePict = profilePict; } /// public User() : this("John", "Doe", "truc@gmail.com", "mdp") { } /// /// The user to copy. public User(User user) { Name = user.Name; Surname = user.Surname; Mail = user.Mail; Password = user.Password; _priorities = user._priorities; Priorities = new ReadOnlyObservableCollection(_priorities); ProfilePict = user.ProfilePict; } #endregion } }