rework model to have a client and server variant

This commit is contained in:
2024-07-21 09:52:43 +02:00
parent 32708e3e26
commit 38dc09ab12
60 changed files with 411 additions and 159 deletions

View File

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

View File

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

View File

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

View File

@@ -1,9 +0,0 @@
using OwnChar.Model;
namespace OwnChar.Api.Responses;
public class LoginResponse
{
public UserAccount? UserAccount { get; set; }
public string? Secret { get; set; }
}

View File

@@ -1,7 +0,0 @@
namespace OwnChar.Api.Updates;
public class GroupUpdate
{
public int Id { get; set; }
public string? Name { get; set; }
}

View File

@@ -0,0 +1,10 @@
namespace OwnChar.Base.Data;
public enum MemberLevel
{
None,
Guest,
Member,
Admin,
Owner,
}

View File

@@ -1,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Base.Data.Model;
public abstract class Character : OwnCharObject public abstract class CharacterBase : 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,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Base.Data.Model;
public abstract class Group : OwnCharObject public abstract class GroupBase : 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

@@ -0,0 +1,8 @@
using OwnChar.Client.Data.Model;
namespace OwnChar.Base.Data.Model;
public abstract class MemberEntryBase : OwnCharObject
{
public virtual MemberLevel Level { get; set; }
}

View File

@@ -1,6 +1,6 @@
namespace OwnChar.Model; namespace OwnChar.Base.Data.Model;
public abstract class Property : OwnCharObject public abstract class PropertyBase : 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

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

View File

@@ -1,9 +1,8 @@
namespace OwnChar.Model; namespace OwnChar.Base.Data.Model;
public abstract class UserAccount : OwnCharObject public abstract class UserAccountBase : OwnCharObject
{ {
public virtual string? Username { get; set; } public virtual string? Username { get; set; }
public virtual string? Password { get; set; }
public virtual string? Email { get; set; } public virtual string? Email { get; set; }
public virtual UserType Type { get; set; } public virtual UserType Type { get; set; }
} }

View File

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

View File

