using Dpz.Core.Entity.Base.ExpressTreeQuery;
using Dpz.Core.EnumLibrary.Pipeline;
using Dpz.Core.Public.Entity.Pipeline;
using Dpz.Core.Service.Mediator.Features.Pipeline.Contracts;

namespace Dpz.Core.Service.Mediator.Features.Pipeline.Queries;

/// <summary>
/// 获取最新的 CI/CD 历史记录 入参
/// </summary>
public class GetPipelineHistoryLatestRequest : IRequest<List<PipelineHistoryLatestResponse>>
{
    /// <summary>
    /// 最新数量
    /// </summary>
    public int LatestCount { get; set; } = 10;

    /// <summary>
    /// CI/CD 开始时间查询范围起始
    /// </summary>
    [QueryFilter(
        FilterCondition.NotNull,
        Comparison = Comparison.GtOrEqual,
        PropertyName = nameof(PipelineHistory.StartTime)
    )]
    public DateTime? StartTimeRangeBegin { get; set; }

    /// <summary>
    /// CI/CD 开始时间查询范围结束
    /// </summary>
    [QueryFilter(
        FilterCondition.NotNull,
        Comparison = Comparison.LtOrEqual,
        PropertyName = nameof(PipelineHistory.StartTime)
    )]
    public DateTime? StartTimeRangeEnd { get; set; }

    /// <summary>
    /// CI/CD 结束时间查询范围起始
    /// </summary>
    [QueryFilter(
        FilterCondition.NotNull,
        Comparison = Comparison.GtOrEqual,
        PropertyName = nameof(PipelineHistory.EndTime)
    )]
    public DateTime? EndTimeRangeBegin { get; set; }

    /// <summary>
    /// CI/CD 结束时间查询范围结束
    /// </summary>
    [QueryFilter(
        FilterCondition.NotNull,
        Comparison = Comparison.LtOrEqual,
        PropertyName = nameof(PipelineHistory.EndTime)
    )]
    public DateTime? EndTimeRangeEnd { get; set; }

    /// <summary>
    /// CI/CD 状态
    /// </summary>
    [QueryFilter(FilterCondition.NotNull)]
    public PipelineStatus? Status { get; set; }

    /// <summary>
    /// 构建、发布的项目
    /// </summary>
    [QueryFilter(FilterCondition.NotNull)]
    public BuildProject? Project { get; set; }

    /// <summary>
    /// 发布的版本号
    /// </summary>
    public string? Version { get; set; }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这段代码定义了一个C# 的请求类,用于获取最新的 CI/CD 历史记录。它属于Mediator模式中的一个查询请求,最终会被相应的Handler处理并返回PipelineHistoryLatestResponse列表。

下面逐步解释代码内容:


1. 命名空间和引用

  • using Dpz.Core.Entity.Base.ExpressTreeQuery;:引入基础表达式树查询相关类型(如QueryFilter特性、FilterConditionComparison枚举)。
  • using Dpz.Core.EnumLibrary.Pipeline;:引入管线相关的状态枚举(如PipelineStatus)。
  • using Dpz.Core.Public.Entity.Pipeline;:引入管线实体(如PipelineHistoryBuildProject)。
  • using Dpz.Core.Service.Mediator.Features.Pipeline.Contracts;:引入该功能模块的契约/响应类型(如PipelineHistoryLatestResponse)。

2. 请求类定义

public class GetPipelineHistoryLatestRequest : IRequest<List<PipelineHistoryLatestResponse>>
  • 它继承了IRequest<TResult>接口(来自MediatR库),表示这是一个请求,并且期望返回List<PipelineHistoryLatestResponse>

3. 属性详解

每个属性用于筛选查询历史记录,其中部分属性通过[QueryFilter]特性标记,说明它们会根据条件自动生成查询表达式


LatestCount(最新数量)

public int LatestCount { get; set; } = 10;
  • 表示要获取的记录条数,默认值为10。
  • 没有使用[QueryFilter],因为它是用于控制返回数量的,不是筛选条件。

StartTimeRangeBegin / StartTimeRangeEnd(开始时间范围)

[QueryFilter(FilterCondition.NotNull, Comparison = Comparison.GtOrEqual, PropertyName = nameof(PipelineHistory.StartTime))]
public DateTime? StartTimeRangeBegin { get; set; }
  • StartTimeRangeBegin:查询开始时间的下界(start >= 该时间)。
  • 特性含义:
    • FilterCondition.NotNull:如果该属性有值(非null),则应用这个筛选条件。
    • Comparison = Comparison.GtOrEqual:比较方式为“大于或等于”。
    • PropertyName:指定要比较的实体属性(这里为PipelineHistory.StartTime)。

对应的StartTimeRangeEnd则使用Comparison.LtOrEqual(小于等于),表示开始时间小于等于该值。


EndTimeRangeBegin / EndTimeRangeEnd(结束时间范围)

类似开始时间的筛选条件,只不过它们针对的是PipelineHistory.EndTime

[QueryFilter(FilterCondition.NotNull, Comparison = Comparison.GtOrEqual, PropertyName = nameof(PipelineHistory.EndTime))]
public DateTime? EndTimeRangeBegin { get; set; }
  • 用于过滤历史记录中的结束时间。

Status(状态)

[QueryFilter(FilterCondition.NotNull)]
public PipelineStatus? Status { get; set; }
  • 可空枚举,表示只查询指定状态的记录。
  • [QueryFilter(FilterCondition.NotNull)]:如果该属性非null,则筛选字段名默认为属性名Status(因为没有指定PropertyName),即等于该状态。

Project(项目)

[QueryFilter(FilterCondition.NotNull)]
public BuildProject? Project { get; set; }
  • 可空枚举,表示构建/发布的具体项目类型,只查询该项目的历史。

Version(版本号)

public string? Version { get; set; }
  • 没有[QueryFilter]标记,说明该字段可能在后续Handler里被单独处理(或模糊查询),而不是通过通用特性自动过滤。

4. 整体用途

这个请求通常用于支持一个API接口:例如请求“获取符合条件的最新的10条CI/CD历史记录”,可以根据:

  • 数量的控制 (LatestCount)
  • 开始时间范围
  • 结束时间范围
  • 状态
  • 项目类型
  • 版本号

来筛选数据库中的PipelineHistory记录,结果按开始时间降序等规则返回前N条记录。

[QueryFilter]特性是为了配合表达式树查询构建器,自动将请求对象的字段转换为LINQ的Where表达式,从而减少手动编写查询逻辑,提高代码复用性和可维护性。


总结

这是一个MediatR请求对象,封装了获取最新CI/CD历史记录的过滤条件和数量限制,特性标记使其能够自动映射到数据库查询中,最终返回DTO列表。

评论加载中...