using System.ComponentModel.DataAnnotations; using Tiku.Application.Catalog; namespace Tiku.Api.Contracts; public sealed class CatalogQueryDto { /// /// 租户编码。未登录公开查询时使用;已登录时优先使用当前 token 的租户。 /// [StringLength(100)] public string? TenantCode { get; set; } /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 功能模块 ID。 /// public Guid? ModuleId { get; set; } /// /// 父节点 ID;传 root 表示根节点。 /// [StringLength(64)] [RegularExpression("^(root|[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$")] public string? ParentId { get; set; } /// /// 院校 ID。 /// public Guid? SchoolId { get; set; } /// /// 专业 ID。 /// public Guid? MajorId { get; set; } /// /// 科目 ID。 /// public Guid? SubjectId { get; set; } /// /// 导航节点 ID。 /// public Guid? NodeId { get; set; } /// /// 名称关键词。 /// [StringLength(100)] public string? Keyword { get; set; } /// /// 类型过滤,例如 cultural、professional、chapter、paper。 /// [StringLength(50)] public string? Type { get; set; } /// /// 返回条数上限。 /// [Range(1, 2000)] public int? Limit { get; set; } public CatalogFilter ToFilter(Guid tenantId) { var parentIsRoot = string.Equals(ParentId, "root", StringComparison.OrdinalIgnoreCase); Guid? parentId = parentIsRoot || string.IsNullOrWhiteSpace(ParentId) ? null : Guid.Parse(ParentId); return new CatalogFilter( tenantId, RegionId, ModuleId, parentId, parentIsRoot, SchoolId, MajorId, SubjectId, NodeId, Keyword, Type, Limit); } }