369 lines
11 KiB
C#

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