Files
the-cycle/src/Prospect.Server.Api/Services/CloudScript/CloudScriptService.cs
T
2025-02-24 01:06:32 +02:00

52 lines
1.9 KiB
C#

using System.Text.Json;
namespace Prospect.Server.Api.Services.CloudScript;
public class CloudScriptService
{
private readonly ILogger<CloudScriptService> _logger;
private readonly IServiceScopeFactory _serviceScopeFactory;
private readonly CloudScriptFunctionLoader _functionLoader;
public CloudScriptService(ILogger<CloudScriptService> logger, IServiceScopeFactory serviceScopeFactory, CloudScriptFunctionLoader functionLoader)
{
_logger = logger;
_serviceScopeFactory = serviceScopeFactory;
_functionLoader = functionLoader;
}
public async Task<object?> ExecuteAsync(string name, string? parameter, bool generatePlayStreamEvent)
{
if (!_functionLoader.TryGetFunction(name, out var function))
{
_logger.LogWarning("Function {Function} is missing", name);
return null;
}
if (parameter == null)
{
_logger.LogWarning("Function {Function} was called without a parameter", name);
return null;
}
using (var scope = _serviceScopeFactory.CreateScope())
{
var functionClazz = ActivatorUtilities.CreateInstance(scope.ServiceProvider, function.Clazz);
// Some functions have empty parameters which result in malformed JSON.
var parameterJson = parameter == "" ? "{}" : parameter;
// _logger.LogInformation("Received parameter: {Param}", parameterJson);
var functionParam = JsonSerializer.Deserialize(parameterJson, function.RequestType);
if (functionParam == null)
{
_logger.LogWarning("Function {Function} deserialization returned null", name);
return null;
}
var functionTask = function.Delegate(functionClazz, functionParam);
await functionTask;
return (object)((dynamic)functionTask).Result;
}
}
}