using Dpz.Core.Public.ViewModel.Request;
using Dpz.Core.Public.ViewModel.Response;
namespace Dpz.Core.Service.RepositoryServiceImpl;
public class UserHistoryService(IRepository<UserHistory> repository) : IUserHistoryService
{
public async Task<IPagedList<UserHistoryResponse>> GetPagedListAsync(UserHistoryRequest request)
{
var filterEmpty = Builders<UserHistory>.Filter.Empty;
var filters = new List<FilterDefinition<UserHistory>>();
if (!string.IsNullOrEmpty(request.Account))
{
var accountFilter = Builders<UserHistory>.Filter.Regex(
x => x.Account,
new BsonRegularExpression(request.Account, "i")
);
filters.Add(accountFilter);
}
if (request.ChangeTimeStart.HasValue)
{
var startFilter = Builders<UserHistory>.Filter.Gte(
x => x.ChangeTime,
request.ChangeTimeStart.Value
);
filters.Add(startFilter);
}
if (request.ChangeTimeEnd.HasValue)
{
var endFilter = Builders<UserHistory>.Filter.Lte(
x => x.ChangeTime,
request.ChangeTimeEnd.Value
);
filters.Add(endFilter);
}
if (!string.IsNullOrEmpty(request.ChangeProperty))
{
var propertyFilter = Builders<UserHistory>.Filter.AnyIn(
x => x.Changes.Select(y => y.Field),
[request.ChangeProperty]
);
filters.Add(propertyFilter);
}
var filterResult =
filters.Count > 0 ? Builders<UserHistory>.Filter.And(filters) : filterEmpty;
return await repository
.SearchFor(filterResult)
.SortByDescending(x => x.Id)
.ToPagedListAsync<UserHistory, UserHistoryResponse>(
request.PageIndex,
request.PageSize
);
}
public async Task<List<string>> GetChangedPropertiesAsync()
{
return await repository
.MongodbQueryable.SelectMany(x => x.Changes)
.GroupBy(x => x.Field)
.Select(x => x.Key)
.ToListAsync();
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
上述代码定义了一个名为 UserHistoryService 的类,它实现了 IUserHistoryService 接口,主要用于处理与用户历史记录相关的服务。该类使用了一个名为 IRepository<UserHistory> 的通用仓储接口来与数据存储进行交互。以下是代码的主要功能和结构的详细解释:
1. 类的构造函数
public UserHistoryService(IRepository<UserHistory> repository) : IUserHistoryService
- 该构造函数接受一个
IRepository<UserHistory>类型的参数repository,用于与UserHistory数据模型进行交互。
2. 获取分页列表的方法
public async Task<IPagedList<UserHistoryResponse>> GetPagedListAsync(UserHistoryRequest request)
- 该方法用于根据请求参数获取用户历史记录的分页列表。
- 它接受一个
UserHistoryRequest类型的参数request,该参数包含了过滤条件(如账户、变更时间、变更属性等)。
过滤条件的构建
- 账户过滤:如果请求中包含账户信息,则使用正则表达式构建一个过滤条件。
- 变更时间过滤:如果请求中包含开始时间和结束时间,则分别构建大于等于和小于等于的过滤条件。
- 变更属性过滤:如果请求中包含变更属性,则构建一个过滤条件,检查
Changes列表中是否存在该属性。
组合过滤条件
- 所有的过滤条件被组合成一个
And过滤器,如果没有过滤条件,则使用一个空过滤器。
数据查询
- 使用组合后的过滤器从
repository中查询数据,并按Id降序排序,最后将结果转换为IPagedList<UserHistoryResponse>类型的分页列表。
3. 获取变更属性的方法
public async Task<List<string>> GetChangedPropertiesAsync()
- 该方法用于获取所有变更属性的列表。
- 它通过查询
repository中的Changes列表,使用GroupBy方法对变更字段进行分组,并返回唯一的字段名称列表。
总结
UserHistoryService类提供了与用户历史记录相关的服务,包括获取分页的用户历史记录和获取所有变更属性的功能。- 该类通过构建动态的过滤条件来支持灵活的查询,并使用异步方法来提高性能和响应能力。
评论加载中...