uff, lot of work
This commit is contained in:
@@ -1,25 +1,17 @@
|
|||||||
namespace OwnChar.ServerNew.Api.Endpoint;
|
using OwnChar.Api.Packets;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Api.Endpoint;
|
||||||
|
|
||||||
internal class ApiBuilder(WebApplication app) : IApiBuilder
|
internal class ApiBuilder(WebApplication app) : IApiBuilder
|
||||||
{
|
{
|
||||||
public void Map(string method, string pattern, Delegate action)
|
public void MapRequest(string pattern, Delegate action)
|
||||||
{
|
{
|
||||||
if (method == ApiRequestMethods.Get)
|
Map(pattern + "/{request}", action);
|
||||||
app.MapGet(pattern, action);
|
|
||||||
else if (method == ApiRequestMethods.Post)
|
|
||||||
app.MapPost(pattern, action);
|
|
||||||
else if (method == ApiRequestMethods.Put)
|
|
||||||
app.MapPut(pattern, action);
|
|
||||||
else if (method == ApiRequestMethods.Patch)
|
|
||||||
app.MapPatch(pattern, action);
|
|
||||||
else if (method == ApiRequestMethods.Delete)
|
|
||||||
app.MapDelete(pattern, action);
|
|
||||||
else
|
|
||||||
throw new NotSupportedException();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Map(string pattern, Delegate action)
|
public void Map(string pattern, Delegate action)
|
||||||
{
|
{
|
||||||
app.Map(pattern, action);
|
//app.Map(pattern, action);
|
||||||
|
app.MapPost(pattern, action);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using System.Net;
|
using System.Net;
|
||||||
|
|
||||||
namespace OwnChar.ServerNew.Api.Endpoint;
|
namespace OwnChar.Server.Api.Endpoint;
|
||||||
|
|
||||||
public static class ApiRequestMethods
|
public static class ApiRequestMethods
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
namespace OwnChar.ServerNew.Api.Endpoint;
|
using OwnChar.Api.Packets;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Api.Endpoint;
|
||||||
|
|
||||||
public interface IApiBuilder
|
public interface IApiBuilder
|
||||||
{
|
{
|
||||||
|
void MapRequest(string pattern, Delegate action);
|
||||||
void Map(string path, Delegate action);
|
void Map(string path, Delegate action);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace OwnChar.ServerNew.Api.Endpoint;
|
namespace OwnChar.Server.Api.Endpoint;
|
||||||
|
|
||||||
internal interface IApiEndpoint
|
internal interface IApiEndpoint
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,7 @@
|
|||||||
namespace OwnChar.ServerNew.Api.Endpoint.Implementations;
|
using OwnChar.Server.Api;
|
||||||
|
using OwnChar.Server.Api.Endpoint;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Api.Endpoint.Implementations;
|
||||||
|
|
||||||
internal class CharactersApi(IServer server) : IApiEndpoint
|
internal class CharactersApi(IServer server) : IApiEndpoint
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,48 +1,188 @@
|
|||||||
namespace OwnChar.ServerNew.Api.Endpoint.Implementations;
|
using OwnChar.Api.Packets;
|
||||||
|
using OwnChar.Api.Packets.General;
|
||||||
|
using OwnChar.Api.Packets.Groups;
|
||||||
|
using OwnChar.Api.Updates;
|
||||||
|
using OwnChar.Data;
|
||||||
|
using OwnChar.Data.Model.Client;
|
||||||
|
using OwnChar.Server.Data.Model;
|
||||||
|
using OwnChar.Server.Extensions;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Api.Endpoint.Implementations;
|
||||||
|
|
||||||
internal class GroupsApi(IServer server) : IApiEndpoint
|
internal class GroupsApi(IServer server) : IApiEndpoint
|
||||||
{
|
{
|
||||||
public void Initialize(IApiBuilder builder)
|
public void Initialize(IApiBuilder builder)
|
||||||
{
|
{
|
||||||
|
builder.MapRequest("/groups/get/byid", GetById);
|
||||||
|
builder.MapRequest("/groups/get", Get);
|
||||||
|
builder.MapRequest("/groups/create", Create);
|
||||||
|
builder.MapRequest("/groups/update", Update);
|
||||||
|
builder.MapRequest("/groups/delete", Delete);
|
||||||
|
builder.MapRequest("/groups/members/get", GetMembers);
|
||||||
|
builder.MapRequest("/groups/members/add", AddMembers);
|
||||||
|
builder.MapRequest("/groups/members/update", UpdateMember);
|
||||||
|
builder.MapRequest("/groups/members/remove", RemoveMembers);
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult GetGroups()
|
private IResult GetById(GetSinlgeObjectRequest request)
|
||||||
{
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.Guest, out UserAccountDb? user))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
if (server.Data?.Set<GroupDb>().FirstOrDefault(n => n.Id == request.ObjectId && n.Members.Any(m => m.User != null && m.User.Id == user.Id)) is not GroupDb group)
|
||||||
|
return TypedResults.Ok(new GetSingleObjectResponse<Group>(null).With(OwnCharResponseError.NotFound));
|
||||||
|
|
||||||
|
return TypedResults.Ok(new GetSingleObjectResponse<Group>(group.ToClient()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult GetGroups(long characterId)
|
private IResult Get(GetGroupsRequest request)
|
||||||
{
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.Guest, out UserAccountDb? user))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
IQueryable<GroupDb> groups;
|
||||||
|
|
||||||
|
if (request.UseProfileId && server.Data!.Set<UserProfileDb>().FirstOrDefault(p => p.Id == request.ProfileId) is UserProfileDb profile)
|
||||||
|
groups = server.Data!.Set<GroupDb>().Where(group => group.Members.Any(m => m.User != null && m.User.Id == profile.Id));
|
||||||
|
else if (request.IncludeNonPublic && user.Is(UserType.Admin))
|
||||||
|
groups = server.Data!.Set<GroupDb>();
|
||||||
|
else
|
||||||
|
groups = Array.Empty<GroupDb>().AsQueryable(); // Currently not supported.
|
||||||
|
|
||||||
|
return TypedResults.Ok(new GetGroupsResponse([.. groups.Select(g => g.ToClient())]));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult GetGroup(long groupId)
|
private IResult Create(CreateGroupRequest request)
|
||||||
{
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.User, out UserAccountDb? user))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
var group = new GroupDb();
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(request.Name))
|
||||||
|
group.Name = request.Name;
|
||||||
|
|
||||||
|
group.Members.Add(new()
|
||||||
|
{
|
||||||
|
User = user.Profile,
|
||||||
|
Level = MemberLevel.Owner,
|
||||||
|
});
|
||||||
|
|
||||||
|
server.Data!.Update(group);
|
||||||
|
server.Data.SaveChanges();
|
||||||
|
|
||||||
|
return TypedResults.Ok(new CreateGroupResponse(group.ToClient()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult CreateGroup(string name)
|
private IResult Update(UpdateRequest request)
|
||||||
{
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.User, out UserAccountDb? user)
|
||||||
|
|| server.Data?.Set<GroupDb>().FirstOrDefault(n => n.Id == request.Update.Id) is not GroupDb group
|
||||||
|
|| !group.Members.Any(m => m.Id == user.Profile!.Id && m.Level >= MemberLevel.Admin
|
||||||
|
|| user.IsNot(UserType.Admin)))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
if (request.Update is not GroupUpdate update)
|
||||||
|
return TypedResults.Ok(new UpdateResponse().With(OwnCharResponseError.Default));
|
||||||
|
|
||||||
|
group.Name = update.Name;
|
||||||
|
group.Fandom = update.Fandom;
|
||||||
|
|
||||||
|
server.Data.Update(group);
|
||||||
|
server.Data.SaveChanges();
|
||||||
|
|
||||||
|
return TypedResults.Ok(new UpdateResponse());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult UpdateGroup(int groupId, string name)
|
private IResult Delete(DeleteObjectRequest request)
|
||||||
{
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.User, out UserAccountDb? user)
|
||||||
|
|| server.Data?.Set<GroupDb>().FirstOrDefault(n => n.Id == request.ObjectId) is not GroupDb group
|
||||||
|
|| !group.Members.Any(m => m.Id == user.Profile!.Id && m.Level >= MemberLevel.Owner)
|
||||||
|
|| user.IsNot(UserType.Admin))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
server.Data.Remove(group);
|
||||||
|
server.Data.SaveChanges();
|
||||||
|
|
||||||
|
return TypedResults.Ok(new DeleteObjectResponse());
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult DeleteGroup(int groupId)
|
private IResult GetMembers(GetGroupMembersRequest request)
|
||||||
{
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.User, out UserAccountDb? user)
|
||||||
|
|| server.Data?.Set<GroupDb>().FirstOrDefault(n => n.Id == request.GroupId) is not GroupDb group
|
||||||
|
|| !group.Members.Any(m => m.Id == user.Profile!.Id && m.Level >= MemberLevel.Member)
|
||||||
|
|| user.IsNot(UserType.Admin))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
var members = group.Members.Select(n => n.ToClient());
|
||||||
|
return TypedResults.Ok(new GetGroupMembersResponse(members.ToList()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult AddMember(int groupId, long memberId)
|
private IResult AddMembers(GroupMemberAddRequest request)
|
||||||
{
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.User, out UserAccountDb? user)
|
||||||
|
|| server.Data?.Set<GroupDb>().FirstOrDefault(n => n.Id == request.GroupId) is not GroupDb group
|
||||||
|
|| !group.Members.Any(m => m.Id == user.Profile!.Id && m.Level >= MemberLevel.Admin)
|
||||||
|
|| user.IsNot(UserType.Admin))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
var addedMembers = new List<MemberEntryDb>();
|
||||||
|
|
||||||
|
foreach (var kvp in request.Members)
|
||||||
|
{
|
||||||
|
if (group.Members.FirstOrDefault(m => m.User != null && m.User.Id == kvp.Key) is not MemberEntryDb member
|
||||||
|
&& server.Data.Set<UserProfileDb>().FirstOrDefault(u => u.Id == kvp.Key) is UserProfileDb mu)
|
||||||
|
{
|
||||||
|
member = new()
|
||||||
|
{
|
||||||
|
User = mu,
|
||||||
|
Level = kvp.Value,
|
||||||
|
};
|
||||||
|
server.Data.Update(member);
|
||||||
|
server.Data.Update(group);
|
||||||
|
server.Data.SaveChanges();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private IResult RemoveMember(int groupId, long memberId)
|
return TypedResults.Ok(new GroupMemberAddResponse(addedMembers.Select(m => m.ToClient()).ToList()));
|
||||||
{
|
}
|
||||||
|
|
||||||
|
private IResult UpdateMember(UpdateRequest request)
|
||||||
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.User, out UserAccountDb? user)
|
||||||
|
|| server.Data?.Set<GroupDb>().FirstOrDefault(n => n.Id == request.Update.Id) is not GroupDb group
|
||||||
|
|| group.Members.FirstOrDefault(m => m.Id == request.Update.Id) is not MemberEntryDb member
|
||||||
|
|| !group.Members.Any(m => m.Id == user.Profile!.Id && m.Level >= MemberLevel.Admin
|
||||||
|
|| user.IsNot(UserType.Admin)))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
if (request.Update is not MemberUpdate update)
|
||||||
|
return TypedResults.Ok(new UpdateResponse().With(OwnCharResponseError.Default));
|
||||||
|
|
||||||
|
member.Level = update.Level;
|
||||||
|
|
||||||
|
server.Data.Update(member);
|
||||||
|
server.Data.SaveChanges();
|
||||||
|
|
||||||
|
return TypedResults.Ok(new UpdateResponse());
|
||||||
|
}
|
||||||
|
|
||||||
|
private IResult RemoveMembers(DeleteObjectRequest request)
|
||||||
|
{
|
||||||
|
if (!server.CheckLogin(request, UserType.User, out UserAccountDb? user)
|
||||||
|
|| server.Data?.Set<MemberEntryDb>().FirstOrDefault(m => m.Id == request.ObjectId) is not MemberEntryDb member
|
||||||
|
|| server.Data?.Set<GroupDb>().FirstOrDefault(n => n.Members.Contains(member)) is not GroupDb group
|
||||||
|
|| !group.Members.Any(m => m.Id == user.Profile!.Id && m.Level >= MemberLevel.Admin
|
||||||
|
|| user.IsNot(UserType.Admin)))
|
||||||
|
return TypedResults.Unauthorized();
|
||||||
|
|
||||||
|
group.Members.Remove(member);
|
||||||
|
server.Data.Remove(member);
|
||||||
|
server.Data.Update(group);
|
||||||
|
server.Data.SaveChanges();
|
||||||
|
|
||||||
|
return TypedResults.Ok(new DeleteObjectResponse());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
using OwnChar.Base.Data.Requests;
|
using OwnChar.Api.Packets;
|
||||||
using OwnChar.Base.Data.Responses;
|
using OwnChar.Api.Packets.General;
|
||||||
using OwnChar.Server.Data.Model;
|
using OwnChar.Server.Data.Model;
|
||||||
|
using OwnChar.Server.Extensions;
|
||||||
|
|
||||||
namespace OwnChar.ServerNew.Api.Endpoint.Implementations;
|
namespace OwnChar.Server.Api.Endpoint.Implementations;
|
||||||
|
|
||||||
internal class LoginApi(ServerContext server) : IApiEndpoint
|
internal class LoginApi(ServerContext server) : IApiEndpoint
|
||||||
{
|
{
|
||||||
@@ -20,13 +21,13 @@ internal class LoginApi(ServerContext server) : IApiEndpoint
|
|||||||
&& server.Data.Set<UserAccountDb>()?.FirstOrDefault(n => n.Username == request.Username && n.Password == request.Password) is UserAccountDb acc
|
&& server.Data.Set<UserAccountDb>()?.FirstOrDefault(n => n.Username == request.Username && n.Password == request.Password) is UserAccountDb acc
|
||||||
&& acc.Profile != null)
|
&& acc.Profile != null)
|
||||||
{
|
{
|
||||||
result = new(new(acc), new(acc.Profile), server.Login(acc));
|
result = new(acc.ToClient(), acc.Profile.ToClient(), server.Login(acc));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result = new(null, null, null)
|
result = new(null, null, null)
|
||||||
{
|
{
|
||||||
ErrorCode = Base.Data.OwnCharResponseError.NotAuthorized
|
ErrorCode = OwnCharResponseError.NotFound,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -36,6 +37,6 @@ internal class LoginApi(ServerContext server) : IApiEndpoint
|
|||||||
private IResult Logout(LogoutRequest request)
|
private IResult Logout(LogoutRequest request)
|
||||||
{
|
{
|
||||||
server.Logout(request.AuthSecret);
|
server.Logout(request.AuthSecret);
|
||||||
return TypedResults.Ok();
|
return TypedResults.Ok(new LogoutResponse());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
namespace OwnChar.ServerNew.Api.Endpoint.Implementations;
|
using OwnChar.Server.Api;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Api.Endpoint.Implementations;
|
||||||
|
|
||||||
internal class UsersApi(IServer server) : IApiEndpoint
|
internal class UsersApi(IServer server) : IApiEndpoint
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using OwnChar.Base.Data.Model;
|
using OwnChar.Data.Model.Base;
|
||||||
using Pilz.Configuration;
|
using Pilz.Configuration;
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using ILogger = Castle.Core.Logging.ILogger;
|
using ILogger = Castle.Core.Logging.ILogger;
|
||||||
|
|
||||||
namespace OwnChar.ServerNew.Api;
|
namespace OwnChar.Server.Api;
|
||||||
|
|
||||||
public interface IServer
|
public interface IServer
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
using OwnChar.ServerNew.Api.Endpoint;
|
using OwnChar.Server.Api.Endpoint;
|
||||||
using Pilz.Plugins.Advanced;
|
using Pilz.Plugins.Advanced;
|
||||||
|
|
||||||
namespace OwnChar.ServerNew.Api.Plugins;
|
namespace OwnChar.Server.Api.Plugins;
|
||||||
|
|
||||||
public abstract class ApiEndpointFeature(string identifier) : PluginFeature(FeatureType, identifier), IApiEndpoint
|
public abstract class ApiEndpointFeature(string identifier) : PluginFeature(FeatureType, identifier), IApiEndpoint
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
using OwnChar.Plugins;
|
using OwnChar.Plugins;
|
||||||
|
using OwnChar.Server.Api;
|
||||||
|
|
||||||
namespace OwnChar.ServerNew.Api.Plugins;
|
namespace OwnChar.Server.Api.Plugins;
|
||||||
|
|
||||||
public class OwnCharServerPluginInitParams(IServer server) : OwnCharPluginInitParams
|
public class OwnCharServerPluginInitParams(IServer server) : OwnCharPluginInitParams
|
||||||
{
|
{
|
||||||
|
|||||||
16
OwnChar.Server/Data/DatabaseContext.cs
Normal file
16
OwnChar.Server/Data/DatabaseContext.cs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.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);
|
||||||
|
}
|
||||||
|
}
|
||||||
11
OwnChar.Server/Data/Model/CharacterDb.cs
Normal file
11
OwnChar.Server/Data/Model/CharacterDb.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
using OwnChar.Client.Data.Model;
|
||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
public class CharacterDb : CharacterBase
|
||||||
|
{
|
||||||
|
public UserProfileDb? Owner { get; set; }
|
||||||
|
public List<PropertyCategoryDb> PropCats { get; } = [];
|
||||||
|
public List<PropertyDb> Props { get; } = [];
|
||||||
|
}
|
||||||
10
OwnChar.Server/Data/Model/GroupDb.cs
Normal file
10
OwnChar.Server/Data/Model/GroupDb.cs
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
using OwnChar.Api.Updates;
|
||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
public class GroupDb : GroupBase
|
||||||
|
{
|
||||||
|
public List<CharacterDb> Characters { get; } = [];
|
||||||
|
public List<MemberEntryDb> Members { get; } = [];
|
||||||
|
}
|
||||||
8
OwnChar.Server/Data/Model/MemberEntryDb.cs
Normal file
8
OwnChar.Server/Data/Model/MemberEntryDb.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
public class MemberEntryDb() : MemberEntryBase
|
||||||
|
{
|
||||||
|
public virtual UserProfileDb? User { get; set; }
|
||||||
|
}
|
||||||
7
OwnChar.Server/Data/Model/PropertyCategoryDb.cs
Normal file
7
OwnChar.Server/Data/Model/PropertyCategoryDb.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
public class PropertyCategoryDb : PropertyCategoryBase
|
||||||
|
{
|
||||||
|
}
|
||||||
7
OwnChar.Server/Data/Model/PropertyDb.cs
Normal file
7
OwnChar.Server/Data/Model/PropertyDb.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
public class PropertyDb : PropertyBase
|
||||||
|
{
|
||||||
|
}
|
||||||
9
OwnChar.Server/Data/Model/UserAccountDb.cs
Normal file
9
OwnChar.Server/Data/Model/UserAccountDb.cs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
public class UserAccountDb : UserAccountBase
|
||||||
|
{
|
||||||
|
public virtual string? Password { get; set; }
|
||||||
|
public UserProfileDb? Profile { get; set; }
|
||||||
|
}
|
||||||
8
OwnChar.Server/Data/Model/UserProfileDb.cs
Normal file
8
OwnChar.Server/Data/Model/UserProfileDb.cs
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
public class UserProfileDb : UserProfileBase
|
||||||
|
{
|
||||||
|
public List<CharacterDb> Characters { get; } = [];
|
||||||
|
}
|
||||||
39
OwnChar.Server/Extensions/GeneralExtensions.cs
Normal file
39
OwnChar.Server/Extensions/GeneralExtensions.cs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
using OwnChar.Api.Packets;
|
||||||
|
using OwnChar.Data;
|
||||||
|
using OwnChar.Data.Model.Base;
|
||||||
|
using OwnChar.Server.Api;
|
||||||
|
using OwnChar.Server.Data.Model;
|
||||||
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Extensions;
|
||||||
|
|
||||||
|
public static class GeneralExtensions
|
||||||
|
{
|
||||||
|
public static bool CheckLogin(this IServer server, OwnCharRequest request, UserType userType)
|
||||||
|
{
|
||||||
|
if (server.Data is null
|
||||||
|
|| string.IsNullOrWhiteSpace(request.Username)
|
||||||
|
|| string.IsNullOrWhiteSpace(request.AuthSecret)
|
||||||
|
|| !server.IsLoggedIn(request.AuthSecret)
|
||||||
|
|| server.GetUser(request.AuthSecret) is not UserAccountBase usr
|
||||||
|
|| usr.Type < userType)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static bool CheckLogin(this IServer server, OwnCharRequest request, UserType userType, [NotNullWhen(true)] out UserAccountDb? user)
|
||||||
|
{
|
||||||
|
if (server.Data is null
|
||||||
|
|| string.IsNullOrWhiteSpace(request.Username)
|
||||||
|
|| string.IsNullOrWhiteSpace(request.AuthSecret)
|
||||||
|
|| !server.IsLoggedIn(request.AuthSecret)
|
||||||
|
|| server.GetUser(request.AuthSecret) is not UserAccountDb usr
|
||||||
|
|| usr.Type < userType)
|
||||||
|
{
|
||||||
|
user = null;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
user = usr;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
48
OwnChar.Server/Extensions/ModelExtensions.cs
Normal file
48
OwnChar.Server/Extensions/ModelExtensions.cs
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
using OwnChar.Data.Model.Client;
|
||||||
|
using OwnChar.Server.Data.Model;
|
||||||
|
|
||||||
|
namespace OwnChar.Server.Extensions;
|
||||||
|
|
||||||
|
public static class ModelExtensions
|
||||||
|
{
|
||||||
|
public static Group ToClient(this GroupDb @this)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
Id = @this.Id,
|
||||||
|
Name = @this.Name,
|
||||||
|
Fandom = @this.Fandom,
|
||||||
|
IsInternal = @this.IsInternal,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UserAccount ToClient(this UserAccountDb @this)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
Id = @this.Id,
|
||||||
|
Email = @this.Email,
|
||||||
|
Type = @this.Type,
|
||||||
|
Username = @this.Username,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UserProfile ToClient(this UserProfileDb @this)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
Id = @this.Id,
|
||||||
|
Name = @this.Name,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public static MemberEntry ToClient(this MemberEntryDb @this)
|
||||||
|
{
|
||||||
|
return new()
|
||||||
|
{
|
||||||
|
Id = @this.Id,
|
||||||
|
UserProfileId = @this.User!.Id,
|
||||||
|
Level = @this.Level,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ using OwnChar.Plugins;
|
|||||||
using OwnChar.ServerNew.Api.Plugins;
|
using OwnChar.ServerNew.Api.Plugins;
|
||||||
using Pilz.Configuration;
|
using Pilz.Configuration;
|
||||||
|
|
||||||
namespace OwnChar.ServerNew;
|
namespace OwnChar.Server;
|
||||||
|
|
||||||
internal class Program
|
internal class Program
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
using Castle.Core.Logging;
|
using Castle.Core.Logging;
|
||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using OwnChar.Base.Data.Model;
|
|
||||||
using OwnChar.Data;
|
using OwnChar.Data;
|
||||||
|
using OwnChar.Data.Model.Base;
|
||||||
using OwnChar.Model;
|
using OwnChar.Model;
|
||||||
using OwnChar.Server;
|
using OwnChar.Server.Api;
|
||||||
using OwnChar.ServerNew.Api.Endpoint;
|
using OwnChar.Server.Api.Endpoint;
|
||||||
|
using OwnChar.Server.Api.Plugins;
|
||||||
using OwnChar.ServerNew.Api.Endpoint.Implementations;
|
using OwnChar.ServerNew.Api.Endpoint.Implementations;
|
||||||
using OwnChar.ServerNew.Api.Plugins;
|
|
||||||
using Pilz.Configuration;
|
using Pilz.Configuration;
|
||||||
using Pilz.Cryptography;
|
using Pilz.Cryptography;
|
||||||
using Pilz.Plugins.Advanced;
|
using Pilz.Plugins.Advanced;
|
||||||
using ILogger = Castle.Core.Logging.ILogger;
|
using ILogger = Castle.Core.Logging.ILogger;
|
||||||
|
|
||||||
namespace OwnChar.ServerNew;
|
namespace OwnChar.Server;
|
||||||
|
|
||||||
internal class ServerContext(ISettings settings) : Api.IServer
|
internal class ServerContext(ISettings settings) : IServer
|
||||||
{
|
{
|
||||||
private readonly Dictionary<string, UserAccountBase> users = [];
|
private readonly Dictionary<string, UserAccountBase> users = [];
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user