using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Identity.Entities; using TakeoutSaaS.Domain.Identity.Repositories; namespace TakeoutSaaS.Infrastructure.Identity.Persistence; /// /// EF 角色仓储。 /// public sealed class EfRoleRepository(IdentityDbContext dbContext) : IRoleRepository { /// /// 根据角色 ID 获取角色。 /// /// 角色 ID。 /// 租户 ID。 /// 取消标记。 /// 角色实体或 null。 public Task FindByIdAsync(long roleId, long tenantId, CancellationToken cancellationToken = default) => dbContext.Roles .AsNoTracking() .FirstOrDefaultAsync(x => x.Id == roleId && x.TenantId == tenantId && x.DeletedAt == null, cancellationToken); /// /// 根据角色编码获取角色。 /// /// 角色编码。 /// 租户 ID。 /// 取消标记。 /// 角色实体或 null。 public Task FindByCodeAsync(string code, long tenantId, CancellationToken cancellationToken = default) => dbContext.Roles .AsNoTracking() .FirstOrDefaultAsync(x => x.Code == code && x.TenantId == tenantId && x.DeletedAt == null, cancellationToken); /// /// 根据角色 ID 集合获取角色列表。 /// /// 租户 ID。 /// 角色 ID 集合。 /// 取消标记。 /// 角色列表。 public async Task> GetByIdsAsync(long tenantId, IEnumerable roleIds, CancellationToken cancellationToken = default) { // 1. 查询角色列表 var roles = await dbContext.Roles .AsNoTracking() .Where(x => x.TenantId == tenantId && roleIds.Contains(x.Id) && x.DeletedAt == null) .ToListAsync(cancellationToken); // 2. (空行后) 返回只读列表 return roles; } /// /// 按关键字搜索角色。 /// /// 租户 ID。 /// 搜索关键字。 /// 取消标记。 /// 角色列表。 public async Task> SearchAsync(long tenantId, string? keyword, CancellationToken cancellationToken = default) { // 1. 构建基础查询 var query = dbContext.Roles .AsNoTracking() .Where(x => x.TenantId == tenantId && x.DeletedAt == null); if (!string.IsNullOrWhiteSpace(keyword)) { // 2. 追加关键字过滤 var normalized = keyword.Trim(); query = query.Where(x => x.Name.Contains(normalized) || x.Code.Contains(normalized)); } // 3. 返回列表 var roles = await query.ToListAsync(cancellationToken); // 4. (空行后) 返回只读列表 return roles; } /// /// 新增角色。 /// /// 角色实体。 /// 取消标记。 /// 异步任务。 public Task AddAsync(Role role, CancellationToken cancellationToken = default) { // 1. 添加实体 dbContext.Roles.Add(role); // 2. 返回完成任务 return Task.CompletedTask; } /// /// 更新角色。 /// /// 角色实体。 /// 取消标记。 /// 异步任务。 public Task UpdateAsync(Role role, CancellationToken cancellationToken = default) { // 1. 标记更新 dbContext.Roles.Update(role); // 2. 返回完成任务 return Task.CompletedTask; } /// /// 软删除角色。 /// /// 角色 ID。 /// 租户 ID。 /// 取消标记。 /// 异步任务。 public async Task DeleteAsync(long roleId, long tenantId, CancellationToken cancellationToken = default) { // 1. 查询目标角色 var entity = await dbContext.Roles.FirstOrDefaultAsync(x => x.Id == roleId && x.TenantId == tenantId, cancellationToken); if (entity != null) { // 2. 标记删除时间 entity.DeletedAt = DateTime.UtcNow; dbContext.Roles.Update(entity); } } /// /// 保存仓储变更。 /// /// 取消标记。 /// 保存任务。 public Task SaveChangesAsync(CancellationToken cancellationToken = default) => dbContext.SaveChangesAsync(cancellationToken); }