btcpayserver-plugin-builder/PluginBuilder/ModelBinders/PluginSlugModelBinder.cs
2025-06-11 19:50:22 +02:00

42 lines
1.3 KiB
C#

using Microsoft.AspNetCore.Mvc.ModelBinding;
using PluginBuilder.Services;
using PluginBuilder.Util.Extensions;
namespace PluginBuilder.ModelBinders;
public class PluginSlugModelBinder : IModelBinder
{
private readonly DBConnectionFactory _connectionFactory;
public PluginSlugModelBinder(DBConnectionFactory connectionFactory)
{
_connectionFactory = connectionFactory;
}
public async Task BindModelAsync(ModelBindingContext bindingContext)
{
var val = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
var v = val.FirstValue;
if (v is null)
return;
if (PluginSelector.TryParse(v, out var s))
{
var pluginSlug = await _connectionFactory.ResolvePluginSlug(s);
if (pluginSlug != null)
{
bindingContext.Result = ModelBindingResult.Success(pluginSlug);
}
else
{
bindingContext.Result = ModelBindingResult.Failed();
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Unknown plugin identifier");
}
}
else
{
bindingContext.Result = ModelBindingResult.Failed();
bindingContext.ModelState.AddModelError(bindingContext.ModelName, "Invalid plugin selector");
}
}
}