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);
}