push my ork

This commit is contained in:
2024-08-15 09:20:20 +02:00
parent decb932a1c
commit 3522aff72c
13 changed files with 100 additions and 118 deletions

View File

@@ -1,17 +1,13 @@
using OwnChar.Api.Packets;
namespace OwnChar.Server.Api.Endpoint;
namespace OwnChar.Server.Api.Endpoint;
internal class ApiBuilder(WebApplication app) : IApiBuilder
internal class ApiBuilder : IApiBuilder
{
public void MapRequest(string pattern, Delegate action)
{
Map(pattern + "/{request}", action);
}
private readonly Dictionary<ApiMapInfo, Delegate> handlers = [];
public IReadOnlyDictionary<ApiMapInfo, Delegate> Handlers => handlers;
public void Map(string pattern, Delegate action)
{
//app.Map(pattern, action);
app.MapPost(pattern, action);
handlers.Add(new(pattern, "POST"), action);
}
}

View File

@@ -0,0 +1,3 @@
namespace OwnChar.Server.Api.Endpoint;
public record struct ApiMapInfo(string Pattern, string Method);

View File

@@ -1,9 +1,8 @@
using OwnChar.Api.Packets;
namespace OwnChar.Server.Api.Endpoint;
namespace OwnChar.Server.Api.Endpoint;
public interface IApiBuilder
{
void MapRequest(string pattern, Delegate action);
public IReadOnlyDictionary<ApiMapInfo, Delegate> Handlers { get; }
void Map(string path, Delegate action);
}

View File

@@ -13,15 +13,15 @@ internal class GroupsApi(IServer server) : IApiEndpoint
{
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);
builder.Map("/groups/get/byid", GetById);
builder.Map("/groups/get", Get);
builder.Map("/groups/create", Create);
builder.Map("/groups/update", Update);
builder.Map("/groups/delete", Delete);
builder.Map("/groups/members/get", GetMembers);
builder.Map("/groups/members/add", AddMembers);
builder.Map("/groups/members/update", UpdateMember);
builder.Map("/groups/members/remove", RemoveMembers);
}
private IResult GetById(GetSinlgeObjectRequest request)

View File