@@ -1,4 +1,4 @@
namespace OwnChar.Model; namespace OwnChar.Base.Data;
public class OwnCharObject public class OwnCharObject
{ {

View File

@@ -0,0 +1,8 @@
using OwnChar.Client.Data.Model;
namespace OwnChar.Base.Data.Requests;
public class GroupMemberAddRequest
{
public Dictionary<long, MemberLevel> Members { get; } = [];
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Client.Data.Model;
namespace OwnChar.Base.Data.Requests;
public class GroupMemberRemoveRequest
{
public List<long> Members { get; } = [];
}

View File

@@ -0,0 +1,9 @@
using Pilz.Cryptography;
namespace OwnChar.Base.Data.Requests;
public class LoginRequest(string username, SecureString password)
{
public string Username { get; } = username;
public SecureString Password { get; } = password;
}

View File

@@ -0,0 +1,5 @@
namespace OwnChar.Base.Data.Requests;
public class LogoutRequest
{
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Base.Data.Updates;
namespace OwnChar.Base.Data.Requests;
public class UpdateRequest(OwnCharObjectUpdate update)
{
public OwnCharObjectUpdate Update { get; } = update;
}

View File

@@ -0,0 +1,10 @@
using OwnChar.Client.Data.Model;
namespace OwnChar.Base.Data.Responses;
public class LoginResponse(UserAccount account, UserProfile profile, string secret)
{
public UserAccount Account { get; } = account;
public UserProfile Profile { get; } = profile;
public string? Secret { get; } = secret;
}

View File

@@ -0,0 +1,19 @@
using OwnChar.Client.Data.Model;
namespace OwnChar.Base.Data.Updates;
public class GroupUpdate : OwnCharObjectUpdate
{
public string? Name { get; set; }
public string? Fandom { get; set; }
public GroupUpdate() : base()
{
}
public GroupUpdate(Group group) : base(group)
{
Name = group.Name;
Fandom = group.Fandom;
}
}

View File

@@ -0,0 +1,15 @@
namespace OwnChar.Base.Data.Updates;
public abstract class OwnCharObjectUpdate
{
public long Id { get; set; }
public OwnCharObjectUpdate()
{
}
public OwnCharObjectUpdate(OwnCharObject obj) : this()
{
Id = obj.Id;
}
}

View File

@@ -1,4 +1,4 @@
namespace OwnChar.Model; namespace OwnChar.Base.Data;
public enum UserType public enum UserType
{ {

View File

@@ -0,0 +1,5 @@
namespace OwnChar.Client.Data.Clients;
public class CharactersApiClient
{
}

View File

@@ -0,0 +1,5 @@
namespace OwnChar.Client.Data.Clients;
public class GroupsApiClient
{
}

View File

@@ -0,0 +1,14 @@
namespace OwnChar.Client.Data.Clients;
public class LoginApiClient
{
public string Login(string username, string password)
{
}
public string Logout()
{
}
}

View File

@@ -0,0 +1,5 @@
namespace OwnChar.Client.Data.Clients;
public class UsersApiClient
{
}

View File

@@ -0,0 +1,13 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Client.Data.Model;
public class Character() : CharacterBase
{
internal Character(CharacterBase character) : this()
{
Id = character.Id;
Name = character.Name;
Fandom = character.Fandom;
}
}

View File

@@ -0,0 +1,14 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Client.Data.Model;
public class Group() : GroupBase
{
internal Group(GroupBase group) : this()
{
Id = group.Id;
Name = group.Name;
IsInternal = group.IsInternal;
Fandom = group.Fandom;
}
}

View File

@@ -0,0 +1,13 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Client.Data.Model;
public class MemberEntry() : MemberEntryBase
{
internal MemberEntry(MemberEntryBase entry) : this()
{
Id = entry.Id;
User = entry.User;
Level = entry.Level;
}
}

View File

@@ -0,0 +1,13 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Client.Data.Model;
public class Property() : PropertyBase
{
internal Property(PropertyBase prop) : this()
{
Id = prop.Id;
Name = prop.Name;
Value = prop.Value;
}
}

View File

@@ -0,0 +1,12 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Client.Data.Model;
public class PropertyCategory() : PropertyCategoryBase
{
internal PropertyCategory(PropertyCategoryBase propCat) : this()
{
Id = propCat.Id;
Name = propCat.Name;
}
}

View File

@@ -0,0 +1,14 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Client.Data.Model;
public class UserAccount() : UserAccountBase
{
internal UserAccount(UserAccountBase account) : this()
{
Id = account.Id;
Username = account.Username;
Email = account.Email;
Type = account.Type;
}
}

View File

@@ -0,0 +1,12 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Client.Data.Model;
public class UserProfile() : UserProfileBase
{
internal UserProfile(UserProfileBase profile) : this()
{
Id = profile.Id;
Name = profile.Name;
}
}

View File

@@ -1,4 +1,4 @@
namespace OwnChar; namespace OwnChar.Client.Data;
public class OwnCharApiClient public class OwnCharApiClient
{ {

View File

@@ -1,12 +1,14 @@
using OwnChar.Data; using OwnChar.Client.Managers;
using OwnChar.Data;
using OwnChar.Model; using OwnChar.Model;
using Pilz.Cryptography; using Pilz.Cryptography;
namespace OwnChar.Api.Managers; namespace OwnChar.Client;
public interface IOwnCharManager public interface IOwnCharManager
{ {
IDataManager? DataManager { get; set; } IDataManager? DataManager { get; set; }
UserAccount? CurrentUser { get; } UserAccountBase? CurrentUser { get; }
bool IsLoggedIn { get; } bool IsLoggedIn { get; }
IUserManager Users { get; } IUserManager Users { get; }
@@ -15,4 +17,9 @@ public interface IOwnCharManager
bool Login(IDataManager? proxy, string? username, SecureString? password); bool Login(IDataManager? proxy, string? username, SecureString? password);
bool Logout(); bool Logout();
public static IOwnCharManager CreateDefault()
{
return new OwnCharManager();
}
} }

View File

@@ -1,55 +1,53 @@
using OwnChar.Api; using OwnChar.Data;
using OwnChar.Api.Managers;
using OwnChar.Data;
using OwnChar.Model; using OwnChar.Model;
namespace OwnChar.Managers; namespace OwnChar.Client.Managers;
public class CharacterManager(OwnCharManager manager) : OwnCharManagerModule(manager), ICharacterManager internal class CharacterManager(OwnCharManager manager) : OwnCharManagerModule(manager), ICharacterManager
{ {
public IQueryable<Character>? GetCharacters(Group? group) public IQueryable<CharacterBase>? GetCharacters(GroupBase? group)
{ {
Manager.CheckLogin(); Manager.CheckLogin();
if (group != null) if (group != null)
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Character, DataManagerActionType.Get, Manager.CurrentUser, group).Result as IQueryable<Character>; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Character, DataManagerActionType.Get, Manager.CurrentUser, group).Result as IQueryable<CharacterBase>;
return null; return null;
} }
public IQueryable<Character>? GetCharacters(UserProfile? profile) public IQueryable<CharacterBase>? GetCharacters(UserProfileBase? profile)
{ {
Manager.CheckLogin(); Manager.CheckLogin();
if (profile != null) if (profile != null)
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Character, DataManagerActionType.Get, Manager.CurrentUser, profile).Result as IQueryable<Character>; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Character, DataManagerActionType.Get, Manager.CurrentUser, profile).Result as IQueryable<CharacterBase>;
return null; return null;
} }
public Character? CreateCharacter(string? name) public CharacterBase? CreateCharacter(string? name)
{ {
return CreateCharacter(name, null); return CreateCharacter(name, null);
} }
public Character? CreateCharacter(string? name, Group? destination) public CharacterBase? CreateCharacter(string? name, GroupBase? destination)
{ {
ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name)); ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.PropertyCategory, DataManagerActionType.Set, Manager.CurrentUser, null, name, destination).Result as Character; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.PropertyCategory, DataManagerActionType.Set, Manager.CurrentUser, null, name, destination).Result as CharacterBase;
} }
public bool DeleteCharacter(Character? character) public bool DeleteCharacter(CharacterBase? character)
{ {
ArgumentNullException.ThrowIfNull(character, nameof(character)); ArgumentNullException.ThrowIfNull(character, nameof(character));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Delete, DataManagerActionType.Default, Manager.CurrentUser, character).HasSuccess; return Manager.DataManager.ExecuteAction(DataManagerActions.Delete, DataManagerActionType.Default, Manager.CurrentUser, character).HasSuccess;
} }
public UserProfile? GetOwner(Character? character) public UserProfileBase? GetOwner(CharacterBase? character)
{ {
ArgumentNullException.ThrowIfNull(character, nameof(character)); ArgumentNullException.ThrowIfNull(character, nameof(character));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Owner, DataManagerActionType.Get, Manager.CurrentUser, character).Result as UserProfile; return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Owner, DataManagerActionType.Get, Manager.CurrentUser, character).Result as UserProfileBase;
} }
} }

