using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using MiGu.Server.SimpleFields;
namespace MiGu.Server.Controllers;
///
/// Simple 字段管理 API:按车型维护 site / track / plan / car 四类反射字段的默认值与多语言名称。
/// 数据持久化于 platform.db 的 simple_fields 表。
///
/// 对应前端「字段管理」页(/admin/simple-fields,页面 key admin-simple-fields)。
/// 前端主流程为「刷新」读库、「默认」从 SimpleLite 拉取模板、「保存」走 全量替换。
///
[ApiController]
[Authorize]
[TypeFilter(typeof(SimpleFieldExceptionFilter))]
[Route("api/simple-fields")]
public sealed class SimpleFieldController : ControllerBase
{
private readonly SimpleFieldService _service;
public SimpleFieldController(SimpleFieldService service) => _service = service;
///
/// 查询字段列表,支持按字段类型、车型与关键字过滤。
/// 结果按 car_type → field_type → key 排序。
///
/// 字段类型,如 siteFields、carFields。
/// 车型唯一标识:assemblyName.shortName。
/// 关键字,匹配 key / car_type / 中英文名 / 其他语言 / 默认值。
[HttpGet]
public Task> List([FromQuery] string? fieldType, [FromQuery] string? carType, [FromQuery] string? q) => _service.ListAsync(fieldType, carType, q);
///
/// 新增单条字段;同车型 + 字段类型下 key 不可重复
///
[HttpPost]
[Authorize(Policy = "PlatformScope")]
public Task Create([FromBody] SimpleFieldRequest req) => _service.SaveAsync(req);
///
/// 按 id 更新单条字段
///
[HttpPut("{id:guid}")]
[Authorize(Policy = "PlatformScope")]
public Task Update(Guid id, [FromBody] SimpleFieldRequest req) => _service.SaveAsync(req with { Id = id });
///
/// 按 id 删除单条字段
///
[HttpDelete("{id:guid}")]
[Authorize(Policy = "PlatformScope")]
public async Task Delete(Guid id)
{
await _service.DeleteAsync(id);
return NoContent();
}
///
/// 批量保存字段
/// . 为 true 时先清空表再写入(前端「保存」使用此模式)。
/// 返回实际写入条数 { count }。
///
[HttpPost("batch")]
[Authorize(Policy = "PlatformScope")]
public async Task SaveBatch([FromBody] SimpleFieldBatchRequest req)
{
var count = await _service.SaveBatchAsync(req);
return Ok(new { count });
}
}
///
/// 将 转为 HTTP 400,响应体 { message }
///
public sealed class SimpleFieldExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
if (context.Exception is not SimpleFieldException ex) { return; }
context.Result = new BadRequestObjectResult(new { message = ex.Message });
context.ExceptionHandled = true;
}
}