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;
}
}
}
}