Compare commits

...

1 Commits

Author SHA1 Message Date
Schedel Pascal
b08c7619a4 uff, lot of work 2024-08-02 11:47:38 +02:00
81 changed files with 388 additions and 290 deletions

View File

@@ -1,4 +1,4 @@
namespace OwnChar.Client.Data.Clients;
namespace OwnChar.Api.Clients;
public class CharactersApiClient(OwnCharApiClient client)
{

View File

@@ -0,0 +1,43 @@
using OwnChar.Api.Packets.General;
using OwnChar.Api.Packets.Groups;
using OwnChar.Data.Model.Client;
namespace OwnChar.Api.Clients;
public class GroupsApiClient(OwnCharApiClient client)
{
public async Task<Group?> GetGroup(long id)
{
var result = await client.MakeRequest<GetSinlgeObjectRequest, GetSingleObjectResponse<Group>>("/groups/get/byid", new(id));
result.EnsureSuccess();
return result.Result;
}
public async Task<IEnumerable<Group>> GetGroupsForProfile(long userProfileId)
{
var result = await client.MakeRequest<GetGroupsRequest, GetGroupsResponse>("/groups/get", new()
{
ProfileId = userProfileId,
UseProfileId = true,
});
result.EnsureSuccess();
return result.Groups;
}
public async Task<IEnumerable<Group>> GetPublicGroups()
{
var result = await client.MakeRequest<GetGroupsRequest, GetGroupsResponse>("/groups/get", new());
result.EnsureSuccess();
return result.Groups;
}
public async Task<IEnumerable<Group>> GetAllGroups()
{
var result = await client.MakeRequest<GetGroupsRequest, GetGroupsResponse>("/groups/get", new()
{
IncludeNonPublic = true,
});
result.EnsureSuccess();
return result.Groups;
}
}

View File

@@ -1,17 +1,16 @@
using OwnChar.Base.Data;
using OwnChar.Base.Data.Requests;
using OwnChar.Base.Data.Responses;
using OwnChar.Client.Data.Model;
using OwnChar.Api.Packets;
using OwnChar.Api.Packets.General;
using OwnChar.Data.Model.Client;
using Pilz.Cryptography;
namespace OwnChar.Client.Data.Clients;
namespace OwnChar.Api.Clients;
public class LoginApiClient(OwnCharApiClient client)
{
public async Task<UserProfile?> Login(string username, SecureString password)
{
var result = await client.MakeRequest<LoginRequest, LoginResponse>("/auth/login", new(username, password));
if (!string.IsNullOrEmpty(result.Secret) && result.Profile != null && result.Account != null)
{
client.AuthSecret = result.Secret;

View File

@@ -1,4 +1,4 @@
namespace OwnChar.Client.Data.Clients;
namespace OwnChar.Api.Clients;
public class UsersApiClient(OwnCharApiClient client)
{

View File

@@ -1,9 +1,11 @@
using OwnChar.Api.Exceptions;
using OwnChar.Base.Data;
using OwnChar.Client.Data.Clients;
using Newtonsoft.Json;
using OwnChar.Api.Clients;
using OwnChar.Api.Exceptions;
using OwnChar.Api.Packets;
using System.Net.Http.Headers;
using System.Net.Http.Json;
namespace OwnChar.Client.Data;
namespace OwnChar.Api;
public class OwnCharApiClient
{
@@ -46,17 +48,18 @@ public class OwnCharApiClient
{
if (await TryMakeRequest<TRequest, TResponse>(requestUrl, request) is TResponse response)
return response;
throw new ApiException(string.Format("The api request to \"{0}\" failed!", requestUrl));
throw new ApiException(string.Format("The API request to \"{0}\" failed!", requestUrl));
}
public async Task<TResponse?> TryMakeRequest<TRequest, TResponse>(string requestUrl, TRequest request) where TRequest : OwnCharRequest where TResponse : OwnCharResponse
{
request.AuthSecret = AuthSecret;
var res = await httpClient.PostAsJsonAsync(requestUrl, request);
var content = new StringContent(JsonHelpers.SerializeRequest(request)!, MediaTypeHeaderValue.Parse("application/json"));
var res = await httpClient.PostAsync(requestUrl, content);
if (res.IsSuccessStatusCode)
return await res.Content.ReadFromJsonAsync<TResponse>();
return JsonHelpers.DeserializeResponse<TResponse>(await res.Content.ReadAsStringAsync());
return null;
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.General;
public class DeleteObjectRequest(long objectId) : OwnCharRequest
{
public long ObjectId { get; } = objectId;
}

View File

@@ -0,0 +1,7 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.General;
public class DeleteObjectResponse : OwnCharResponse
{
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Api.Packets;
using OwnChar.Data;
namespace OwnChar.Api.Packets.General;
public class GetSingleObjectResponse<T>(T? result) : OwnCharResponse where T : OwnCharObject
{
public T? Result { get; } = result;
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.General;
public class GetSinlgeObjectRequest(long objectId) : OwnCharRequest
{
public long ObjectId { get; } = objectId;
}

View File

@@ -0,0 +1,10 @@
using OwnChar.Api.Packets;
using Pilz.Cryptography;
namespace OwnChar.Api.Packets.General;
public class LoginRequest(string username, SecureString password) : OwnCharRequest
{
public new string Username { get; set; } = username;
public SecureString Password { get; } = password;
}

View File

@@ -1,6 +1,7 @@
using OwnChar.Client.Data.Model;
using OwnChar.Api.Packets;
using OwnChar.Data.Model.Client;
namespace OwnChar.Base.Data.Responses;
namespace OwnChar.Api.Packets.General;
public class LoginResponse(UserAccount? account, UserProfile? profile, string? secret) : OwnCharResponse
{

View File

@@ -0,0 +1,7 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.General;
public class LogoutRequest : OwnCharRequest
{
}

View File

@@ -0,0 +1,7 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.General;
public class LogoutResponse : OwnCharResponse
{
}

View File

@@ -0,0 +1,7 @@
namespace OwnChar.Api.Packets.General;
public class SetOwnerRequest : OwnCharRequest
{
public long ObjectId { get; set; }
public bool Enforce { get; set; }
}

View File

@@ -0,0 +1,5 @@
namespace OwnChar.Api.Packets.General;
public class SetOwnerResponse : OwnCharResponse
{
}

View File

@@ -1,6 +1,7 @@
using OwnChar.Base.Data.Updates;
using OwnChar.Api.Packets;
using OwnChar.Api.Updates;
namespace OwnChar.Base.Data.Requests;
namespace OwnChar.Api.Packets.General;
public class UpdateRequest(OwnCharObjectUpdate update) : OwnCharRequest
{

View File

@@ -0,0 +1,7 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.General;
public class UpdateResponse : OwnCharResponse
{
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.Groups;
public class CreateGroupRequest : OwnCharRequest
{
public string? Name { get; set; }
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Api.Packets;
using OwnChar.Data.Model.Client;
namespace OwnChar.Api.Packets.Groups;
public class CreateGroupResponse(Group? group) : OwnCharResponse
{
public Group? Group { get; } = group;
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.Groups;
public class GetGroupMembersRequest(long groupId) : OwnCharRequest
{
public long GroupId { get; } = groupId;
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Data;
using OwnChar.Data.Model.Client;
namespace OwnChar.Api.Packets.Groups;
public class GetGroupMembersResponse(List<MemberEntry> members) : OwnCharResponse
{
public List<MemberEntry> Members { get; } = members;
}

View File

@@ -0,0 +1,10 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.Groups;
public class GetGroupsRequest : OwnCharRequest
{
public long ProfileId { get; set; } = -1;
public bool UseProfileId { get; set; }
public bool IncludeNonPublic { get; set; }
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Api.Packets;
using OwnChar.Data.Model.Client;
namespace OwnChar.Api.Packets.Groups;
public class GetGroupsResponse(List<Group> groups) : OwnCharResponse
{
public List<Group> Groups { get; } = groups;
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Data;
namespace OwnChar.Api.Packets.Groups;
public class GroupMemberAddRequest() : OwnCharRequest
{
public long GroupId { get; set; } = -1;
public Dictionary<long, MemberLevel> Members { get; set; } = [];
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Data.Model.Client;
namespace OwnChar.Api.Packets.Groups;
public class GroupMemberAddResponse(List<MemberEntry> addedMembers) : OwnCharResponse
{
public List<MemberEntry> AddedMembers { get; } = addedMembers;
}

View File

@@ -1,8 +1,9 @@
using Pilz.Cryptography;
namespace OwnChar.Base.Data;
namespace OwnChar.Api.Packets;
public class OwnCharRequest
{
public string? Username { get; set; } = null;
public SecureString? AuthSecret { get; set; } = null;
}

View File

@@ -1,11 +1,11 @@
using System.Text.Json.Serialization;
namespace OwnChar.Base.Data;
namespace OwnChar.Api.Packets;
public class OwnCharResponse
{
public OwnCharResponseError ErrorCode { get; set; }
[JsonIgnore]
public bool IsSuccess => ErrorCode != OwnCharResponseError.None;
public OwnCharResponseError ErrorCode { get; set; }
}

View File

@@ -0,0 +1,9 @@
namespace OwnChar.Api.Packets;
public enum OwnCharResponseError
{
None,
Default,
NotFound,
StillInUse,
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.UserProfiles;
public class GetUserProfileRequest(long userProfileId) : OwnCharRequest
{
public long UserProfileId { get; } = userProfileId;
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Api.Packets;
using OwnChar.Data.Model.Client;
namespace OwnChar.Api.Packets.UserProfiles;
public class GetUserProfileResponse(UserProfile? profile) : OwnCharResponse
{
public UserProfile? Profile { get; } = profile;
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Api.Packets;
namespace OwnChar.Api.Packets.UserProfiles;
public class GetUserProfilesRequest : OwnCharRequest
{
public bool AllProfiles { get; set; }
}

View File

@@ -0,0 +1,9 @@
using OwnChar.Api.Packets;
using OwnChar.Data.Model.Client;
namespace OwnChar.Api.Packets.UserProfiles;
public class GetUserProfilesResponse(List<UserProfile> profiles) : OwnCharResponse
{
public List<UserProfile> Profiles { get; } = profiles;
}

View File

@@ -1,6 +1,6 @@
using OwnChar.Client.Data.Model;
using OwnChar.Data.Model.Client;
namespace OwnChar.Base.Data.Updates;
namespace OwnChar.Api.Updates;
public class GroupUpdate : OwnCharObjectUpdate
{

View File

@@ -0,0 +1,9 @@
using OwnChar.Data;
namespace OwnChar.Api.Updates;
public class MemberUpdate : OwnCharObjectUpdate
{
public long GroupId { get; set; }
public MemberLevel Level { get; set; }
}

View File

@@ -1,4 +1,6 @@
namespace OwnChar.Base.Data.Updates;
using OwnChar.Data;
namespace OwnChar.Api.Updates;
public abstract class OwnCharObjectUpdate
{

View File

@@ -1,8 +0,0 @@
namespace OwnChar.Base.Data;
public enum OwnCharResponseError
{
None,
Default,
NotAuthorized,
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,14 +0,0 @@
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

@@ -1,13 +0,0 @@
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

@@ -1,14 +0,0 @@
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

@@ -1,12 +0,0 @@
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.Base.Data;
namespace OwnChar.Data;
public enum MemberLevel
{

View File

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

View File

@@ -1,8 +1,8 @@
namespace OwnChar.Base.Data.Model;
namespace OwnChar.Data.Model.Base;
public abstract class GroupBase : OwnCharObject
{
public virtual string? Name { get; set; }
public virtual string? Fandom { get; set; }
public virtual string? Fandom { get; set; }
public virtual bool IsInternal { get; set; }
}

View File

@@ -1,6 +1,4 @@
using OwnChar.Client.Data.Model;
namespace OwnChar.Base.Data.Model;
namespace OwnChar.Data.Model.Base;
public abstract class MemberEntryBase : OwnCharObject
{

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,6 +1,6 @@
using OwnChar.Base.Data.Model;
using OwnChar.Data.Model.Base;
namespace OwnChar.Client.Data.Model;
namespace OwnChar.Data.Model.Client;
public class Character() : CharacterBase
{

View File

@@ -0,0 +1,7 @@
using OwnChar.Data.Model.Base;
namespace OwnChar.Data.Model.Client;
public class Group : GroupBase
{
}

View File

@@ -0,0 +1,8 @@
using OwnChar.Data.Model.Base;
namespace OwnChar.Data.Model.Client;
public class MemberEntry() : MemberEntryBase
{
public long UserProfileId { get; set; }
}

View File

@@ -1,6 +1,6 @@
using OwnChar.Base.Data.Model;
using OwnChar.Data.Model.Base;
namespace OwnChar.Client.Data.Model;
namespace OwnChar.Data.Model.Client;
public class Property() : PropertyBase
{

View File

@@ -1,6 +1,6 @@
using OwnChar.Base.Data.Model;
using OwnChar.Data.Model.Base;
namespace OwnChar.Client.Data.Model;
namespace OwnChar.Data.Model.Client;
public class PropertyCategory() : PropertyCategoryBase
{

View File

@@ -0,0 +1,7 @@
using OwnChar.Data.Model.Base;
namespace OwnChar.Data.Model.Client;
public class UserAccount() : UserAccountBase
{
}

View File

@@ -0,0 +1,7 @@
using OwnChar.Data.Model.Base;
namespace OwnChar.Data.Model.Client;
public class UserProfile() : UserProfileBase
{
}

View File

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

View File

@@ -1,9 +1,9 @@
namespace OwnChar.Base.Data;
namespace OwnChar.Data;
public enum UserType
{
None,
Guest,
User,
Admin
Admin,
}

View File

@@ -1,9 +1,9 @@
using OwnChar.Client.Data;
using OwnChar.Client.Data.Model;
using OwnChar.Client.Managers;
using OwnChar.Api;
using OwnChar.Data.Model.Client;
using OwnChar.Modules;
using Pilz.Cryptography;
namespace OwnChar.Client;
namespace OwnChar;
public interface IOwnCharManager
{

39
OwnChar/JsonHelpers.cs Normal file
View File

@@ -0,0 +1,39 @@
using Newtonsoft.Json;
using OwnChar.Api.Packets;
namespace OwnChar;
public static class JsonHelpers
{
private static JsonSerializerSettings? defaultSerializerSettings;
public static JsonSerializerSettings DefaultSerializerSettings => defaultSerializerSettings ??= CreateDefaultSerializerSettings();
private static JsonSerializerSettings CreateDefaultSerializerSettings()
{
return new JsonSerializerSettings
{
TypeNameHandling = TypeNameHandling.Auto,
};
}
public static string? SerializeRequest<T>(T request) where T : OwnCharRequest
{
return JsonConvert.SerializeObject(request, DefaultSerializerSettings);
}
public static string? SerializeResponse<T>(T request) where T : OwnCharResponse
{
return JsonConvert.SerializeObject(request, DefaultSerializerSettings);
}
public static T? DeserializeRequest<T>(string request) where T : OwnCharRequest
{
return JsonConvert.DeserializeObject<T>(request, DefaultSerializerSettings);
}
public static T? DeserializeResponse<T>(string request) where T : OwnCharResponse
{
return JsonConvert.DeserializeObject<T>(request, DefaultSerializerSettings);
}
}

View File

@@ -1,7 +1,7 @@
using OwnChar.Data;
using OwnChar.Model;
namespace OwnChar.Client.Managers;
namespace OwnChar.Modules;
internal class CharacterManager(OwnCharManager manager) : OwnCharManagerModule(manager), ICharacterManager
{

View File

@@ -1,7 +1,4 @@
using OwnChar.Data;
using OwnChar.Model;
namespace OwnChar.Client.Managers;
namespace OwnChar.Modules;
internal class GroupsManager(OwnCharManager manager) : OwnCharManagerModule(manager), IGroupsManager
{

View File

@@ -1,6 +1,6 @@
using OwnChar.Model;
namespace OwnChar.Client.Managers;
namespace OwnChar.Modules;
public interface ICharacterManager
{
CharacterBase? CreateCharacter(string? name);

View File

@@ -1,6 +1,6 @@
using OwnChar.Model;
namespace OwnChar.Client.Managers;
namespace OwnChar.Modules;
public interface IGroupsManager
{
IQueryable<GroupBase>? GetGroups(UserProfileBase? profile);

View File

@@ -1,7 +1,7 @@
using OwnChar.Model;
using Pilz.Cryptography;
namespace OwnChar.Client.Managers;
namespace OwnChar.Modules;
public interface IUserManager
{

View File

@@ -2,7 +2,7 @@
using OwnChar.Model;
using Pilz.Cryptography;
namespace OwnChar.Client.Managers;
namespace OwnChar.Modules;
internal class UserManager(OwnCharManager manager) : OwnCharManagerModule(manager), IUserManager
{

View File

@@ -1,6 +1,7 @@
using OwnChar.Base.Data;
using OwnChar.Api.Exceptions;
using OwnChar.Api.Packets;
using OwnChar.Data;
using OwnChar.Model;
using OwnChar.Data.Model.Base;
using System.Diagnostics.CodeAnalysis;
namespace OwnChar;
@@ -23,55 +24,25 @@ public static class OwnCharExtensions
return account.Type >= permissions;
}
#region OnActionEventArgs
public static bool SetResult(this OnActionEventArgs @this, object? data)
public static void EnsureSuccess(this OwnCharResponse response)
{
@this.Result = data;
return @this.Result != null;
if (!response.IsSuccess)
throw new ApiException("This API call failed! Reason: " + response.ErrorCode.ToString());
}
public static bool SetResultT(this OnActionEventArgs @this, object? data)
public static T With<T>(this T response, OwnCharResponseError error) where T : OwnCharResponse
{
@this.Result = data;
return true;
response.ErrorCode = error;
return response;
}
public static bool GetParam<T>(this OnActionEventArgs @this, int index, [NotNullWhen(true)] out T? result)
public static bool Is(this UserAccountBase user, UserType type)
{
return @this.Parameters.GetAt(index, out result);
return user.Type >= type;
}
public static bool GetObject<T>(this OnActionEventArgs @this, [NotNullWhen(true)] out T? result)
public static bool IsNot(this UserAccountBase user, UserType type)
{
if (@this.Object is T t)
{
result = t;
return true;
}
result = default;
return false;
return user.Type < type;
}
public static bool Is(this OnActionEventArgs @this, DataManagerActionType actionType)
{
return @this.ActionType == actionType;
}
public static bool Is(this OnActionEventArgs @this, DataManagerAction action)
{
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<OnActionEventArgs, bool> isOwner)
{
return @this.Is(maxLevel) || (@this.Is(minLevel) && isOwner(@this));
}
#endregion
}

View File

@@ -1,11 +1,11 @@
using OwnChar.Api.Exceptions;
using OwnChar.Client.Data;
using OwnChar.Client.Data.Model;
using OwnChar.Client.Managers;
using OwnChar.Api;
using OwnChar.Api.Exceptions;
using OwnChar.Data.Model.Client;
using OwnChar.Modules;
using Pilz.Cryptography;
using System.Diagnostics.CodeAnalysis;
namespace OwnChar.Client;
namespace OwnChar;
internal class OwnCharManager : IOwnCharManager
{

View File

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

View File

@@ -1,16 +0,0 @@
using Microsoft.EntityFrameworkCore;
namespace OwnChar.Data;
public class DatabaseContext(string? dbHost, string? dbUser, string? dbPassword) : DbContext
{
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
}
}

View File

@@ -1,11 +0,0 @@
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

@@ -1,16 +0,0 @@
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

@@ -1,15 +0,0 @@
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

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

View File

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

View File

@@ -1,9 +0,0 @@
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

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