Added before and after events for router actions

This commit is contained in:
Alex
2025-08-28 20:26:56 +01:00
parent 6dacfde715
commit 8f55b8642d
16 changed files with 87 additions and 20 deletions
+72 -5
View File
@@ -8,8 +8,18 @@ using SPTarkov.Server.Core.Utils;
namespace SPTarkov.Server.Core.DI;
public interface IOnBeforeEventRequestData;
public interface IOnAfterEventRequestData;
public record StaticDynamicOnBeforeEventRequestData(string Url, IRequestData RequestData, MongoId SessionId, string Output)
: IOnBeforeEventRequestData;
public record StaticDynamicOnAfterEventRequestData(string Url, IRequestData RequestData, MongoId SessionId, string Output, object Result)
: IOnAfterEventRequestData;
public abstract class Router
{
public event EventHandler<IOnBeforeEventRequestData>? OnBeforeAction;
public event EventHandler<IOnAfterEventRequestData>? OnAfterAction;
protected IEnumerable<HandledRoute> handledRoutes = [];
public virtual string GetTopLevelRoute()
@@ -29,6 +39,15 @@ public abstract class Router
return handledRoutes;
}
protected void TriggerOnBeforeAction(IOnBeforeEventRequestData requestData)
{
OnBeforeAction?.Invoke(this, requestData);
}
protected void TriggerOnAfterAction(IOnAfterEventRequestData requestData)
{
OnAfterAction?.Invoke(this, requestData);
}
public bool CanHandle(string url, bool partialMatch = false)
{
if (partialMatch)
@@ -52,7 +71,11 @@ public abstract class StaticRouter(JsonUtil jsonUtil, IEnumerable<RouteAction> r
info = (IRequestData?)jsonUtil.Deserialize(body, type);
}
return await action.action(url, info ?? new EmptyRequestData(), sessionId, output);
info ??= new EmptyRequestData();
TriggerOnBeforeAction(new StaticDynamicOnBeforeEventRequestData(url, info, sessionId, output));
var result = await action.action(url, info, sessionId, output);
TriggerOnAfterAction(new StaticDynamicOnAfterEventRequestData(url, info, sessionId, output, result));
return result;
}
protected override IEnumerable<HandledRoute> GetHandledRoutes()
@@ -63,7 +86,7 @@ public abstract class StaticRouter(JsonUtil jsonUtil, IEnumerable<RouteAction> r
public abstract class DynamicRouter(JsonUtil jsonUtil, IEnumerable<RouteAction> routes) : Router
{
public async ValueTask<object> HandleDynamic(string url, string? body, MongoId sessionID, string output)
public async ValueTask<object> HandleDynamic(string url, string? body, MongoId sessionId, string output)
{
var action = routes.First(r => url.Contains(r.url));
var type = action.bodyType;
@@ -73,7 +96,11 @@ public abstract class DynamicRouter(JsonUtil jsonUtil, IEnumerable<RouteAction>
info = (IRequestData?)jsonUtil.Deserialize(body, type);
}
return await action.action(url, info ?? new EmptyRequestData(), sessionID, output);
info ??= new EmptyRequestData();
TriggerOnBeforeAction(new StaticDynamicOnBeforeEventRequestData(url, info, sessionId, output));
var result = await action.action(url, info, sessionId, output);
TriggerOnAfterAction(new StaticDynamicOnAfterEventRequestData(url, info, sessionId, output, result));
return result;
}
protected override IEnumerable<HandledRoute> GetHandledRoutes()
@@ -82,11 +109,40 @@ public abstract class DynamicRouter(JsonUtil jsonUtil, IEnumerable<RouteAction>
}
}
public record ItemRouterOnBeforeEventRequestData(
string Url,
PmcData PmcData,
BaseInteractionRequestData Body,
MongoId SessionId,
ItemEventRouterResponse Output) : IOnBeforeEventRequestData;
public record ItemRouterOnAfterEventRequestData(
string Url,
PmcData PmcData,
BaseInteractionRequestData Body,
MongoId SessionId,
ItemEventRouterResponse Output,
ValueTask<ItemEventRouterResponse> Result) : IOnAfterEventRequestData;
public record OnAfterEventRequestData<T, R>(string Url, T RequestData, MongoId SessionId, R Output, object Result) : IOnAfterEventRequestData;
// The name of this class should be ItemEventRouter, but that name is taken,
// So instead I added the definition
public abstract class ItemEventRouterDefinition : Router
{
public abstract ValueTask<ItemEventRouterResponse> HandleItemEvent(
public ValueTask<ItemEventRouterResponse> HandleItemEvent(
string url,
PmcData pmcData,
BaseInteractionRequestData body,
MongoId sessionID,
ItemEventRouterResponse output
)
{
TriggerOnBeforeAction(new ItemRouterOnBeforeEventRequestData(url, pmcData, body, sessionID, output));
var result = HandleItemEventInternal(url, pmcData, body, sessionID, output);
TriggerOnAfterAction(new ItemRouterOnAfterEventRequestData(url, pmcData, body, sessionID, output, result));
return result;
}
protected abstract ValueTask<ItemEventRouterResponse> HandleItemEventInternal(
string url,
PmcData pmcData,
BaseInteractionRequestData body,
@@ -95,9 +151,20 @@ public abstract class ItemEventRouterDefinition : Router
);
}
public record SaveLoadOnBeforeEventRequestData(SptProfile Profile) : IOnBeforeEventRequestData;
public record SaveLoadRouterOnAfterEventRequestData(SptProfile Profile) : IOnAfterEventRequestData;
public abstract class SaveLoadRouter : Router
{
public abstract SptProfile HandleLoad(SptProfile profile);
public SptProfile HandleLoad(SptProfile profile)
{
TriggerOnBeforeAction(new SaveLoadOnBeforeEventRequestData(profile));
var result = HandleLoadInternal(profile);
TriggerOnAfterAction(new SaveLoadRouterOnAfterEventRequestData(profile));
return result;
}
protected abstract SptProfile HandleLoadInternal(SptProfile profile);
}
public record HandledRoute(string route, bool dynamic);