namespace Dpz.Core.Service.Mediator.Features.Account.Internal;

internal static class AccountRepositoryHelper
{
    internal static async Task<User?> GetUserAsync(
        IRepository<User> repository,
        string account,
        CancellationToken cancellationToken
    )
    {
        var filter = Builders<User>.Filter.Eq(x => x.Id, account);
        return await repository.Collection.Find(filter).FirstOrDefaultAsync(cancellationToken);
    }

    internal static async Task SaveUserHistoryAsync(
        IRepository<UserHistory> userHistoryRepository,
        string account,
        IReadOnlyCollection<ChangeDetail> changes,
        CancellationToken cancellationToken
    )
    {
        if (changes.Count == 0)
        {
            return;
        }

        var history = new UserHistory
        {
            Account = account,
            ChangeTime = DateTime.Now,
            Changes = changes.ToList(),
        };
        await userHistoryRepository.InsertAsync(history, cancellationToken);
    }

    internal static ChangeDetail Change(string field, object? oldValue, object? newValue)
    {
        return new ChangeDetail
        {
            Field = field,
            OldValue = oldValue,
            NewValue = newValue,
        };
    }

    internal static bool IsSystemAccount(User user)
    {
        return user.Permissions.HasValue
            && (user.Permissions.Value & Permissions.System) == Permissions.System;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个名为 AccountRepositoryHelper 的内部静态辅助类,用于处理用户账户相关的数据库操作。以下是各个方法的详细说明:

类概述

  • 命名空间: Dpz.Core.Service.Mediator.Features.Account.Internal
  • 访问修饰符: internal static - 仅在当前程序集内可访问的静态工具类

方法说明

1. GetUserAsync 方法

internal static async Task<User?> GetUserAsync(...)

功能: 根据账户ID异步查询用户信息

参数:

  • repository: User实体的仓储接口
  • account: 用户账户ID
  • cancellationToken: 取消令牌

实现细节:

  • 使用MongoDB的 Builders<User>.Filter.Eq 构建查询过滤器,按用户ID查询
  • 返回匹配的第一个用户,如果不存在则返回 null

2. SaveUserHistoryAsync 方法

internal static async Task SaveUserHistoryAsync(...)

功能: 保存用户变更历史记录

参数:

  • userHistoryRepository: 用户历史记录的仓储接口
  • account: 用户账户ID
  • changes: 变更详情的只读集合
  • cancellationToken: 取消令牌

实现细节:

  • 首先检查变更集合是否为空,如果为空则直接返回(性能优化)
  • 创建 UserHistory 对象,包含:
    • 账户ID
    • 当前时间戳
    • 变更详情列表
  • 将历史记录插入数据库

3. Change 方法

internal static ChangeDetail Change(...)

功能: 创建变更详情对象的便捷方法

参数:

  • field: 变更的字段名
  • oldValue: 旧值
  • newValue: 新值

返回: 包含变更信息的 ChangeDetail 对象

4. IsSystemAccount 方法

internal static bool IsSystemAccount(User user)

功能: 判断用户是否为系统账户

实现逻辑:

  • 检查用户的 Permissions 属性是否有值
  • 使用位运算 & 检查权限标志中是否包含 Permissions.System 标志
  • 只有同时满足两个条件才返回 true

设计特点

  1. 单一职责: 每个方法专注于特定的数据库操作
  2. 异步设计: 使用 async/await 支持异步操作
  3. 取消支持: 所有异步方法都支持取消令牌
  4. 性能优化: 在保存历史前检查变更是否为空
  5. 位标志检查: 使用位运算高效判断权限
评论加载中...