View File

@@ -1,40 +1,38 @@
using OwnChar.Api; using OwnChar.Data;
using OwnChar.Api.Managers;
using OwnChar.Data;
using OwnChar.Model; using OwnChar.Model;
namespace OwnChar.Managers; namespace OwnChar.Client.Managers;
public class GroupsManager(OwnCharManager manager) : OwnCharManagerModule(manager), IGroupsManager internal class GroupsManager(OwnCharManager manager) : OwnCharManagerModule(manager), IGroupsManager
{ {
public UserProfile? GetOwner(Group? group) public UserProfileBase? GetOwner(GroupBase? group)
{ {
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Owner, DataManagerActionType.Get, Manager.CurrentUser, group).Result as UserProfile; return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Owner, DataManagerActionType.Get, Manager.CurrentUser, group).Result as UserProfileBase;
} }
public IQueryable<Group>? GetGroups(UserProfile? profile) public IQueryable<GroupBase>? GetGroups(UserProfileBase? profile)
{ {
ArgumentNullException.ThrowIfNull(profile, nameof(profile)); ArgumentNullException.ThrowIfNull(profile, nameof(profile));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Group, DataManagerActionType.Get, Manager.CurrentUser, profile) as IQueryable<Group>; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Group, DataManagerActionType.Get, Manager.CurrentUser, profile) as IQueryable<GroupBase>;
} }
public IQueryable<Group>? GetGroups() public IQueryable<GroupBase>? GetGroups()
{ {
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Group, DataManagerActionType.Get, Manager.CurrentUser, null) as IQueryable<Group>; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Group, DataManagerActionType.Get, Manager.CurrentUser, null) as IQueryable<GroupBase>;
} }
public IQueryable<UserProfile>? GetMembers(Group? group) public IQueryable<UserProfileBase>? GetMembers(GroupBase? group)
{ {
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Get, Manager.CurrentUser, group).Result as IQueryable<UserProfile>; return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Get, Manager.CurrentUser, group).Result as IQueryable<UserProfileBase>;
} }
public bool AddMember(UserProfile? profile, Group? group) public bool AddMember(UserProfileBase? profile, GroupBase? group)
{ {
ArgumentNullException.ThrowIfNull(profile, nameof(profile)); ArgumentNullException.ThrowIfNull(profile, nameof(profile));
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
@@ -42,7 +40,7 @@ public class GroupsManager(OwnCharManager manager) : OwnCharManagerModule(manage
return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Set, Manager.CurrentUser, group, profile).HasSuccess; return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Set, Manager.CurrentUser, group, profile).HasSuccess;
} }
public bool RemoveMember(UserProfile? profile, Group? group) public bool RemoveMember(UserProfileBase? profile, GroupBase? group)
{ {
ArgumentNullException.ThrowIfNull(profile, nameof(profile)); ArgumentNullException.ThrowIfNull(profile, nameof(profile));
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
@@ -50,14 +48,14 @@ public class GroupsManager(OwnCharManager manager) : OwnCharManagerModule(manage
return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Delete, Manager.CurrentUser, group, profile).HasSuccess; return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Members, DataManagerActionType.Delete, Manager.CurrentUser, group, profile).HasSuccess;
} }
public Group? CreateGroup(string? name) public GroupBase? CreateGroup(string? name)
{ {
ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name)); ArgumentException.ThrowIfNullOrWhiteSpace(name, nameof(name));
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Group, DataManagerActionType.Set, Manager.CurrentUser, null, name).Result as Group; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.Group, DataManagerActionType.Set, Manager.CurrentUser, null, name).Result as GroupBase;
} }
public bool DeleteGroup(Group? group) public bool DeleteGroup(GroupBase? group)
{ {
ArgumentNullException.ThrowIfNull(group, nameof(group)); ArgumentNullException.ThrowIfNull(group, nameof(group));
Manager.CheckLogin(); Manager.CheckLogin();

View File

@@ -0,0 +1,12 @@
using OwnChar.Model;
namespace OwnChar.Client.Managers;
public interface ICharacterManager
{
CharacterBase? CreateCharacter(string? name);
CharacterBase? CreateCharacter(string? name, GroupBase? destination);
bool DeleteCharacter(CharacterBase? character);
IQueryable<CharacterBase>? GetCharacters(GroupBase? group);
IQueryable<CharacterBase>? GetCharacters(UserProfileBase? profile);
UserProfileBase? GetOwner(CharacterBase? character);
}

View File

@@ -0,0 +1,14 @@
using OwnChar.Model;
namespace OwnChar.Client.Managers;
public interface IGroupsManager
{
IQueryable<GroupBase>? GetGroups(UserProfileBase? profile);
IQueryable<GroupBase>? GetGroups();
bool AddMember(UserProfileBase? profile, GroupBase? group);
GroupBase? CreateGroup(string? name);
bool DeleteGroup(GroupBase? group);
bool RemoveMember(UserProfileBase? profile, GroupBase? group);
IQueryable<UserProfileBase>? GetMembers(GroupBase? group);
UserProfileBase? GetOwner(GroupBase? group);
}

View File

@@ -0,0 +1,12 @@
using OwnChar.Model;
using Pilz.Cryptography;
namespace OwnChar.Client.Managers;
public interface IUserManager
{
IQueryable<UserAccountBase>? GetUserAccounts();
UserAccountBase? CreateUserAccount(string? username, SecureString? password);
bool DeleteUserAccount(UserAccountBase? account);
UserProfileBase? GetOwnUserProfile();
}

View File

@@ -1,35 +1,33 @@
using OwnChar.Api; using OwnChar.Data;
using OwnChar.Api.Managers;
using OwnChar.Data;
using OwnChar.Model; using OwnChar.Model;
using Pilz.Cryptography; using Pilz.Cryptography;
namespace OwnChar.Managers; namespace OwnChar.Client.Managers;
public class UserManager(OwnCharManager manager) : OwnCharManagerModule(manager), IUserManager internal class UserManager(OwnCharManager manager) : OwnCharManagerModule(manager), IUserManager
{ {
public UserProfile? GetOwnUserProfile() public UserProfileBase? GetOwnUserProfile()
{ {
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Profile, DataManagerActionType.Get, Manager.CurrentUser, Manager.CurrentUser).Result as UserProfile; return Manager.DataManager.ExecuteAction(DataManagerActions.Association.Profile, DataManagerActionType.Get, Manager.CurrentUser, Manager.CurrentUser).Result as UserProfileBase;
} }
public IQueryable<UserAccount>? GetUserAccounts() public IQueryable<UserAccountBase>? GetUserAccounts()
{ {
Manager.CheckLogin(); Manager.CheckLogin();
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.UserAccount, DataManagerActionType.Get, Manager.CurrentUser, null).Result as IQueryable<UserAccount>; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.UserAccount, DataManagerActionType.Get, Manager.CurrentUser, null).Result as IQueryable<UserAccountBase>;
} }
public UserAccount? CreateUserAccount(string? username, SecureString? password) public UserAccountBase? 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(); Manager.CheckLogin();
username = username.Trim().ToLower(); username = username.Trim().ToLower();
return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.UserAccount, DataManagerActionType.Set, Manager.CurrentUser, null, username, OwnCharUtils.HashPassword(username, password)).Result as UserAccount; return Manager.DataManager.ExecuteAction(DataManagerActions.Getter.UserAccount, DataManagerActionType.Set, Manager.CurrentUser, null, username, OwnCharUtils.HashPassword(username, password)).Result as UserAccountBase;
} }
public bool DeleteUserAccount(UserAccount? account) public bool DeleteUserAccount(UserAccountBase? account)
{ {
ArgumentNullException.ThrowIfNull(account, nameof(account)); ArgumentNullException.ThrowIfNull(account, nameof(account));
Manager.CheckLogin(); Manager.CheckLogin();

View File

@@ -1,18 +1,18 @@
using OwnChar.Api.Exceptions; using OwnChar.Api.Exceptions;
using OwnChar.Api.Managers; using OwnChar.Client.Managers;
using OwnChar.Data; using OwnChar.Data;
using OwnChar.Manager.Modules; 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; namespace OwnChar.Client;
public class OwnCharManager : IOwnCharManager internal class OwnCharManager : IOwnCharManager
{ {
// User // User
public bool IsLoggedIn => CurrentUser != null; public bool IsLoggedIn => CurrentUser != null;
public UserAccount? CurrentUser { get; private set; } public UserAccountBase? CurrentUser { get; private set; }
// Data Provider // Data Provider
public IDataManager? DataManager { get; set; } public IDataManager? DataManager { get; set; }

View File

@@ -1,6 +1,4 @@
using OwnChar.Api.Managers; namespace OwnChar.Client;
namespace OwnChar.Api;
public abstract class OwnCharManagerModule(IOwnCharManager manager) public abstract class OwnCharManagerModule(IOwnCharManager manager)
{ {

View File

@@ -1,5 +0,0 @@
namespace OwnChar.Clients;
public class CharactersApiClient
{
}

View File

@@ -1,5 +0,0 @@
namespace OwnChar.Clients;
public class GroupsApiClient
{
}

View File

@@ -1,5 +0,0 @@
namespace OwnChar.Clients;
public class LoginApiClient
{
}

View File

@@ -1,5 +0,0 @@
namespace OwnChar.Clients;
public class UsersApiClient
{
}

View File

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

View File

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

View File

@@ -14,8 +14,4 @@
<PackageReference Include="Pilz.Cryptography" Version="2.0.1" /> <PackageReference Include="Pilz.Cryptography" Version="2.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Data\Model\" />
</ItemGroup>
</Project> </Project>

View File

@@ -1,4 +1,5 @@
using OwnChar.Data; using OwnChar.Base.Data;
using OwnChar.Data;
using OwnChar.Model; using OwnChar.Model;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
@@ -17,7 +18,7 @@ public static class OwnCharExtensions
return false; return false;
} }
public static bool HasPermission(this UserAccount account, UserType permissions) public static bool HasPermission(this UserAccountBase account, UserType permissions)
{ {
return account.Type >= permissions; return account.Type >= permissions;
} }

View File

@@ -0,0 +1,11 @@
using OwnChar.Base.Data.Model;
using OwnChar.Client.Data.Model;
namespace OwnChar.Server.Data.Model;
public class CharacterDb : CharacterBase
{
public UserProfileDb? Owner { get; set; }
public List<PropertyCategoryDb> PropCats { get; } = [];
public List<PropertyDb> Props { get; } = [];
}

View File

@@ -0,0 +1,16 @@
using OwnChar.Base.Data.Updates;
using OwnChar.Base.Data.Model;
namespace OwnChar.Server.Data.Model;
public class GroupDb : GroupBase
{
public List<CharacterDb> Characters { get; } = [];
public List<MemberEntryDb> Members { get; } = [];
public void Update(GroupUpdate update)
{
Name = update.Name;
Fandom = update.Fandom;
}
}

View File

@@ -0,0 +1,15 @@
using OwnChar.Base.Data.Model;
using OwnChar.Client.Data.Model;
namespace OwnChar.Server.Data.Model;
public class MemberEntryDb() : MemberEntryBase
{
public virtual UserProfile? User { get; set; }
internal MemberEntryDb(MemberEntryBase entry) : this()
{
Id = entry.Id;
Level = entry.Level;
}
}

View File

@@ -0,0 +1,7 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Server.Data.Model;
public class PropertyCategoryDb : PropertyCategoryBase
{
}

View File

@@ -0,0 +1,7 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Server.Data.Model;
public class PropertyDb : PropertyBase
{
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Server.Data.Model;
public class UserAccountDb : UserAccountBase
{
public virtual string? Password { get; set; }
public UserProfileDb? Profile { get; set; }
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Base.Data.Model;
namespace OwnChar.Server.Data.Model;
public class UserProfileDb : UserProfileBase
{
public List<CharacterDb> Characters { get; } = [];
}