Compare commits
1 Commits
6b5445ccdf
...
f268058cdc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f268058cdc |
@@ -1,5 +1,5 @@
|
|||||||
namespace OwnChar.Api.Clients;
|
namespace OwnChar.Api.Clients;
|
||||||
|
|
||||||
public class CharactersApiClient(OwnCharApiClient client)
|
internal class CharactersApiClient(OwnCharApiClient client) : ICharactersApiClient
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,40 +4,40 @@ using OwnChar.Data.Model.Client;
|
|||||||
|
|
||||||
namespace OwnChar.Api.Clients;
|
namespace OwnChar.Api.Clients;
|
||||||
|
|
||||||
public class GroupsApiClient(OwnCharApiClient client)
|
internal class GroupsApiClient(IOwnCharApiClient client) : IGroupsApiClient
|
||||||
{
|
{
|
||||||
public async Task<Group?> GetGroup(long id)
|
public async Task<Group?> GetGroup(long id)
|
||||||
{
|
{
|
||||||
var result = await client.MakeRequest<GetSinlgeObjectRequest, GetSingleObjectResponse<Group>>("/groups/get/byid", new(id));
|
var result = await client.SendRequest<GetSingleObjectResponse<Group>>("/groups/get/byid", new GetSinlgeObjectRequest(id));
|
||||||
result.EnsureSuccess();
|
result.EnsureOk();
|
||||||
return result.Result;
|
return result.Message.Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Group>> GetGroupsForProfile(long userProfileId)
|
public async Task<IEnumerable<Group>> GetGroupsForProfile(long userProfileId)
|
||||||
{
|
{
|
||||||
var result = await client.MakeRequest<GetGroupsRequest, GetGroupsResponse>("/groups/get", new()
|
var result = await client.SendRequest<GetGroupsResponse>("/groups/get", new GetGroupsRequest
|
||||||
{
|
{
|
||||||
ProfileId = userProfileId,
|
ProfileId = userProfileId,
|
||||||
UseProfileId = true,
|
UseProfileId = true,
|
||||||
});
|
});
|
||||||
result.EnsureSuccess();
|
result.EnsureOk();
|
||||||
return result.Groups;
|
return result.Message.Groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Group>> GetPublicGroups()
|
public async Task<IEnumerable<Group>> GetPublicGroups()
|
||||||
{
|
{
|
||||||
var result = await client.MakeRequest<GetGroupsRequest, GetGroupsResponse>("/groups/get", new());
|
var result = await client.SendRequest<GetGroupsResponse>("/groups/get", new GetGroupsRequest());
|
||||||
result.EnsureSuccess();
|
result.EnsureOk();
|
||||||
return result.Groups;
|
return result.Message.Groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<IEnumerable<Group>> GetAllGroups()
|
public async Task<IEnumerable<Group>> GetAllGroups()
|
||||||
{
|
{
|
||||||
var result = await client.MakeRequest<GetGroupsRequest, GetGroupsResponse>("/groups/get", new()
|
var result = await client.SendRequest<GetGroupsResponse>("/groups/get", new GetGroupsRequest
|
||||||
{
|
{
|
||||||
IncludeNonPublic = true,
|
IncludeNonPublic = true,
|
||||||
});
|
});
|
||||||
result.EnsureSuccess();
|
result.EnsureOk();
|
||||||
return result.Groups;
|
return result.Message.Groups;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
OwnChar/Api/Clients/ICharactersApiClient.cs
Normal file
5
OwnChar/Api/Clients/ICharactersApiClient.cs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
namespace OwnChar.Api.Clients;
|
||||||
|
|
||||||
|
public interface ICharactersApiClient
|
||||||
|
{
|
||||||
|
}
|
||||||
10
OwnChar/Api/Clients/IGroupsApiClient.cs
Normal file
10
OwnChar/Api/Clients/IGroupsApiClient.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using OwnChar.Data.Model.Client;
|
||||||
|
|
||||||
|
namespace OwnChar.Api.Clients;
|
||||||
|
public interface IGroupsApiClient
|
||||||
|
{
|
||||||
|
Task<IEnumerable<Group>> GetAllGroups();
|
||||||
|
Task<Group?> GetGroup(long id);
|
||||||
|
Task<IEnumerable<Group>> GetGroupsForProfile(long userProfileId);
|
||||||
|
Task<IEnumerable<Group>> GetPublicGroups();
|
||||||
|
}
|
||||||
9
OwnChar/Api/Clients/ILoginApiClient.cs
Normal file
9
OwnChar/Api/Clients/ILoginApiClient.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
using OwnChar.Data.Model.Client;
|
||||||
|
using Pilz.Cryptography;
|
||||||
|
|
||||||
|
namespace OwnChar.Api.Clients;
|
||||||
|
public interface ILoginApiClient
|
||||||
|
{
|
||||||
|
Task<UserProfile?> Login(string username, SecureString password);
|
||||||
|
Task<bool> Logout();
|
||||||
|
}
|
||||||
11
OwnChar/Api/Clients/IUsersApiClient.cs
Normal file
11
OwnChar/Api/Clients/IUsersApiClient.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace OwnChar.Api.Clients;
|
||||||
|
|
||||||
|
public interface IUsersApiClient
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -1,20 +1,21 @@
|
|||||||
using OwnChar.Api.Packets;
|
using OwnChar.Api.Packets.General;
|
||||||
using OwnChar.Api.Packets.General;
|
|
||||||
using OwnChar.Data.Model.Client;
|
using OwnChar.Data.Model.Client;
|
||||||
using Pilz.Cryptography;
|
using Pilz.Cryptography;
|
||||||
|
|
||||||
namespace OwnChar.Api.Clients;
|
namespace OwnChar.Api.Clients;
|
||||||
|
|
||||||
public class LoginApiClient(OwnCharApiClient client)
|
internal class LoginApiClient(OwnCharApiClient client) : ILoginApiClient
|
||||||
{
|
{
|
||||||
public async Task<UserProfile?> Login(string username, SecureString password)
|
public async Task<UserProfile?> Login(string username, SecureString password)
|
||||||
{
|
{
|
||||||
var result = await client.MakeRequest<LoginRequest, LoginResponse>("/auth/login", new(username, password));
|
var result = await client.SendRequest<LoginResponse>("/auth/login", new LoginRequest(username, password));
|
||||||
|
result.EnsureOk();
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(result.Secret) && result.Profile != null && result.Account != null)
|
if (!string.IsNullOrEmpty(result.Message.Secret) && result.Message.Profile != null && result.Message.Account != null)
|
||||||
{
|
{
|
||||||
client.AuthSecret = result.Secret;
|
client.AuthKey = result.Message.Secret;
|
||||||
return result.Profile;
|
client.CurrentUser = result.Message.Account;
|
||||||
|
return result.Message.Profile;
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
@@ -22,8 +23,8 @@ public class LoginApiClient(OwnCharApiClient client)
|
|||||||
|
|
||||||
public async Task<bool> Logout()
|
public async Task<bool> Logout()
|
||||||
{
|
{
|
||||||
await client.MakeRequest<LogoutRequest, OwnCharResponse>("/auth/logout", new());
|
var res = await client.SendRequest("/auth/logout");
|
||||||
client.AuthSecret = null;
|
client.AuthKey = null;
|
||||||
return true;
|
return res.IsOk;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
namespace OwnChar.Api.Clients;
|
namespace OwnChar.Api.Clients;
|
||||||
|
|
||||||
public class UsersApiClient(OwnCharApiClient client)
|
internal class UsersApiClient(IOwnCharApiClient client) : IUsersApiClient
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|||||||
21
OwnChar/Api/IOwnCharApiClient.cs
Normal file
21
OwnChar/Api/IOwnCharApiClient.cs
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
using OwnChar.Api.Clients;
|
||||||
|
using OwnChar.Data.Model.Client;
|
||||||
|
using Pilz.Net.Api;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
|
namespace OwnChar.Api;
|
||||||
|
public interface IOwnCharApiClient : IApiClient
|
||||||
|
{
|
||||||
|
UserAccount? CurrentUser { get; }
|
||||||
|
|
||||||
|
[MemberNotNullWhen(true, nameof(AuthKey), nameof(CurrentUser))]
|
||||||
|
bool IsLoggedIn { get; }
|
||||||
|
|
||||||
|
ILoginApiClient Auth { get; }
|
||||||
|
|
||||||
|
IGroupsApiClient Groups { get; }
|
||||||
|
|
||||||
|
ICharactersApiClient Characters { get; }
|
||||||
|
|
||||||
|
IUsersApiClient Users { get; }
|
||||||
|
}
|
||||||
@@ -1,49 +1,38 @@
|
|||||||
using OwnChar.Api.Clients;
|
using OwnChar.Api.Clients;
|
||||||
using OwnChar.Api.Exceptions;
|
using OwnChar.Data.Model.Client;
|
||||||
using OwnChar.Api.Packets;
|
|
||||||
using Pilz.Cryptography;
|
using Pilz.Cryptography;
|
||||||
using Pilz.Net.Api;
|
using Pilz.Net.Api;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
namespace OwnChar.Api;
|
namespace OwnChar.Api;
|
||||||
|
|
||||||
public class OwnCharApiClient : ApiClient
|
internal class OwnCharApiClient : ApiClient, IOwnCharApiClient
|
||||||
{
|
{
|
||||||
private readonly Dictionary<Type, object> clients = [];
|
public UserAccount? CurrentUser { get; internal set; }
|
||||||
|
|
||||||
internal string? AuthSecret { get; set; } = null;
|
[MemberNotNullWhen(true, nameof(AuthKey), nameof(CurrentUser))]
|
||||||
public bool IsLoggedIn => AuthSecret != null;
|
public bool IsLoggedIn => CurrentUser != null && !string.IsNullOrWhiteSpace(AuthKey);
|
||||||
|
|
||||||
public LoginApiClient Auth { get; }
|
public ILoginApiClient Auth { get; }
|
||||||
public UsersApiClient Users { get; }
|
|
||||||
public CharactersApiClient Characters { get; }
|
public IGroupsApiClient Groups { get; }
|
||||||
public GroupsApiClient Groups { get; }
|
|
||||||
|
public ICharactersApiClient Characters { get; }
|
||||||
|
|
||||||
|
public IUsersApiClient Users { get; }
|
||||||
|
|
||||||
public OwnCharApiClient(string apiUrl) : base(apiUrl)
|
public OwnCharApiClient(string apiUrl) : base(apiUrl)
|
||||||
{
|
{
|
||||||
Auth = GetClient<LoginApiClient>();
|
Auth = new LoginApiClient(this);
|
||||||
Users = GetClient<UsersApiClient>();
|
Groups = new GroupsApiClient(this);
|
||||||
Characters = GetClient<CharactersApiClient>();
|
Characters = new CharactersApiClient(this);
|
||||||
Groups = GetClient<GroupsApiClient>();
|
Users = new UsersApiClient(this);
|
||||||
}
|
|
||||||
|
|
||||||
public T GetClient<T>() where T : class
|
|
||||||
{
|
|
||||||
var t = typeof(T);
|
|
||||||
|
|
||||||
if (clients.TryGetValue(t, out var client) && client is T clientT1)
|
|
||||||
return clientT1;
|
|
||||||
|
|
||||||
if (Activator.CreateInstance(t, this) is T clientT2)
|
|
||||||
{
|
|
||||||
clients.Add(t, clientT2);
|
|
||||||
return clientT2;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new Exception("Client could not be created!");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override string? EncodeAuthKey()
|
protected override string? EncodeAuthKey()
|
||||||
{
|
{
|
||||||
return new SecureString(base.EncodeAuthKey(), false);
|
if (IsLoggedIn && !string.IsNullOrWhiteSpace(CurrentUser.Username))
|
||||||
|
return new SecureString($"{CurrentUser}:{AuthKey}", false).EncryptedValue;
|
||||||
|
return AuthKey;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +0,0 @@
|
|||||||
using OwnChar.Api.Packets;
|
|
||||||
|
|
||||||
namespace OwnChar.Api.Packets.General;
|
|
||||||
|
|
||||||
public class DeleteObjectResponse : OwnCharResponse
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
using OwnChar.Api.Packets;
|
|
||||||
|
|
||||||
namespace OwnChar.Api.Packets.General;
|
|
||||||
|
|
||||||
public class LogoutRequest : OwnCharRequest
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
using OwnChar.Api.Packets;
|
|
||||||
|
|
||||||
namespace OwnChar.Api.Packets.General;
|
|
||||||
|
|
||||||
public class LogoutResponse : OwnCharResponse
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
namespace OwnChar.Api.Packets.General;
|
|
||||||
|
|
||||||
public class SetOwnerResponse : OwnCharResponse
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
using OwnChar.Api.Packets;
|
|
||||||
|
|
||||||
namespace OwnChar.Api.Packets.General;
|
|
||||||
|
|
||||||
public class UpdateResponse : OwnCharResponse
|
|
||||||
{
|
|
||||||
}
|
|
||||||
@@ -1,9 +1,7 @@
|
|||||||
using Pilz.Cryptography;
|
using Pilz.Net.Api;
|
||||||
|
|
||||||
namespace OwnChar.Api.Packets;
|
namespace OwnChar.Api.Packets;
|
||||||
|
|
||||||
public class OwnCharRequest
|
public class OwnCharRequest : ApiMessage
|
||||||
{
|
{
|
||||||
public string? Username { get; set; } = null;
|
|
||||||
public SecureString? AuthSecret { get; set; } = null;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
using System.Text.Json.Serialization;
|
using Pilz.Net.Api;
|
||||||
|
|
||||||
namespace OwnChar.Api.Packets;
|
namespace OwnChar.Api.Packets;
|
||||||
|
|
||||||
public class OwnCharResponse
|
public class OwnCharResponse : ApiMessage
|
||||||
{
|
{
|
||||||
public OwnCharResponseError ErrorCode { get; set; }
|
|
||||||
|
|
||||||
[JsonIgnore]
|
|
||||||
public bool IsSuccess => ErrorCode != OwnCharResponseError.None;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +0,0 @@
|
|||||||
namespace OwnChar.Api.Packets;
|
|
||||||
|
|
||||||
public enum OwnCharResponseError
|
|
||||||
{
|
|
||||||
None,
|
|
||||||
Default,
|
|
||||||
NotFound,
|
|
||||||
StillInUse,
|
|
||||||
}
|
|
||||||
11
OwnChar/Extensions/ApiRequestInfoExtensions.cs
Normal file
11
OwnChar/Extensions/ApiRequestInfoExtensions.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using Pilz.Net.Api;
|
||||||
|
|
||||||
|
namespace OwnChar.Extensions;
|
||||||
|
|
||||||
|
public static class ApiRequestInfoExtensions
|
||||||
|
{
|
||||||
|
public static string? GetUsername(this ApiRequestInfo @this)
|
||||||
|
{
|
||||||
|
return @this.AuthKey?.Split(':').ElementAtOrDefault(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,17 +8,16 @@ namespace OwnChar;
|
|||||||
public interface IOwnCharManager
|
public interface IOwnCharManager
|
||||||
{
|
{
|
||||||
bool IsLoggedIn { get; }
|
bool IsLoggedIn { get; }
|
||||||
OwnCharApiClient? Api { get; }
|
|
||||||
|
IOwnCharApiClient? Api { get; }
|
||||||
|
|
||||||
IUserManager Users { get; }
|
IUserManager Users { get; }
|
||||||
|
|
||||||
IGroupsManager Groups { get; }
|
IGroupsManager Groups { get; }
|
||||||
|
|
||||||
ICharacterManager Characters { get; }
|
ICharacterManager Characters { get; }
|
||||||
|
|
||||||
Task<UserProfile?> Login(string? username, SecureString? password);
|
Task<UserProfile?> Login(string? username, SecureString? password);
|
||||||
Task<bool> Logout();
|
|
||||||
|
|
||||||
public static IOwnCharManager CreateDefault()
|
Task<bool> Logout();
|
||||||
{
|
|
||||||
return new OwnCharManager();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -7,17 +7,17 @@ using System.Diagnostics.CodeAnalysis;
|
|||||||
|
|
||||||
namespace OwnChar;
|
namespace OwnChar;
|
||||||
|
|
||||||
internal class OwnCharManager : IOwnCharManager
|
public class OwnCharManager : IOwnCharManager
|
||||||
{
|
{
|
||||||
// User
|
[MemberNotNullWhen(true, nameof(Api))]
|
||||||
public bool IsLoggedIn => Api is not null && Api.IsLoggedIn;
|
public bool IsLoggedIn => Api is not null && Api.IsLoggedIn;
|
||||||
|
|
||||||
// Data Provider
|
public IOwnCharApiClient? Api { get; private set; }
|
||||||
public OwnCharApiClient? Api { get; private set; }
|
|
||||||
|
|
||||||
// Manager
|
|
||||||
public IUserManager Users { get; }
|
public IUserManager Users { get; }
|
||||||
|
|
||||||
public IGroupsManager Groups { get; }
|
public IGroupsManager Groups { get; }
|
||||||
|
|
||||||
public ICharacterManager Characters { get; }
|
public ICharacterManager Characters { get; }
|
||||||
|
|
||||||
public OwnCharManager()
|
public OwnCharManager()
|
||||||
|
|||||||
Reference in New Issue
Block a user