From a721b5ab6cb1d9af0a88bfe2c8c7c0090baf43d6 Mon Sep 17 00:00:00 2001 From: Schedel Pascal Date: Tue, 9 Jul 2024 10:57:20 +0200 Subject: [PATCH] and even more --- OwnChar/Data/Managers/DefaultDataManager.cs | 78 ++++++++++++------- .../JsonFile/JsonFileDataProvider.cs | 33 +++++++- 2 files changed, 81 insertions(+), 30 deletions(-) diff --git a/OwnChar/Data/Managers/DefaultDataManager.cs b/OwnChar/Data/Managers/DefaultDataManager.cs index 3d4e6a6..082dc8b 100644 --- a/OwnChar/Data/Managers/DefaultDataManager.cs +++ b/OwnChar/Data/Managers/DefaultDataManager.cs @@ -1,5 +1,6 @@ using OwnChar.Manager.Modules; using OwnChar.Model; +using System.Reflection.Metadata; namespace OwnChar.Data.Managers; @@ -117,7 +118,7 @@ public class DefaultDataManager : IDataManager if (e.Is(DataManagerActionType.Get)) { if (e.Is(UserType.User) && e.GetObject(out Character? character)) - return e.SetResult(DataProvider.GetChilds(character, HierarchyProperties.PropPropCats)); + return e.SetResult(DataProvider.GetChilds(character, HierarchyProperties.PropProps)); } // Create @@ -128,23 +129,23 @@ public class DefaultDataManager : IDataManager } } - //// PropertyCategory - //else if (e.Is(DataManagerActions.Getter.PropertyCategory)) - //{ - // // Get - // if (e.Is(DataManagerActionType.Get)) - // { - // if (e.Is(UserType.User) && e.GetObject(out Character? character)) - // return e.SetResult(DataProvider.GetChilds(character, HierarchyProperties.PropPropCats)); - // } + // PropertyCategory + else if (e.Is(DataManagerActions.Getter.PropertyCategory)) + { + // Get + if (e.Is(DataManagerActionType.Get)) + { + if (e.Is(UserType.User) && e.GetObject(out Character? character)) + return e.SetResult(DataProvider.GetChilds(character, HierarchyProperties.PropPropCats)); + } - // // Create - // if (e.Is(DataManagerActionType.Set)) - // { - // if (e.Is(UserType.User) && e.GetObject(out Character? character)) - // return e.SetResult(CreateProperty(character)); - // } - //} + // Create + if (e.Is(DataManagerActionType.Set)) + { + if (e.Is(UserType.User) && e.GetObject(out Character? character)) + return e.SetResult(CreatePropertyCategory(e.CurrentUser, character)); + } + } return false; } @@ -154,7 +155,8 @@ public class DefaultDataManager : IDataManager if (!e.Is(DataManagerActions.Save)) return false; - // ... + if (e.Is(UserType.User) && e.GetObject(out OwnCharObject? obj)) + DataProvider.Save(obj); return false; } @@ -165,22 +167,29 @@ public class DefaultDataManager : IDataManager return false; // Character - if (e.Object is Character character) + if (e.GetObject(out Character? character)) return DeleteCharacter(e.CurrentUser, character); // Group - if (e.Object is Group group) + if (e.GetObject(out Group? group)) return DeleteGroup(e.CurrentUser, group); // User - if (e.Object is UserAccount userAccount) + if (e.GetObject(out UserAccount? userAccount)) return DeleteUserAccount(userAccount); // Property - if (e.Object is Property property) + if (e.GetObject(out Property? property)) { if (e.GetParam(0, out Character? paramChar)) - return DeleteProperty(e.CurrentUser, paramChar, property); + return DeleteIfOwnerOrAdmin(e.CurrentUser, paramChar, property); + } + + // Property + if (e.GetObject(out PropertyCategory? propertyCategory)) + { + if (e.GetParam(0, out Character? paramChar)) + return DeleteIfOwnerOrAdmin(e.CurrentUser, paramChar, propertyCategory); } return false; @@ -289,6 +298,13 @@ public class DefaultDataManager : IDataManager return result; } + protected virtual bool DeleteIfOwnerOrAdmin(UserAccount account, Character character, T property) where T : OwnCharObject + { + if (GetUserProfile(account) is not UserProfile profile || DataProvider.GetChild(character, HierarchyProperties.PropOwner) is not UserProfile owner || !account.HasPermission(profile == owner ? UserType.User : UserType.Admin)) + return false; + return DataProvider.Delete(property); + } + protected virtual Property? CreateProperty(UserAccount account, Character character) { ArgumentNullException.ThrowIfNull(character, nameof(character)); @@ -304,11 +320,19 @@ public class DefaultDataManager : IDataManager return prop; } - protected virtual bool DeleteProperty(UserAccount account, Character character, Property property) + protected virtual PropertyCategory? CreatePropertyCategory(UserAccount account, Character character) { - if (GetUserProfile(account) is not UserProfile profile || DataProvider.GetChild(character, HierarchyProperties.PropOwner) is not UserProfile owner || !account.HasPermission(profile == owner ? UserType.User : UserType.Admin)) - return false; - return DataProvider.Delete(property); + ArgumentNullException.ThrowIfNull(character, nameof(character)); + + if (!account.HasPermission(UserType.User)) + return null; + + var cat = DataProvider.Create(); + ArgumentNullException.ThrowIfNull(cat, nameof(cat)); + + DataProvider.SetChild(character, cat, HierarchyProperties.PropPropCats, DataProviderSetAction.Set); + + return cat; } protected virtual UserAccount? CreateUserAccount(string username, string password) diff --git a/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs b/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs index fa33c35..bd763e0 100644 --- a/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs +++ b/OwnChar/Data/Providers/JsonFile/JsonFileDataProvider.cs @@ -163,7 +163,7 @@ public class JsonFileDataProvider : IDataProvider { var t = typeof(T); - static IQueryable? asList(IEnumerable list) => list as IQueryable; + static IQueryable? asList(IEnumerable list) => list.AsQueryable() as IQueryable; if (t == typeof(Character)) return asList(JsonFile.Characters); @@ -233,7 +233,34 @@ public class JsonFileDataProvider : IDataProvider } // Members - // ... + if (property == HierarchyProperties.PropMembers) + { + // Clear + if (child is null && action == DataProviderSetAction.Remove) + { + parentGroup.Members.Clear(); + return true; + } + + // Add/Remove + else if (child is JsonUserProfile childProfile) + { + // Remove + if (action == DataProviderSetAction.Remove) + { + parentGroup.Members.Remove(childProfile); + return true; + } + + // Add + else + { + if (!parentGroup.Members.Contains(childProfile)) + parentGroup.Members.Add(childProfile); + return true; + } + } + } // Owner if (property == HierarchyProperties.PropOwner) @@ -375,7 +402,7 @@ public class JsonFileDataProvider : IDataProvider public IQueryable? GetChilds(OwnCharObject parent, string property) where T : OwnCharObject { - static IQueryable? asList(IEnumerable list) => list as IQueryable; + static IQueryable? asList(IEnumerable list) => list.AsQueryable() as IQueryable; // Group if (parent is JsonGroup parentGroup)