From f1deeeda6c18ff642f1ccaaabc6837935aa4c42d Mon Sep 17 00:00:00 2001 From: Schedel Pascal Date: Mon, 8 Jul 2024 15:19:00 +0200 Subject: [PATCH] work --- OwnChar/Api/IDataProvider.cs | 15 +++-- OwnChar/Data/Managers/DefaultDataManager.cs | 27 +++++++- .../JsonFile/JsonFileDataProvider.cs | 63 ++++++++++++++----- OwnChar/Extensions.cs | 20 +++++- OwnChar/Model/UserType.cs | 1 + 5 files changed, 101 insertions(+), 25 deletions(-) diff --git a/OwnChar/Api/IDataProvider.cs b/OwnChar/Api/IDataProvider.cs index 1457d1a..8913ac4 100644 --- a/OwnChar/Api/IDataProvider.cs +++ b/OwnChar/Api/IDataProvider.cs @@ -12,6 +12,8 @@ public interface IDataProvider abstract T? Create() where T : OwnCharObject; abstract bool Save(T obj) where T : OwnCharObject; abstract bool Delete(T obj) where T : OwnCharObject; + virtual IEnumerable? Get() where T : OwnCharObject => Get(null); + abstract IEnumerable? Get(OwnCharObject? context) where T : OwnCharObject; // Hierarchy abstract bool SetParent(UserProfile profile, UserAccount parent); @@ -19,17 +21,18 @@ public interface IDataProvider abstract bool SetParent(Property property, Character character); abstract bool SetOwner(Group group, UserProfile owner); abstract bool SetOwner(Character group, UserProfile owner); + abstract UserProfile? GetOwner(Group group); + abstract UserProfile? GetOwner(Character character); + + // Collections + abstract bool AddMember(Group group, UserProfile user); + abstract bool RemoveMember(Group group, UserProfile user); // Gets abstract UserAccount? GetUserAccount(string username, string password); abstract UserProfile? GetUserProfile(string username); + abstract IEnumerable? GetUserAccounts(); abstract IEnumerable? GetMembers(Group group); - abstract UserProfile? GetOwner(Group group); - abstract UserProfile? GetOwner(Character character); abstract IEnumerable? GetCharacters(Group group); abstract IEnumerable? GetCharacters(UserProfile jprofile); - - // Sets - abstract bool AddMember(Group group, UserProfile user); - abstract bool RemoveMember(Group group, UserProfile user); } diff --git a/OwnChar/Data/Managers/DefaultDataManager.cs b/OwnChar/Data/Managers/DefaultDataManager.cs index 0e4853c..639eb96 100644 --- a/OwnChar/Data/Managers/DefaultDataManager.cs +++ b/OwnChar/Data/Managers/DefaultDataManager.cs @@ -48,7 +48,14 @@ public class DefaultDataManager : IDataManager if (e.Is(DataManagerActions.Getter.Character)) { // Get - if (e.Is(DataManagerActionType.Set)) + if (e.Is(DataManagerActionType.Get)) + { + if (e.Is(UserType.User) && e.GetObject(out Group? group)) + return e.SetResult(DataProvider.GetCharacters(group)); + } + + // Create + else if (e.Is(DataManagerActionType.Set)) { if (e.Object is Group group && e.GetParam(0, out string? name)) return e.SetResult(CreateCharacter(e.CurrentUser, name, group)); @@ -56,10 +63,17 @@ public class DefaultDataManager : IDataManager } // Group - if (e.Is(DataManagerActions.Getter.Group)) + else if (e.Is(DataManagerActions.Getter.Group)) { // Get if (e.Is(DataManagerActionType.Get)) + { + if (e.Object is UserProfile profile) + return e.SetResult(DataProvider.GetGroups(profile)); + } + + // Create + else if (e.Is(DataManagerActionType.Set)) { if (e.GetParam(0, out string? name)) return e.SetResult(CreateGroup(e.CurrentUser, name)); @@ -67,10 +81,17 @@ public class DefaultDataManager : IDataManager } // User - if (e.Is(DataManagerActions.Getter.UserAccount)) + else if (e.Is(DataManagerActions.Getter.UserAccount)) { // Get if (e.Is(DataManagerActionType.Get)) + { + if (e.Is(UserType.Admin)) + return e.SetResult(DataProvider.GetUserAccounts()); + } + + // Create + if (e.Is(DataManagerActionType.Set)) { if (e.GetParam(0, out string? username) && e.GetParam(1, out string? password)) return e.SetResult(CreateUserAccount(username, password)); diff --git a/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs b/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs index 1c1ac1a..660f585 100644 --- a/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs +++ b/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs @@ -2,6 +2,7 @@ using OwnChar.Api; using OwnChar.Data.Providers.JsonFile.Model; using OwnChar.Model; +using System.Collections; namespace OwnChar.Data.Providers.JsonFile; @@ -32,7 +33,7 @@ public class JsonFileDataProvider : IDataProvider File.WriteAllText(JsonFilePath, JsonConvert.SerializeObject(JsonFile, CreateJsonSerializerSettings())); } - protected JsonSerializerSettings CreateJsonSerializerSettings() + protected virtual JsonSerializerSettings CreateJsonSerializerSettings() { return new JsonSerializerSettings { @@ -42,7 +43,18 @@ public class JsonFileDataProvider : IDataProvider Formatting = Formatting.Indented, }; } - public T? Create() where T : class, OwnCharObject + + public bool IsInitialized() + { + return JsonFile.IsInitialized; + } + + public void SetInitialized() + { + JsonFile.IsInitialized = true; + } + + public T? Create() where T : OwnCharObject { var t = typeof(T); OwnCharObject? obj; @@ -65,7 +77,7 @@ public class JsonFileDataProvider : IDataProvider return obj as T; } - public bool Save(T obj) where T : class, OwnCharObject + public bool Save(T obj) where T : OwnCharObject { if (obj is JsonCharacter character) { @@ -86,17 +98,7 @@ public class JsonFileDataProvider : IDataProvider return true; } - public bool IsInitialized() - { - return JsonFile.IsInitialized; - } - - public void SetInitialized() - { - JsonFile.IsInitialized = true; - } - - public bool Delete(T obj) where T : class, OwnCharObject + public bool Delete(T obj) where T : OwnCharObject { if (obj is JsonCharacter character) { @@ -138,6 +140,39 @@ public class JsonFileDataProvider : IDataProvider return false; } + public IEnumerable? Get(OwnCharObject? context) where T : OwnCharObject + { + var t = typeof(T); + + static IEnumerable? asList(IList list) => list as IEnumerable; + + if (t == typeof(Property)) + { + // ... + } + else if (t == typeof(PropertyCategory)) + { + // ... + } + else if (t == typeof(Character)) + { + if (context is JsonGroup group) + return (IEnumerable)group.Characters; + if (context is UserProfile profile) + return (IEnumerable)JsonFile.Characters.Where(n => n.Owner == profile); + return (IEnumerable)JsonFile.Characters; + } + else if (t == typeof(Group)) + { + if (context is UserProfile profile) + return (IEnumerable)JsonFile.Groups.Where(g => g.Owner == profile); + return (IEnumerable)JsonFile.Groups; + } + else if (t == typeof(UserAccount)) + return (IEnumerable)JsonFile.UserAccounts; + return null; + } + public bool SetParent(UserProfile profile, UserAccount parent) { if (parent is JsonUserAccount jaccount && profile is JsonUserProfile jprofile) diff --git a/OwnChar/Extensions.cs b/OwnChar/Extensions.cs index 5e5b7a0..f875bf8 100644 --- a/OwnChar/Extensions.cs +++ b/OwnChar/Extensions.cs @@ -41,9 +41,15 @@ public static class Extensions return @this.Parameters.GetAt(index, out result); } - public static bool Is(this OnActionEventArgs @this, UserType minLevel) + public static bool GetObject(this OnActionEventArgs @this, [NotNullWhen(true)] out T? result) { - return @this.CurrentUser.HasPermission(minLevel); + if (@this.Object is T t) + { + result = t; + return true; + } + result = default; + return false; } public static bool Is(this OnActionEventArgs @this, DataManagerActionType actionType) @@ -56,5 +62,15 @@ public static class Extensions return @this.Action == action; } + public static bool Is(this OnActionEventArgs @this, UserType minLevel) + { + return @this.CurrentUser.HasPermission(minLevel); + } + + public static bool Is(this OnActionEventArgs @this, UserType maxLevel, UserType minLevel, Func isOwner) + { + return @this.Is(maxLevel) || (@this.Is(minLevel) && isOwner(@this)); + } + #endregion } diff --git a/OwnChar/Model/UserType.cs b/OwnChar/Model/UserType.cs index 4a9437d..355eecd 100644 --- a/OwnChar/Model/UserType.cs +++ b/OwnChar/Model/UserType.cs @@ -2,6 +2,7 @@ public enum UserType { + None, Guest, User, Admin