using MongoDB.Entities; using System.ComponentModel.DataAnnotations; namespace PrivaPub.Models.User { public class RootUser : Entity { [StringLength(32)] public string UserName { get; set; } [EmailAddress] public string Email { get; set; } public bool IsEmailValidated { get; set; } = false; public bool IsBanned { get; set; } = false; public string HashedPassword { get; set; } public List Policies { get; set; } = new() { ClientModels.Policies.IsUser }; public RootUserSettings Settings { get; set; } = new(); public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public DateTime UpdatedAt { get; set; } = DateTime.UtcNow; public DateTime? DeletedAt { get; set; } public DateTime? CredentialsChangedAt { get; set; }//when RootSessions last ended every session public string SessionStamp { get; set; }//carried by every /clientapi token; a new one ends the tokens issued before /// An administrator is a moderator too (IsAdminPolicy asks for both); otherwise a plain user. public void SetAdmin(bool admin) { Policies.RemoveAll(p => p is ClientModels.Policies.IsAdmin or ClientModels.Policies.IsModerator); if (admin) Policies.AddRange([ClientModels.Policies.IsAdmin, ClientModels.Policies.IsModerator]); if (!Policies.Contains(ClientModels.Policies.IsUser)) Policies.Add(ClientModels.Policies.IsUser); UpdatedAt = DateTime.UtcNow; } } public class RootUserSettings { public string LanguageCode { get; set; } = "en-GB"; public short IconsThemeIndexColour { get; set; } = 25; public short LightThemeIndexColour { get; set; } = 25; public short DarkThemeIndexColour { get; set; } = 215; public bool PreferSystemTheming { get; set; } = true; public bool ThemeIsDarkMode { get; set; } = false; public bool ThemeIsDarkGray { get; set; } = false; public bool ThemeIsLightGray { get; set; } = true; } }