using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Identity.Entities; using TakeoutSaaS.Domain.Identity.Repositories; namespace TakeoutSaaS.Infrastructure.Identity.Persistence; /// /// EF 权限仓储。 /// public sealed class EfPermissionRepository(IdentityDbContext dbContext) : IPermissionRepository { public Task FindByIdAsync(long permissionId, long tenantId, CancellationToken cancellationToken = default) => dbContext.Permissions.AsNoTracking().FirstOrDefaultAsync(x => x.Id == permissionId && x.TenantId == tenantId, cancellationToken); public Task FindByCodeAsync(string code, long tenantId, CancellationToken cancellationToken = default) => dbContext.Permissions.AsNoTracking().FirstOrDefaultAsync(x => x.Code == code && x.TenantId == tenantId, cancellationToken); public Task> GetByCodesAsync(long tenantId, IEnumerable codes, CancellationToken cancellationToken = default) { var normalizedCodes = codes .Where(code => !string.IsNullOrWhiteSpace(code)) .Select(code => code.Trim()) .Distinct() .ToArray(); return dbContext.Permissions.AsNoTracking() .Where(x => x.TenantId == tenantId && normalizedCodes.Contains(x.Code)) .ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); } public Task> GetByIdsAsync(long tenantId, IEnumerable permissionIds, CancellationToken cancellationToken = default) => dbContext.Permissions.AsNoTracking() .Where(x => x.TenantId == tenantId && permissionIds.Contains(x.Id)) .ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); public Task> SearchAsync(long tenantId, string? keyword, CancellationToken cancellationToken = default) { var query = dbContext.Permissions.AsNoTracking().Where(x => x.TenantId == tenantId); if (!string.IsNullOrWhiteSpace(keyword)) { var normalized = keyword.Trim(); query = query.Where(x => x.Name.Contains(normalized) || x.Code.Contains(normalized)); } return query.ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); } public Task AddAsync(Permission permission, CancellationToken cancellationToken = default) { dbContext.Permissions.Add(permission); return Task.CompletedTask; } public Task UpdateAsync(Permission permission, CancellationToken cancellationToken = default) { dbContext.Permissions.Update(permission); return Task.CompletedTask; } public async Task DeleteAsync(long permissionId, long tenantId, CancellationToken cancellationToken = default) { var entity = await dbContext.Permissions.FirstOrDefaultAsync(x => x.Id == permissionId && x.TenantId == tenantId, cancellationToken); if (entity != null) { dbContext.Permissions.Remove(entity); } } public Task SaveChangesAsync(CancellationToken cancellationToken = default) => dbContext.SaveChangesAsync(cancellationToken); }