using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Security.Cryptography; using System.ComponentModel.DataAnnotations; using PersonalFinance.Utils; using System.ComponentModel.DataAnnotations.Schema; using System.Globalization; namespace PersonalFinance { /// /// Genger /// public enum Sex { Male, Female } /// /// User class for storing payments of each member of the family /// Each user has its own financial management /// public class User { public User() {} public User(string password) { SetPassword(password); } /// /// Unique user identification number (Primary key) /// [Key] public int UserId { get; set; } /// /// Unique name for sign in /// private string login; [Required] public string Login { get { return login; } set { if (value == null) { throw new ArgumentNullException("Login cannot be null."); } else if (value.Length < 3) { throw new ArgumentOutOfRangeException("Login must be at least 3 character length!"); } else { login = RemoveDiacritics(value); } } } private string RemoveDiacritics(string text) { var normalizedString = text.Normalize(NormalizationForm.FormD); var stringBuilder = new StringBuilder(); foreach (var c in normalizedString) { var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c); if (unicodeCategory != UnicodeCategory.NonSpacingMark) { stringBuilder.Append(c); } } return stringBuilder.ToString().Normalize(NormalizationForm.FormC); } /// /// Password for sign in /// [Required] private string password; public string Password { get { return password; } } private string name; /// /// User real name /// public string Name { get { return name; } set { if (value == null) { throw new ArgumentNullException("Name cannot be null."); } else { name = value; } } } /// /// User real lastname /// private string lastname; public string Lastname { get { return lastname; } set { if (value == null) { throw new ArgumentNullException("Lastname cannot be null."); } else { lastname = value; } } } /// /// Sex (gender) of user /// public Sex Sex { get; set; } public void SetPassword(string passwordToHash) { if (passwordToHash == null) throw new ArgumentNullException(); else if (passwordToHash.Length < 6) throw new ArgumentOutOfRangeException("Password must be at least 6 character length!"); this.password = PasswordHash.CreateHash(passwordToHash); } public bool ComparePassword(string passwordToCompare) { return PasswordHash.ValidatePassword(passwordToCompare, Password); } public override string ToString() { return string.Format("User {0}: {1} ({2} {3})", UserId, Login, Name, Lastname); } } }