using FastEndpoints; using MediatR; using Microsoft.AspNetCore.Mvc; using Fengling.RiskControl.Domain.Aggregates.RiskRules; namespace Fengling.RiskControl.Web.Endpoints; public class CreateRiskRuleEndpoint : Endpoint { private readonly IMediator _mediator; public CreateRiskRuleEndpoint(IMediator mediator) { _mediator = mediator; } public override void Configure() { Post("/api/v1/risk/rules"); Roles("Admin"); } public override async Task HandleAsync(CreateRiskRuleRequest req, CancellationToken ct) { var rule = await _mediator.Send(new CreateRiskRuleCommand { Name = req.Name, Description = req.Description, RuleType = (RiskRuleType)req.RuleType, Action = (RiskRuleAction)req.Action, ConfigJson = req.ConfigJson, Priority = req.Priority }, ct); Response = new RiskRuleResponse { Id = rule.Id, Name = rule.Name, Description = rule.Description, RuleType = ((int)rule.RuleType).ToString(), Action = ((int)rule.Action).ToString(), IsActive = rule.IsActive, CreatedAt = rule.CreatedAt }; } } public class CreateRiskRuleRequest { [Microsoft.AspNetCore.Mvc.FromBody] public string Name { get; set; } = string.Empty; [Microsoft.AspNetCore.Mvc.FromBody] public string Description { get; set; } = string.Empty; [Microsoft.AspNetCore.Mvc.FromBody] public int RuleType { get; set; } [Microsoft.AspNetCore.Mvc.FromBody] public int Action { get; set; } [Microsoft.AspNetCore.Mvc.FromBody] public string ConfigJson { get; set; } = string.Empty; [Microsoft.AspNetCore.Mvc.FromBody] public int Priority { get; set; } } public record CreateRiskRuleCommand : IRequest { public string Name { get; init; } = string.Empty; public string Description { get; init; } = string.Empty; public RiskRuleType RuleType { get; init; } public RiskRuleAction Action { get; init; } public string ConfigJson { get; init; } = string.Empty; public int Priority { get; init; } } public record RiskRuleResponse { public long Id { get; init; } public string Name { get; init; } = string.Empty; public string Description { get; init; } = string.Empty; public string RuleType { get; init; } = string.Empty; public string Action { get; init; } = string.Empty; public bool IsActive { get; init; } public DateTime CreatedAt { get; init; } }