using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using TakeoutSaaS.Application.Dictionary.Abstractions; using TakeoutSaaS.Application.Dictionary.Contracts; using TakeoutSaaS.Application.Dictionary.Models; using TakeoutSaaS.Module.Authorization.Attributes; using TakeoutSaaS.Shared.Abstractions.Results; using TakeoutSaaS.Shared.Web.Api; namespace TakeoutSaaS.AdminApi.Controllers; /// /// 参数字典管理。 /// /// 字典服务 [ApiVersion("1.0")] [Authorize] [Route("api/admin/v{version:apiVersion}/dictionaries")] public sealed class DictionaryController(IDictionaryAppService dictionaryAppService) : BaseApiController { /// /// 查询字典分组。 /// /// 分组查询条件。 /// 取消标记。 /// 分组列表。 [HttpGet] [PermissionAuthorize("dictionary:group:read")] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] public async Task>> GetGroups([FromQuery] DictionaryGroupQuery query, CancellationToken cancellationToken) { // 1. 查询字典分组 var groups = await dictionaryAppService.SearchGroupsAsync(query, cancellationToken); // 2. 返回分组列表 return ApiResponse>.Ok(groups); } /// /// 创建字典分组。 /// /// 创建分组请求。 /// 取消标记。 /// 创建后的分组。 [HttpPost] [PermissionAuthorize("dictionary:group:create")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task> CreateGroup([FromBody] CreateDictionaryGroupRequest request, CancellationToken cancellationToken) { // 1. 创建字典分组 var group = await dictionaryAppService.CreateGroupAsync(request, cancellationToken); // 2. 返回创建结果 return ApiResponse.Ok(group); } /// /// 更新字典分组。 /// /// 分组 ID。 /// 更新请求。 /// 取消标记。 /// 更新后的分组。 [HttpPut("{groupId:long}")] [PermissionAuthorize("dictionary:group:update")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task> UpdateGroup(long groupId, [FromBody] UpdateDictionaryGroupRequest request, CancellationToken cancellationToken) { // 1. 更新字典分组 var group = await dictionaryAppService.UpdateGroupAsync(groupId, request, cancellationToken); // 2. 返回更新结果 return ApiResponse.Ok(group); } /// /// 删除字典分组。 /// /// 分组 ID。 /// 取消标记。 /// 操作结果。 [HttpDelete("{groupId:long}")] [PermissionAuthorize("dictionary:group:delete")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task> DeleteGroup(long groupId, CancellationToken cancellationToken) { // 1. 删除字典分组 await dictionaryAppService.DeleteGroupAsync(groupId, cancellationToken); // 2. 返回成功响应 return ApiResponse.Success(); } /// /// 创建字典项。 /// /// 分组 ID。 /// 创建请求。 /// 取消标记。 /// 创建的字典项。 [HttpPost("{groupId:long}/items")] [PermissionAuthorize("dictionary:item:create")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task> CreateItem(long groupId, [FromBody] CreateDictionaryItemRequest request, CancellationToken cancellationToken) { // 1. 绑定分组标识 request.GroupId = groupId; // 2. 创建字典项 var item = await dictionaryAppService.CreateItemAsync(request, cancellationToken); return ApiResponse.Ok(item); } /// /// 更新字典项。 /// /// 字典项 ID。 /// 更新请求。 /// 取消标记。 /// 更新后的字典项。 [HttpPut("items/{itemId:long}")] [PermissionAuthorize("dictionary:item:update")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task> UpdateItem(long itemId, [FromBody] UpdateDictionaryItemRequest request, CancellationToken cancellationToken) { // 1. 更新字典项 var item = await dictionaryAppService.UpdateItemAsync(itemId, request, cancellationToken); // 2. 返回更新结果 return ApiResponse.Ok(item); } /// /// 删除字典项。 /// /// 字典项 ID。 /// 取消标记。 /// 操作结果。 [HttpDelete("items/{itemId:long}")] [PermissionAuthorize("dictionary:item:delete")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] public async Task> DeleteItem(long itemId, CancellationToken cancellationToken) { // 1. 删除字典项 await dictionaryAppService.DeleteItemAsync(itemId, cancellationToken); // 2. 返回成功响应 return ApiResponse.Success(); } /// /// 批量获取字典项(命中缓存)。 /// /// 批量查询请求。 /// 取消标记。 /// 分组编码到字典项列表的映射。 [HttpPost("batch")] [ProducesResponseType(typeof(ApiResponse>>), StatusCodes.Status200OK)] public async Task>>> BatchGet([FromBody] DictionaryBatchQueryRequest request, CancellationToken cancellationToken) { // 1. 批量读取并命中缓存 var dictionaries = await dictionaryAppService.GetCachedItemsAsync(request, cancellationToken); // 2. 返回批量结果 return ApiResponse>>.Ok(dictionaries); } }