1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00
2024-02-28 19:31:38 +01:00

121 lines
3.6 KiB
C#

using System;
using System.Text.Json.Serialization;
using System.Threading.Tasks;
using EmbedIO;
namespace Artemis.Core.Services;
/// <summary>
/// Represents a base type for plugin end points to be targeted by the <see cref="PluginsModule" />
/// </summary>
public abstract class PluginEndPoint
{
private readonly PluginsModule _pluginsModule;
internal PluginEndPoint(PluginFeature pluginFeature, string name, PluginsModule pluginsModule)
{
_pluginsModule = pluginsModule;
PluginFeature = pluginFeature;
Name = name;
PluginFeature.Disabled += OnDisabled;
}
/// <summary>
/// Gets the name of the end point
/// </summary>
public string Name { get; }
/// <summary>
/// Gets the full URL of the end point
/// </summary>
public string Url => $"{_pluginsModule.ServerUrl?.TrimEnd('/')}{_pluginsModule.BaseRoute}{PluginFeature.Plugin.Guid}/{Name}";
/// <summary>
/// Gets the plugin the end point is associated with
/// </summary>
[JsonIgnore]
public PluginFeature PluginFeature { get; }
/// <summary>
/// Gets the plugin info of the plugin the end point is associated with
/// </summary>
public PluginInfo PluginInfo => PluginFeature.Plugin.Info;
/// <summary>
/// Gets the mime type of the input this end point accepts
/// </summary>
public string? Accepts { get; protected set; }
/// <summary>
/// Gets the mime type of the output this end point returns
/// </summary>
public string? Returns { get; protected set; }
/// <summary>
/// Occurs whenever a request threw an unhandled exception
/// </summary>
public event EventHandler<EndpointExceptionEventArgs>? RequestException;
/// <summary>
/// Occurs whenever a request is about to be processed
/// </summary>
public event EventHandler<EndpointRequestEventArgs>? ProcessingRequest;
/// <summary>
/// Occurs whenever a request was processed
/// </summary>
public event EventHandler<EndpointRequestEventArgs>? ProcessedRequest;
/// <summary>
/// Called whenever the end point has to process a request
/// </summary>
/// <param name="context">The HTTP context of the request</param>
protected abstract Task ProcessRequest(IHttpContext context);
/// <summary>
/// Invokes the <see cref="RequestException" /> event
/// </summary>
/// <param name="e">The exception that occurred during the request</param>
protected virtual void OnRequestException(Exception e)
{
RequestException?.Invoke(this, new EndpointExceptionEventArgs(e));
}
/// <summary>
/// Invokes the <see cref="ProcessingRequest" /> event
/// </summary>
protected virtual void OnProcessingRequest(IHttpContext context)
{
ProcessingRequest?.Invoke(this, new EndpointRequestEventArgs(context));
}
/// <summary>
/// Invokes the <see cref="ProcessedRequest" /> event
/// </summary>
protected virtual void OnProcessedRequest(IHttpContext context)
{
ProcessedRequest?.Invoke(this, new EndpointRequestEventArgs(context));
}
internal async Task InternalProcessRequest(IHttpContext context)
{
try
{
OnProcessingRequest(context);
await ProcessRequest(context);
OnProcessedRequest(context);
}
catch (Exception e)
{
OnRequestException(e);
throw;
}
}
private void OnDisabled(object? sender, EventArgs e)
{
PluginFeature.Disabled -= OnDisabled;
_pluginsModule.RemovePluginEndPoint(this);
}
}