big big update
This commit is contained in:
@@ -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)
|
||||||
{
|
{
|
||||||
11
OwnChar/Api/ICharacterManager.cs
Normal file
11
OwnChar/Api/ICharacterManager.cs
Normal 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);
|
||||||
|
}
|
||||||
33
OwnChar/Api/IDataManager.cs
Normal file
33
OwnChar/Api/IDataManager.cs
Normal 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);
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
12
OwnChar/Api/IGroupsManager.cs
Normal file
12
OwnChar/Api/IGroupsManager.cs
Normal 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);
|
||||||
|
}
|
||||||
17
OwnChar/Api/IOwnCharManager.cs
Normal file
17
OwnChar/Api/IOwnCharManager.cs
Normal 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();
|
||||||
|
}
|
||||||
10
OwnChar/Api/IUserManager.cs
Normal file
10
OwnChar/Api/IUserManager.cs
Normal 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();
|
||||||
|
}
|
||||||
57
OwnChar/Data/DataManagerAction.cs
Normal file
57
OwnChar/Data/DataManagerAction.cs
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
6
OwnChar/Data/DataManagerActionResult.cs
Normal file
6
OwnChar/Data/DataManagerActionResult.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace OwnChar.Data;
|
||||||
|
|
||||||
|
public record class DataManagerActionResult(bool HasSuccess, object? Result)
|
||||||
|
{
|
||||||
|
public static DataManagerActionResult NonSuccess { get; } = new(false, null);
|
||||||
|
}
|
||||||
9
OwnChar/Data/DataManagerActionType.cs
Normal file
9
OwnChar/Data/DataManagerActionType.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
namespace OwnChar.Data;
|
||||||
|
|
||||||
|
public enum DataManagerActionType
|
||||||
|
{
|
||||||
|
Default,
|
||||||
|
Get,
|
||||||
|
Set,
|
||||||
|
Delete,
|
||||||
|
}
|
||||||
23
OwnChar/Data/DataManagerActions.cs
Normal file
23
OwnChar/Data/DataManagerActions.cs
Normal 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");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
@@ -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;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace OwnChar.Data.Managers;
|
namespace OwnChar.Data.Managers;
|
||||||
|
|
||||||
public class ClientDataManager
|
public class HttpClientDataManager
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
14
OwnChar/Data/OnActionEventArgs.cs
Normal file
14
OwnChar/Data/OnActionEventArgs.cs
Normal 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; }
|
||||||
|
}
|
||||||
12
OwnChar/Data/OnCallbackEventArgs.cs
Normal file
12
OwnChar/Data/OnCallbackEventArgs.cs
Normal 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;
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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));
|
||||||
|
|||||||
6
OwnChar/Manager/OwnCharManagerModule.cs
Normal file
6
OwnChar/Manager/OwnCharManagerModule.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace OwnChar.Manager;
|
||||||
|
|
||||||
|
public abstract class OwnCharManagerModule(OwnCharManager manager)
|
||||||
|
{
|
||||||
|
public OwnCharManager Manager { get; } = manager;
|
||||||
|
}
|
||||||
@@ -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; }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
namespace OwnChar.Model;
|
|
||||||
|
|
||||||
public interface IOwnCharObject
|
|
||||||
{
|
|
||||||
}
|
|
||||||
6
OwnChar/Model/OwnCharObject.cs
Normal file
6
OwnChar/Model/OwnCharObject.cs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
namespace OwnChar.Model;
|
||||||
|
|
||||||
|
public class OwnCharObject
|
||||||
|
{
|
||||||
|
public virtual int Id { get; set; }
|
||||||
|
}
|
||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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; }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user