using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Threading; using gehGassi.Domain.Common; using Microsoft.AspNetCore.Identity; using Newtonsoft.Json; namespace gehGassi.Domain.Users { /// /// Repräsentiert einen Benutzer der Zugriff auf die Applikation hat /// public class ApplicationUser : IdentityUser, IAuditable { /// /// Benutzername überschrieben, damit hier eine E-Mail Adresse erzwungen werden kann /// [Required] [MaxLength(256)] [EmailAddress] public sealed override string UserName { get; set; } /// /// Vorname /// [Required] [MaxLength(150)] public string FirstName { get; set; } /// /// Nachname /// [Required] [MaxLength(150)] public string LastName { get; set; } /// /// Voller Name - Wird in Views verwendet /// [Required] [MaxLength(320)] public string FullName { get; set; } /// /// Id der Timzone (Zeitzone) in welcher der Benutzer sich befindet /// [MaxLength(50)] public string TimeZoneId { get; set; } /// /// Bevorzugte Sprache (ISO2) /// [MaxLength(2)] public string PreferredLanguage { get; set; } /// /// Optional - Foto des Benutzers /// [MaxLength(256)] public string Photo { get; set; } /// /// Datum der Registrierung /// public DateTimeOffset? RegistrationDate { get; set; } /// /// Datum der letzten Anmeldung /// public DateTimeOffset? LastLoginDate { get; set; } /// /// Vordefinierte Permissions als packed string. /// [MaxLength(500)] public string Permissions { get; set; } /// /// Id des Kunden /// null wenn keiner zugeordnet /// public long? CustomerId { get; set; } /// /// Id des App-Users /// null, wenn keiner zugeordnet /// [MaxLength(128)] public string AppUserId { get; set; } /// /// Benutzereinstellungen /// public string SettingsJson { get; set; } /// /// Benutzer-Einstellungen /// [NotMapped] public UserSettings Settings { get { if (string.IsNullOrWhiteSpace(SettingsJson)) return new UserSettings(); var settings = JsonConvert.DeserializeObject(SettingsJson); return settings; } set { var settings = JsonConvert.SerializeObject(value); SettingsJson = settings; } } /// /// Name für Lookup-Operationen /// [NotMapped] public string NameForLookup { get { if (!string.IsNullOrWhiteSpace(FirstName) && !string.IsNullOrWhiteSpace(LastName) && FirstName.Length > 1 && LastName.Length > 1) return $"{FirstName} {LastName}"; else if (!string.IsNullOrWhiteSpace(FirstName) && FirstName.Length > 1 && string.IsNullOrWhiteSpace(LastName)) return FirstName; else if (string.IsNullOrWhiteSpace(FirstName) && !string.IsNullOrWhiteSpace(LastName) && LastName.Length > 1) return LastName; else return UserName; } } /// /// Erstellt eine Isntanz /// public ApplicationUser() { } /// /// Erstellt eine Instanz /// /// Benutzername /// Vorname /// Nachname public ApplicationUser(string userName, string firstName, string lastName) { UserName = userName; FirstName = firstName; LastName = lastName; RegistrationDate = DateTimeOffset.UtcNow; LastLoginDate = null; TimeZoneId = TimeZoneInfo.Local.Id; PreferredLanguage = Thread.CurrentThread.CurrentCulture.TwoLetterISOLanguageName; Photo = string.Empty; } /// /// Erstellt eine Instanz /// /// Benutzername /// Vorname /// Nachname /// Zeitzone /// Standard-Sprache public ApplicationUser(string userName, string firstName, string lastName, string timeZoneId, string preferredLanguage) : this(userName, firstName, lastName) { TimeZoneId = timeZoneId; PreferredLanguage = preferredLanguage; } #region IAuditable /// /// Gibt den eindeutigen Key für die Entität zurück; /// Hier als String gelöst, weil damit auch kombinierte Schlüssel möglich sind. /// /// Eindeutiger Key public string AuditKey() { return Id.ToString(); } /// /// Gibt den Objektnamen bzw. die Tabelle der Entität zurück /// /// Objektnamen public string AuditTable() { return "AspNetUsers"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } /// /// Hilfsklasse für Benutzer-Einstellungen. Wird als Json gespeichert /// public class UserSettings { /// /// Soll das Nav-Menü angezeigt werden? /// [JsonProperty("sidebarShow")] public bool SidebarShow { get; set; } /// /// Ist das Nav-Menü minimiert? /// [JsonProperty("sidebarMinimized")] public bool SidebarMinimized { get; set; } /// /// Gibt an ob Fido2 für den Benutzer aktiviert ist - zumindest 1 Provider. /// Bedeutet die Möglichkeit für Login ohne Passwort /// [JsonProperty("fido2Active")] public bool Fido2Active { get; set; } /// /// Id des zuletzt gewählten Kunden /// [JsonProperty("selectedCustomerId")] public long? SelectedCustomerId { get; set; } /// /// Id des zuletzt gewählten App-Users /// [JsonProperty("selectedAppUserId")] public string SelectedAppUserId { get; set; } /// /// Erstellt eine Instanz /// public UserSettings() { SidebarShow = true; SidebarMinimized = false; Fido2Active = false; } } /// /// Repräsentiert einen Benutzer mit aufgelösten Namen für View /// public class ApplicationUserWithNames { /// /// Id /// [Required] public string Id { get; set; } /// /// Benutzername überschrieben, damit hier eine E-Mail Adresse erzwungen werden kann /// [Required] [MaxLength(256)] [EmailAddress] public string UserName { get; set; } /// /// Vorname /// [Required] [MaxLength(150)] public string FirstName { get; set; } /// /// Nachname /// [Required] [MaxLength(150)] public string LastName { get; set; } /// /// Id der Timzone (Zeitzone) in welcher der Benutzer sich befindet /// [MaxLength(50)] public string TimeZoneId { get; set; } /// /// Bevorzugte Sprache (ISO2) /// [MaxLength(2)] public string PreferredLanguage { get; set; } /// /// Optional - Foto des Benutzers /// [MaxLength(256)] public string Photo { get; set; } /// /// Datum der Registrierung /// public DateTimeOffset? RegistrationDate { get; set; } /// /// Datum der letzten Anmeldung /// public DateTimeOffset? LastLoginDate { get; set; } /// /// Vordefinierte Permissions als packed string. /// [MaxLength(500)] public string Permissions { get; set; } /// /// Id des Kunden /// null wenn keiner zugeordnet /// public long? CustomerId { get; set; } /// /// Name des Kunden /// public string CustomerName { get; set; } /// /// Id des App-Users /// null, wenn keiner zugeordnet /// public string AppUserId { get; set; } /// /// Name des App-Users /// public string AppUserName { get; set; } /// /// 2-Faktor Authentifizierung aktiviert? /// public bool TwoFactorEnabled { get; set; } /// /// Email-Adresse bestätigt? /// public bool EmailConfirmed { get; set; } /// /// Name für Lookup-Operationen /// [NotMapped] public string NameForLookup { get { if (!string.IsNullOrWhiteSpace(FirstName) && !string.IsNullOrWhiteSpace(LastName) && FirstName.Length > 1 && LastName.Length > 1) return FirstName + " " + LastName; else if (!string.IsNullOrWhiteSpace(FirstName) && FirstName.Length > 1 && string.IsNullOrWhiteSpace(LastName)) return FirstName; else if (string.IsNullOrWhiteSpace(FirstName) && !string.IsNullOrWhiteSpace(LastName) && LastName.Length > 1) return LastName; else return UserName; } } } }