@@ -9,8 +9,8 @@ internal class LoginApi(ServerContext server) : IApiEndpoint
{
public void Initialize(IApiBuilder builder)
{
builder.Map("/auth/login/{request}", Login);
builder.Map("/auth/logout/{request}", Logout);
builder.Map("/auth/login", Login);
builder.Map("/auth/logout", Logout);
}
private IResult Login(LoginRequest request)

View File

@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
@@ -8,12 +8,10 @@
<ItemGroup>
<PackageReference Include="Castle.Core" Version="5.1.1" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.7" />
<PackageReference Include="Pilz.Configuration" Version="3.1.2" />
<PackageReference Include="Pilz.Cryptography" Version="2.0.1" />
<PackageReference Include="Pilz.Plugins" Version="2.1.9" />
<PackageReference Include="Pilz.Plugins.Advanced" Version="2.10.1" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
</ItemGroup>
<ItemGroup>

View File

@@ -1,6 +0,0 @@
@OwnChar.ServerNew_HostAddress = http://localhost:5208
GET {{OwnChar.ServerNew_HostAddress}}/weatherforecast/
Accept: application/json
###

View File

@@ -1,5 +1,5 @@
using OwnChar.Plugins;
using OwnChar.ServerNew.Api.Plugins;
using OwnChar.Server.Api.Plugins;
using Pilz.Configuration;
namespace OwnChar.Server;

View File

@@ -1,41 +0,0 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:48428",
"sslPort": 44302
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5208",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "https://localhost:7174;http://localhost:5208",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -1,22 +1,23 @@
using Castle.Core.Logging;
using Microsoft.EntityFrameworkCore;
using OwnChar.Data;
using OwnChar.Data.Model.Base;
using OwnChar.Model;
using OwnChar.Server.Api;
using OwnChar.Server.Api.Endpoint;
using OwnChar.Server.Api.Endpoint.Implementations;
using OwnChar.Server.Api.Plugins;
using OwnChar.ServerNew.Api.Endpoint.Implementations;
using OwnChar.Server.Data;
using Pilz.Configuration;
using Pilz.Cryptography;
using Pilz.Plugins.Advanced;
using ILogger = Castle.Core.Logging.ILogger;
using System.Net;
namespace OwnChar.Server;
internal class ServerContext(ISettings settings) : IServer
{
private readonly Dictionary<string, UserAccountBase> users = [];
private readonly HttpListener httpListener = new();
private readonly ApiBuilder apiBuilder = new();
public DbContext? Data { get; private set; }
@@ -26,25 +27,7 @@ internal class ServerContext(ISettings settings) : IServer
public void Start(string[] args)
{
Log.Info("Prepairing server context");
// Add services to the container.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthorization();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
// Build app
var app = builder.Build();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
Log.Info("Prepairing server");
// Load database
Log.Debug("Loading database");
@@ -53,7 +36,7 @@ internal class ServerContext(ISettings settings) : IServer
// Built-in endpoints
Log.Debug("Loading internal api endpoints");
var apibuilder = new ApiBuilder(app);
var apibuilder = new ApiBuilder();
new LoginApi(this).Initialize(apibuilder);
new UsersApi(this).Initialize(apibuilder);
new GroupsApi(this).Initialize(apibuilder);
@@ -70,7 +53,72 @@ internal class ServerContext(ISettings settings) : IServer
// Run server
Log.Info("Starting webserver");
app.Run();
httpListener.Start();
Listen();
}
private void Listen()
{
var apiUrl = Settings.Get<ServerSettings>().ApiUrl;
if (string.IsNullOrWhiteSpace(apiUrl))
throw new NullReferenceException("ApiUrl is empty!");
while (httpListener.IsListening)
{
var context = httpListener.GetContext();
if (context.Request.HttpMethod != HttpMethod.Post.Method
|| context.Request.ContentType is not string contentType
|| contentType.Contains("application/json")
|| context.Request.AcceptTypes is null
|| context.Request.AcceptTypes.Contains("application/json"))
{
close();
continue;
}
// Parse url
var path = context.Request.Url?.PathAndQuery.Replace(apiUrl, string.Empty);
if (string.IsNullOrWhiteSpace(path) || context.Request.ContentLength64 <= 0)
{
close();
continue;
}
// Find mapped function and get target type
if (!apiBuilder.Handlers.TryGetValue(new(path, context.Request.HttpMethod), out var postAction))
{
close();
return;
}
// ...
// Read input content
using StreamReader input = new(context.Request.InputStream);
var contentJson = input.ReadToEnd();
// Deserialize request
if (JsonHelpers.DeserializeRequest<T>(contentJson) is not T request)
{
close();
continue;
}
// Set response parameters
context.Response.StatusCode = (int)args.ResponseStatusCode;
context.Response.StatusDescription = args.ResponseStatusDescription;
// Write response content
if (args.ResponseContent != null)
{
context.Response.ContentType = ContentTypes.CONTENT_TYPE_JSON;
using StreamWriter output = new(context.Response.OutputStream);
output.Write(args.ResponseContent);
}
close();
void close() => context.Response.OutputStream.Close();
}
}
public string Login(UserAccountBase account)

View File

@@ -9,11 +9,13 @@ public class ServerSettings : IChildSettings, ISettingsIdentifier
public string? DbServer { get; set; }
public string? DbUser { get; set; }
public string? DbPassword { get; set; }
public string? ApiUrl { get; set; }
public void Reset()
{
DbServer = null;
DbUser = null;
DbPassword = null;
ApiUrl = null;
}
}

View File

@@ -1,8 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@@ -1,9 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}