big big update

This commit is contained in:
2024-06-30 18:19:00 +02:00
parent b592dde7bb
commit 2f1e9716fe
30 changed files with 388 additions and 112 deletions

View File

@@ -1,4 +1,4 @@
namespace OwnChar.Manager.Exceptions; namespace OwnChar.Api.Exceptions;
public class LoginException(string message) : Exception(message) public class LoginException(string message) : Exception(message)
{ {

View File

@@ -0,0 +1,11 @@
using OwnChar.Model;
namespace OwnChar.Api;
public interface ICharacterManager
{
Character? CreateCharacter(string? name);
Character? CreateCharacter(string? name, Group? destination);
bool DeleteCharacter(Character? character);
IEnumerable<Character>? GetCharacters(Group? group);
IEnumerable<Character>? GetCharacters(UserProfile? profile);
}

View File

@@ -0,0 +1,33 @@
using OwnChar.Data;
using OwnChar.Model;
namespace OwnChar.Api;
public interface IDataManager
{
public delegate void OnActionEventHandler(object sender, OnActionEventArgs e);
public delegate void OnCallbackEventHandler(object sender, OnCallbackEventArgs e);
event OnActionEventHandler? OnAction;
event OnCallbackEventHandler? OnCallback;
// Login
UserAccount? Login(string username, string password);
bool Logout(UserAccount? account);
// Action
DataManagerActionResult ExecuteAction(DataManagerAction action, DataManagerActionType actionType, UserAccount currentUser, OwnCharObject? obj, params object?[] parameters);
//// User management
//UserProfile? GetUserProfile(UserAccount account);
//// Group management
//UserProfile? GetOwner(UserAccount account, Group group);
//IEnumerable<UserProfile>? GetMembers(UserAccount account, Group group);
//bool AddMember(UserAccount account, Group group, UserProfile user);
//bool RemoveMember(UserAccount account, Group group, UserProfile user);
//// Character management
//UserProfile? GetOwner(UserAccount account, Character group);
//IEnumerable<Character>? GetCharacters(UserAccount account, Group group);
//IEnumerable<Character>? GetCharacters(UserAccount account, UserProfile profile);
}

View File

@@ -1,18 +1,17 @@
using OwnChar.Model; using OwnChar.Model;
namespace OwnChar.Data; namespace OwnChar.Api;
public interface IDataProvider public interface IDataProvider
{ {
// General bool IsInitialized();
abstract bool IsInitialized(); void SetInitialized();
abstract void SetInitialized(); bool SaveDatabase();
abstract bool SaveDatabase();
// Model // Model
abstract T? Create<T>() where T : class, IOwnCharObject; abstract T? Create<T>() where T : OwnCharObject;
abstract bool Save<T>(T obj) where T : class, IOwnCharObject; abstract bool Save<T>(T obj) where T : OwnCharObject;
abstract bool Delete<T>(T obj) where T : class, IOwnCharObject; abstract bool Delete<T>(T obj) where T : OwnCharObject;
// Hierarchy // Hierarchy
abstract bool SetParent(UserProfile profile, UserAccount parent); abstract bool SetParent(UserProfile profile, UserAccount parent);

View File

@@ -0,0 +1,12 @@
using OwnChar.Model;
namespace OwnChar.Api;
public interface IGroupsManager
{
bool AddMember(UserProfile? profile, Group? group);
Group? CreateGroup(string? name);
bool DeleteGroup(Group? group);
bool DeleteMember(UserProfile? profile, Group? group);
IEnumerable<UserProfile>? GetMembers(Group? group);
UserProfile? GetOwner(Group? group);
}

View File

@@ -0,0 +1,17 @@
using OwnChar.Model;
using Pilz.Cryptography;
namespace OwnChar.Api;
public interface IOwnCharManager
{
IDataManager? DataManager { get; set; }
UserAccount? CurrentUser { get; }
bool IsLoggedIn { get; }
IUserManager Users { get; }
IGroupsManager Groups { get; }
ICharacterManager Characters { get; }
bool Login(IDataManager? proxy, string? username, SecureString? password);
bool Logout();
}

View File

@@ -0,0 +1,10 @@
using OwnChar.Model;
using Pilz.Cryptography;
namespace OwnChar.Api;
public interface IUserManager
{
UserAccount? CreateUserAccount(string? username, SecureString? password);
bool DeleteUserAccount(UserAccount? account);
UserProfile? GetOwnUserProfile();
}

View File

@@ -0,0 +1,57 @@
namespace OwnChar.Data;
public class DataManagerAction(string id)
{
public DataManagerAction? BaseAction { get; }
public string ActionId
{
get
{
if (BaseAction != null)
return $"{BaseAction.ActionId}.{id}";
return id;
}
}
public DataManagerAction(DataManagerAction baseAction, string id) : this(id)
{
BaseAction = baseAction;
}
public static bool operator ==(DataManagerAction? a, DataManagerAction? b)
{
if (a is null || b is null)
return false;
if (a.ActionId == b.ActionId)
return true;
if (a.BaseAction != null && a.BaseAction.ActionId == b.ActionId)
return true;
if (b.BaseAction != null && a.ActionId == b.BaseAction.ActionId)
return true;
return false;
}
public static bool operator !=(DataManagerAction? a, DataManagerAction? b)
{
return !(a == b);
}
public override bool Equals(object? obj)
{
if (ReferenceEquals(this, obj))
return true;
if (obj is not DataManagerAction action)
return false;
return action == this;
}
public override int GetHashCode()
{
return ActionId.GetHashCode();
}
}

View File

@@ -0,0 +1,6 @@
namespace OwnChar.Data;
public record class DataManagerActionResult(bool HasSuccess, object? Result)
{
public static DataManagerActionResult NonSuccess { get; } = new(false, null);
}

View File

@@ -0,0 +1,9 @@
namespace OwnChar.Data;
public enum DataManagerActionType
{
Default,
Get,
Set,
Delete,
}

View File

@@ -0,0 +1,23 @@
namespace OwnChar.Data;
public static class DataManagerActions
{
public static DataManagerAction Create { get; } = new("create");
public static DataManagerAction Save { get; } = new("save");
public static DataManagerAction Delete { get; } = new("delete");
public static DataManagerAction Associate { get; } = new("associate");
public static class Creation
{
public static DataManagerAction UserAccount { get; } = new(Create, "useraccount");
public static DataManagerAction Group { get; } = new(Create, "group");
public static DataManagerAction Character { get; } = new(Create, "character");
}
public static class Association
{
public static DataManagerAction Owner { get; } = new(Associate, "owner");
public static DataManagerAction Parent { get; } = new(Associate, "parent");
public static DataManagerAction Members { get; } = new(Associate, "members");
}
}

View File

@@ -1,30 +0,0 @@
using OwnChar.Model;
namespace OwnChar.Data;
public interface IDataManager
{
// Login
abstract UserAccount? Login(string username, string password);
abstract bool Logout(UserAccount? account);
// User management
abstract UserAccount? CreateUserAccount(UserAccount account, string username, string password);
abstract UserProfile? GetUserProfile(UserAccount account);
abstract bool DeleteUserAccount(UserAccount account);
// Group management
abstract UserProfile? GetOwner(UserAccount account, Group group);
abstract IEnumerable<UserProfile>? GetMembers(UserAccount account, Group group);
abstract bool AddMember(UserAccount account, Group group, UserProfile user);
abstract bool RemoveMember(UserAccount account, Group group, UserProfile user);
abstract Group? CreateGroup(UserAccount account, string name);
abstract bool DeleteGroup(UserAccount account, Group group);
// Character management
abstract UserProfile? GetOwner(UserAccount account, Character group);
abstract IEnumerable<Character>? GetCharacters(UserAccount account, Group group);
abstract IEnumerable<Character>? GetCharacters(UserAccount account, UserProfile profile);
abstract Character? CreateCharacter(UserAccount account, string name, Group? group);
abstract bool DeleteCharacter(UserAccount account, Character character);
}

View File

@@ -1,9 +1,13 @@
using OwnChar.Model; using OwnChar.Api;
using OwnChar.Model;
namespace OwnChar.Data.Managers; namespace OwnChar.Data.Managers;
public class DefaultDataManager : IDataManager public class DefaultDataManager : IDataManager
{ {
public event IDataManager.OnActionEventHandler? OnAction;
public event IDataManager.OnCallbackEventHandler? OnCallback;
private const string defaultUsername = "admin"; private const string defaultUsername = "admin";
private const string defaultPassword = "admin"; private const string defaultPassword = "admin";
@@ -15,6 +19,101 @@ public class DefaultDataManager : IDataManager
Initialize(false); Initialize(false);
} }
public virtual DataManagerActionResult ExecuteAction(DataManagerAction action, DataManagerActionType actionType, UserAccount currentUser, OwnCharObject? obj, params object?[] parameters)
{
var success = false;
var e = new OnActionEventArgs(action, actionType, currentUser, obj, parameters);
OnAction?.Invoke(this, e);
if (e.IsHandled)
return new(true, e.Result);
if (HandleCreate(e)
|| HandleDelete(e)
|| HandleSave(e)
|| HandleAssociation(e))
success = true;
OnCallback?.Invoke(this, new(action, actionType, success, e.Result));
return new(success, e.Result);
}
protected virtual bool HandleCreate(OnActionEventArgs e)
{
if (e.Action != DataManagerActions.Create)
return false;
// Character
if (e.Action == DataManagerActions.Creation.Character)
{
if (e.Object is not Group group || e.Parameters.Length < 1 || e.Parameters[0] is not string name)
return false;
e.Result = CreateCharacter(e.CurrentUser, name, group);
return e.Result != null;
}
// Group
if (e.Action == DataManagerActions.Creation.Group)
{
if (e.Parameters.Length < 1 || e.Parameters[0] is not string name)
return false;
e.Result = CreateGroup(e.CurrentUser, name);
return e.Result != null;
}
// User
if (e.Action == DataManagerActions.Creation.UserAccount)
{
if (e.Parameters.Length < 2 || e.Parameters[0] is not string username || e.Parameters[1] is not string password)
return false;
e.Result = CreateUserAccount(username, password);
return e.Result != null;
}
return false;
}
protected virtual bool HandleSave(OnActionEventArgs e)
{
if (e.Action != DataManagerActions.Save)
return false;
// ...
return false;
}
protected virtual bool HandleDelete(OnActionEventArgs e)
{
if (e.Action != DataManagerActions.Delete)
return false;
// Character
if (e.Object is Character character)
return DeleteCharacter(e.CurrentUser, character);
// Group
if (e.Object is Group group)
return DeleteGroup(e.CurrentUser, group);
// User
if (e.Object is UserAccount userAccount)
return DeleteUserAccount(userAccount);
return false;
}
protected virtual bool HandleAssociation(OnActionEventArgs e)
{
if (e.Action != DataManagerActions.Associate)
return false;
// ...
return false;
}
public IEnumerable<UserProfile>? GetMembers(UserAccount account, Group group) public IEnumerable<UserProfile>? GetMembers(UserAccount account, Group group)
{ {
if (!account.HasPermission(UserType.Guest)) if (!account.HasPermission(UserType.Guest))
@@ -67,7 +166,7 @@ public class DefaultDataManager : IDataManager
return result; return result;
} }
public UserAccount? CreateUserAccount(string username, string password) protected virtual UserAccount? CreateUserAccount(string username, string password)
{ {
var account = DataProvider.Create<UserAccount>(); var account = DataProvider.Create<UserAccount>();
var profile = DataProvider.Create<UserProfile>(); var profile = DataProvider.Create<UserProfile>();
@@ -93,7 +192,7 @@ public class DefaultDataManager : IDataManager
return account; return account;
} }
public bool DeleteUserAccount(UserAccount account) protected virtual bool DeleteUserAccount(UserAccount account)
{ {
if (!string.IsNullOrWhiteSpace(account.Username) && DataProvider.GetUserProfile(account.Username) is UserProfile userProfile) if (!string.IsNullOrWhiteSpace(account.Username) && DataProvider.GetUserProfile(account.Username) is UserProfile userProfile)
userProfile.Name = "Deleted user"; userProfile.Name = "Deleted user";
@@ -129,7 +228,7 @@ public class DefaultDataManager : IDataManager
return DataProvider.RemoveMember(group, user); return DataProvider.RemoveMember(group, user);
} }
public Group? CreateGroup(UserAccount account, string name) protected virtual Group? CreateGroup(UserAccount account, string name)
{ {
if (!account.HasPermission(UserType.User) || GetUserProfile(account) is not UserProfile profile || DataProvider.Create<Group>() is not Group group) if (!account.HasPermission(UserType.User) || GetUserProfile(account) is not UserProfile profile || DataProvider.Create<Group>() is not Group group)
return null; return null;
@@ -143,14 +242,14 @@ public class DefaultDataManager : IDataManager
return group; return group;
} }
public bool DeleteGroup(UserAccount account, Group group) protected virtual bool DeleteGroup(UserAccount account, Group group)
{ {
if (GetUserProfile(account) is not UserProfile profile || DataProvider.GetOwner(group) is not UserProfile owner || !account.HasPermission(profile == owner ? UserType.User : UserType.Admin)) if (GetUserProfile(account) is not UserProfile profile || DataProvider.GetOwner(group) is not UserProfile owner || !account.HasPermission(profile == owner ? UserType.User : UserType.Admin))
return false; return false;
return DataProvider.Delete(group); return DataProvider.Delete(group);
} }
public Character? CreateCharacter(UserAccount account, string name, Group? group) protected virtual Character? CreateCharacter(UserAccount account, string name, Group? group)
{ {
if (!account.HasPermission(UserType.User) || GetUserProfile(account) is not UserProfile profile || DataProvider.Create<Character>() is not Character character) if (!account.HasPermission(UserType.User) || GetUserProfile(account) is not UserProfile profile || DataProvider.Create<Character>() is not Character character)
return null; return null;
@@ -167,7 +266,7 @@ public class DefaultDataManager : IDataManager
return character; return character;
} }
public bool DeleteCharacter(UserAccount account, Character character) protected virtual bool DeleteCharacter(UserAccount account, Character character)
{ {
if (GetUserProfile(account) is not UserProfile profile || DataProvider.GetOwner(character) is not UserProfile owner || !account.HasPermission(profile == owner ? UserType.User : UserType.Admin)) if (GetUserProfile(account) is not UserProfile profile || DataProvider.GetOwner(character) is not UserProfile owner || !account.HasPermission(profile == owner ? UserType.User : UserType.Admin))
return false; return false;

View File

@@ -1,5 +1,5 @@
namespace OwnChar.Data.Managers; namespace OwnChar.Data.Managers;
public class ClientDataManager public class HttpClientDataManager
{ {
} }

View File

@@ -0,0 +1,14 @@
using OwnChar.Model;
namespace OwnChar.Data;
public class OnActionEventArgs(DataManagerAction action, DataManagerActionType actionType, UserAccount currentUser, OwnCharObject obj, object?[] parameters) : EventArgs
{
public DataManagerAction Action { get; } = action;
public DataManagerActionType ActionType { get; } = actionType;
public UserAccount CurrentUser { get; } = currentUser;
public OwnCharObject Object { get; } = obj;
public object?[] Parameters { get; } = parameters;
public bool IsHandled { get; set; }
public object? Result { get; set; }
}

View File

@@ -0,0 +1,12 @@
using OwnChar.Model;
using System;
namespace OwnChar.Data;
public class OnCallbackEventArgs(DataManagerAction action, DataManagerActionType actionType, bool success, object? result) : EventArgs
{
public DataManagerAction Action { get; } = action;
public DataManagerActionType ActionType { get; } = actionType;
public bool Success { get; } = success;
public object? Result { get; } = result;
}

View File

@@ -1,4 +1,5 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using OwnChar.Api;
using OwnChar.Data.Providers.JsonFile.Model; using OwnChar.Data.Providers.JsonFile.Model;
using OwnChar.Model; using OwnChar.Model;
@@ -41,10 +42,10 @@ public class JsonFileDataProvider : IDataProvider
Formatting = Formatting.Indented, Formatting = Formatting.Indented,
}; };
} }
public T? Create<T>() where T : class, IOwnCharObject public T? Create<T>() where T : class, OwnCharObject
{ {
var t = typeof(T); var t = typeof(T);
IOwnCharObject? obj; OwnCharObject? obj;
if (t == typeof(Property)) if (t == typeof(Property))
obj = new JsonProp(); obj = new JsonProp();
@@ -64,7 +65,7 @@ public class JsonFileDataProvider : IDataProvider
return obj as T; return obj as T;
} }
public bool Save<T>(T obj) where T : class, IOwnCharObject public bool Save<T>(T obj) where T : class, OwnCharObject
{ {
if (obj is JsonCharacter character) if (obj is JsonCharacter character)
{ {
@@ -95,7 +96,7 @@ public class JsonFileDataProvider : IDataProvider
JsonFile.IsInitialized = true; JsonFile.IsInitialized = true;
} }
public bool Delete<T>(T obj) where T : class, IOwnCharObject public bool Delete<T>(T obj) where T : class, OwnCharObject
{ {
if (obj is JsonCharacter character) if (obj is JsonCharacter character)
{ {

View File

@@ -1,17 +1,16 @@
using OwnChar.Model; using OwnChar.Api;
using OwnChar.Model;
namespace OwnChar.Manager; namespace OwnChar.Manager.Modules;
public class CharacterManager(OwnCharManager manager) public class CharacterManager(OwnCharManager manager) : OwnCharManagerModule(manager), ICharacterManager
{ {
public OwnCharManager Manager { get; } = manager;
public IEnumerable<Character>? GetCharacters(Group? group) public IEnumerable<Character>? GetCharacters(Group? group)
{ {
Manager.CheckLogin(); Manager.CheckLogin();
if (group != null) if (group != null)
return Manager.DataManager.GetCharacters(Manager.CurrentUser, group); return Manager.DataManager?.GetCharacters(Manager.CurrentUser!, group);
return null; return null;
} }
@@ -21,7 +20,7 @@ public class CharacterManager(OwnCharManager manager)
Manager.CheckLogin(); Manager.CheckLogin();
if (profile != null) if (profile != null)
return Manager.DataManager.GetCharacters(Manager.CurrentUser, profile); return Manager.DataManager?.GetCharacters(Manager.CurrentUser!, profile);
return null; return null;
} }
@@ -34,14 +33,18 @@ public class CharacterManager(OwnCharManager manager)
public Character? CreateCharacter(string? name, Group? destination) public Character? CreateCharacter(string? name, Group? destination)
{ {
ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name)); ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.CreateCharacter(Manager.CurrentUser, name, destination);
return Manager.DataManager?.CreateCharacter(Manager.CurrentUser!, name, destination);
} }
public bool DeleteCharacter(Character? character) public bool DeleteCharacter(Character? character)
{ {
ArgumentNullException.ThrowIfNull(character, nameof(character)); ArgumentNullException.ThrowIfNull(character, nameof(character));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.DeleteCharacter(Manager.CurrentUser, character);
return Manager.DataManager?.DeleteCharacter(Manager.CurrentUser!, character) ?? false;
} }
} }

View File

@@ -1,52 +1,50 @@
using OwnChar.Model; using OwnChar.Api;
using OwnChar.Data;
using OwnChar.Model;
namespace OwnChar.Manager; namespace OwnChar.Manager.Modules;
public class GroupsManager(OwnCharManager manager) public class GroupsManager(OwnCharManager manager) : OwnCharManagerModule(manager), IGroupsManager
{ {
public OwnCharManager Manager { get; } = manager;
public UserProfile? GetOwner(Group? group) public UserProfile? GetOwner(Group? group)
{ {
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); return Manager.DataManager?.GetOwner(Manager.CurrentUser!, group);
return Manager.DataManager.GetOwner(Manager.CurrentUser, group);
} }
public IEnumerable<UserProfile>? GetMembers(Group? group) public IEnumerable<UserProfile>? GetMembers(Group? group)
{ {
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); return Manager.DataManager?.GetMembers(Manager.CurrentUser!, group);
return Manager.DataManager.GetMembers(Manager.CurrentUser, group);
} }
public bool AddMember(UserProfile? profile, Group? group) public bool AddMember(UserProfile? profile, Group? group)
{ {
Manager.CheckLogin();
ArgumentNullException.ThrowIfNull(profile, nameof(profile)); ArgumentNullException.ThrowIfNull(profile, nameof(profile));
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Set, Manager.CurrentUser!, profile, group).HasSuccess;
return Manager.DataManager.AddMember(Manager.CurrentUser, group, profile);
} }
public bool DeleteMember(UserProfile? profile, Group? group) public bool DeleteMember(UserProfile? profile, Group? group)
{ {
Manager.CheckLogin();
ArgumentNullException.ThrowIfNull(profile, nameof(profile)); ArgumentNullException.ThrowIfNull(profile, nameof(profile));
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Delete, Manager.CurrentUser!, profile, group).HasSuccess;
return Manager.DataManager.RemoveMember(Manager.CurrentUser, group, profile);
} }
public Group? CreateGroup(string? name) public Group? CreateGroup(string? name)
{ {
ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.CreateGroup(Manager.CurrentUser, name); ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name));
return Manager.DataManager.ExecuteAction(DataManagerActions.Creation.Group, DataManagerActionType.Default, Manager.CurrentUser!, null, name).Result as Group;
} }
public bool DeleteGroup(Group? group) public bool DeleteGroup(Group? group)
{ {
ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.DeleteGroup(Manager.CurrentUser, group); ArgumentNullException.ThrowIfNull(group, nameof(group));
return Manager.DataManager.ExecuteAction(DataManagerActions.Delete, DataManagerActionType.Default, Manager.CurrentUser!, group).HasSuccess;
} }
} }

