Api/NetinaShop.Api/Controller/SettingController.cs

51 lines
2.3 KiB
C#

using System.Reflection;
using System.Text.Json;
using NetinaShop.Repository.Repositories.Entity.Abstracts;
namespace NetinaShop.Api.Controller;
public class SettingController : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
var group = app.NewVersionedApi("Setting")
.MapGroup("api/setting")
.RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser());
group.MapGet("{settingName}", GetSettingAsync)
.WithDisplayName("GetSetting")
.HasApiVersion(1.0);
group.MapPost("{settingName}", PostSettingAsync)
.WithDisplayName("PostSettingAsync")
.HasApiVersion(1.0);
}
public async Task<IResult> GetSettingAsync(string settingName, [FromServices] IMartenRepository martenRepository, CancellationToken cancellationToken)
{
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"NetinaShop.Domain.Entities.Settings.{settingName}");
if (type == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
var setting = await ((dynamic)martenRepository.GetType()?.GetMethod("GetEntityAsync")
?.MakeGenericMethod(type)
.Invoke(martenRepository,new object[]{ cancellationToken })!);
if (setting == null)
setting = Activator.CreateInstance(type);
return TypedResults.Ok(setting);
}
public async Task<IResult> PostSettingAsync(string settingName, [FromBody]JsonDocument settingObj, [FromServices] IMartenRepository martenRepository, CancellationToken cancellationToken)
{
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"NetinaShop.Domain.Entities.Settings.{settingName}");
if (type == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
var setting = settingObj.Deserialize(type);
if (setting == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
await ((dynamic)martenRepository.GetType().GetMethod("AddOrUpdateEntityAsync")
?.MakeGenericMethod(type).Invoke(martenRepository, new[] { setting , cancellationToken })!);
return TypedResults.Ok();
}
}