using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Identity.Entities; using TakeoutSaaS.Domain.Identity.Enums; using TakeoutSaaS.Domain.Identity.Repositories; namespace TakeoutSaaS.Infrastructure.Identity.Persistence; /// /// EF 权限仓储。 /// public sealed class EfPermissionRepository(IdentityDbContext dbContext) : IPermissionRepository { /// /// 根据权限 ID 获取权限。 /// /// 权限 ID。 /// 取消标记。 /// 权限实体或 null。 public Task FindByIdAsync(long permissionId, CancellationToken cancellationToken = default) => dbContext.Permissions .IgnoreQueryFilters() .AsNoTracking() .FirstOrDefaultAsync(x => x.Id == permissionId && x.DeletedAt == null, cancellationToken); /// /// 根据权限编码获取权限。 /// /// 权限编码。 /// 取消标记。 /// 权限实体或 null。 public Task FindByCodeAsync(string code, CancellationToken cancellationToken = default) => dbContext.Permissions .IgnoreQueryFilters() .AsNoTracking() .FirstOrDefaultAsync(x => x.Code == code && x.DeletedAt == null, cancellationToken); /// /// 根据权限编码集合批量获取权限。 /// /// 权限编码集合。 /// 取消标记。 /// 权限列表。 public Task> GetByCodesAsync(IEnumerable codes, CancellationToken cancellationToken = default) { // 1. 规范化编码集合 var normalizedCodes = codes .Where(code => !string.IsNullOrWhiteSpace(code)) .Select(code => code.Trim()) .Distinct() .ToArray(); // 2. 读取全局权限(已固定) return dbContext.Permissions .IgnoreQueryFilters() .AsNoTracking() .Where(x => x.DeletedAt == null && normalizedCodes.Contains(x.Code)) .ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); } /// /// 根据权限 ID 集合批量获取权限。 /// /// 权限 ID 集合。 /// 取消标记。 /// 权限列表。 public Task> GetByIdsAsync(IEnumerable permissionIds, CancellationToken cancellationToken = default) => dbContext.Permissions .IgnoreQueryFilters() .AsNoTracking() .Where(x => x.DeletedAt == null && permissionIds.Contains(x.Id)) .ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); /// /// 按 Portal 与关键字搜索权限。 /// /// Portal 类型。 /// 搜索关键字。 /// 取消标记。 /// 权限列表。 public Task> SearchAsync(PortalType portal, string? keyword, CancellationToken cancellationToken = default) { // 1. 构建基础查询 var query = dbContext.Permissions .IgnoreQueryFilters() .AsNoTracking() .Where(x => x.DeletedAt == null && x.Portal == portal); if (!string.IsNullOrWhiteSpace(keyword)) { // 2. 追加关键字过滤 var normalized = keyword.Trim(); query = query.Where(x => x.Name.Contains(normalized) || x.Code.Contains(normalized)); } // 3. 返回列表 return query.ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); } /// /// 新增权限。 /// /// 权限实体。 /// 取消标记。 /// 异步任务。 public Task AddAsync(Permission permission, CancellationToken cancellationToken = default) { // 1. 添加实体 dbContext.Permissions.Add(permission); // 2. 返回完成任务 return Task.CompletedTask; } /// /// 更新权限。 /// /// 权限实体。 /// 取消标记。 /// 异步任务。 public Task UpdateAsync(Permission permission, CancellationToken cancellationToken = default) { // 1. 标记实体更新 dbContext.Permissions.Update(permission); // 2. 返回完成任务 return Task.CompletedTask; } /// /// 删除指定权限。 /// /// 权限 ID。 /// 取消标记。 /// 异步任务。 public async Task DeleteAsync(long permissionId, CancellationToken cancellationToken = default) { // 1. 查询目标权限 var entity = await dbContext.Permissions.FirstOrDefaultAsync(x => x.Id == permissionId, cancellationToken); if (entity != null) { // 2. 删除实体 dbContext.Permissions.Remove(entity); } } /// /// 保存仓储变更。 /// /// 取消标记。 /// 保存任务。 public Task SaveChangesAsync(CancellationToken cancellationToken = default) => dbContext.SaveChangesAsync(cancellationToken); }