View File

@@ -1,31 +1,28 @@
using OwnChar.Model; using OwnChar.Api;
using OwnChar.Model;
using Pilz.Cryptography; using Pilz.Cryptography;
namespace OwnChar.Manager; namespace OwnChar.Manager.Modules;
public class UserManager(OwnCharManager manager) public class UserManager(OwnCharManager manager) : OwnCharManagerModule(manager), IUserManager
{ {
public OwnCharManager Manager { get; } = manager;
public UserProfile? GetOwnUserProfile() public UserProfile? GetOwnUserProfile()
{ {
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.GetUserProfile(Manager.CurrentUser); return Manager.DataManager!.GetUserProfile(Manager.CurrentUser!);
} }
public UserAccount? CreateUserAccount(string? username, SecureString? password) public UserAccount? CreateUserAccount(string? username, SecureString? password)
{ {
ArgumentException.ThrowIfNullOrWhiteSpace(username, nameof(username)); ArgumentException.ThrowIfNullOrWhiteSpace(username, nameof(username));
ArgumentException.ThrowIfNullOrWhiteSpace(password, nameof(password)); ArgumentException.ThrowIfNullOrWhiteSpace(password, nameof(password));
Manager.CheckLogin();
username = username.Trim().ToLower(); username = username.Trim().ToLower();
return Manager.DataManager.CreateUserAccount(Manager.CurrentUser, username, Utils.HashPassword(username, password)); return Manager.DataManager?.CreateUserAccount(username, Utils.HashPassword(username, password));
} }
public bool DeleteUserAccount(UserAccount? account) public bool DeleteUserAccount(UserAccount? account)
{ {
ArgumentNullException.ThrowIfNull(account, nameof(account)); ArgumentNullException.ThrowIfNull(account, nameof(account));
Manager.CheckLogin(); return Manager.DataManager?.DeleteUserAccount(account) ?? false;
return Manager.DataManager.DeleteUserAccount(account);
} }
} }

