369 lines
11 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|
|
}
|