View File

@@ -1,37 +1,37 @@
using OwnChar.Data; using OwnChar.Api;
using OwnChar.Manager.Exceptions; using OwnChar.Api.Exceptions;
using OwnChar.Manager.Modules;
using OwnChar.Model; using OwnChar.Model;
using Pilz.Cryptography; using Pilz.Cryptography;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
namespace OwnChar.Manager; namespace OwnChar.Manager;
public class OwnCharManager public class OwnCharManager : IOwnCharManager
{ {
// User // User
[MemberNotNullWhen(true, nameof(CurrentUser), nameof(DataManager))] public bool IsLoggedIn => CurrentUser != null;
public bool IsLoggedIn => CurrentUser != null && DataManager != null;
public UserAccount? CurrentUser { get; private set; } public UserAccount? CurrentUser { get; private set; }
// Data Provider // Data Provider
public IDataManager? DataManager { get; set; } public IDataManager? DataManager { get; set; }
// Manager // Manager
public UserManager Users { get; } public IUserManager Users { get; }
public GroupsManager Groups { get; } public IGroupsManager Groups { get; }
public CharacterManager Characters { get; } public ICharacterManager Characters { get; }
public OwnCharManager() public OwnCharManager()
{ {
Users = new(this); Users = new UserManager(this);
Groups = new(this); Groups = new GroupsManager(this);
Characters = new(this); Characters = new CharacterManager(this);
} }
[MemberNotNull(nameof(CurrentUser), nameof(DataManager))] [MemberNotNull(nameof(CurrentUser), nameof(DataManager))]
internal protected void CheckLogin() internal protected void CheckLogin()
{ {
if (!IsLoggedIn) if (!IsLoggedIn || DataManager == null)
throw new LoginException("You are already logged in!"); throw new LoginException("You are already logged in!");
} }
@@ -39,7 +39,6 @@ public class OwnCharManager
/// Tries to login on the given data provider. /// Tries to login on the given data provider.
/// </summary> /// </summary>
/// <returns>Returns <see cref="true"/> if the login was successfull and <see cref="false"/> if not.</returns> /// <returns>Returns <see cref="true"/> if the login was successfull and <see cref="false"/> if not.</returns>
[MemberNotNullWhen(true, nameof(CurrentUser), nameof(DataManager))]
public bool Login(IDataManager? proxy, string? username, SecureString? password) public bool Login(IDataManager? proxy, string? username, SecureString? password)
{ {
ArgumentNullException.ThrowIfNull(proxy, nameof(proxy)); ArgumentNullException.ThrowIfNull(proxy, nameof(proxy));

View File

@@ -0,0 +1,6 @@
namespace OwnChar.Manager;
public abstract class OwnCharManagerModule(OwnCharManager manager)
{
public OwnCharManager Manager { get; } = manager;
}

View File

@@ -1,8 +1,7 @@
namespace OwnChar.Model; namespace OwnChar.Model;
public abstract class Character : IOwnCharObject public abstract class Character : OwnCharObject
{ {
public virtual string? Name { get; set; } public virtual string? Name { get; set; }
public virtual string? Fandom { get; set; } public virtual string? Fandom { get; set; }
public virtual UserProfile? Owner { get; set; }
} }

View File

@@ -1,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Model;
public abstract class Group : IOwnCharObject public abstract class Group : OwnCharObject
{ {
public virtual string? Name { get; set; } public virtual string? Name { get; set; }
public virtual string? Fandom { get; set; } public virtual string? Fandom { get; set; }

View File

@@ -1,5 +0,0 @@
namespace OwnChar.Model;
public interface IOwnCharObject
{
}

View File

@@ -0,0 +1,6 @@
namespace OwnChar.Model;
public class OwnCharObject
{
public virtual int Id { get; set; }
}

View File

@@ -1,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Model;
public abstract class Property : IOwnCharObject public abstract class Property : OwnCharObject
{ {
public virtual string? Name { get; set; } public virtual string? Name { get; set; }
public virtual object? Value { get; set; } public virtual object? Value { get; set; }

View File

@@ -1,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Model;
public abstract class PropertyCategory : IOwnCharObject public abstract class PropertyCategory : OwnCharObject
{ {
public virtual string? Name { get; set; } public virtual string? Name { get; set; }
} }

View File

@@ -1,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Model;
public abstract class UserAccount : IOwnCharObject public abstract class UserAccount : OwnCharObject
{ {
public virtual string? Username { get; set; } public virtual string? Username { get; set; }
public virtual string? Password { get; set; } public virtual string? Password { get; set; }

View File

@@ -1,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Model;
public abstract class UserProfile : IOwnCharObject public abstract class UserProfile : OwnCharObject
{ {
public virtual string? Name { get; set; } public virtual string? Name { get; set; }
} }