using System.ComponentModel.DataAnnotations; using Tiku.Application.QuestionBanks; using Tiku.Domain.Content; namespace Tiku.Api.Contracts; /// /// 题目题库查询参数。 /// public sealed class QuestionBankQueryDto { /// /// 租户编码。 /// [StringLength(100)] public string? TenantCode { get; set; } /// /// 地区 ID。 /// public Guid? RegionId { get; set; } /// /// 题库 ID。 /// public Guid? QuestionBankId { get; set; } /// /// 科目 ID。 /// public Guid? SubjectId { get; set; } /// /// 分类 ID。 /// public Guid? CategoryId { get; set; } /// /// 节点 ID。 /// public Guid? NodeId { get; set; } /// /// 内容入口 ID。 /// public Guid? EntryId { get; set; } /// /// 内容节点 ID。 /// public Guid? ContentNodeId { get; set; } /// /// 题集 ID。 /// public Guid? CollectionId { get; set; } /// /// 来源。 /// public QuestionSource? Source { get; set; } /// /// 类型。 /// [StringLength(50)] public string? Type { get; set; } /// /// 关键字。 /// [StringLength(100)] public string? Keyword { get; set; } /// /// 题目 ID 列表。 /// public string? QuestionIds { get; set; } /// /// 返回数量上限。 /// [Range(1, 500)] public int? Limit { get; set; } public QuestionBankFilter ToFilter(Guid tenantId, Guid? questionId = null) { return new QuestionBankFilter( tenantId, RegionId, QuestionBankId, SubjectId, CategoryId, NodeId, EntryId, ContentNodeId, CollectionId, questionId, ParseQuestionIds(), Type, Keyword, Limit, Source); } private Guid[] ParseQuestionIds() { if (string.IsNullOrWhiteSpace(QuestionIds)) { return []; } return QuestionIds .Split(',', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) .Select(value => Guid.TryParse(value, out var id) ? id : (Guid?)null) .Where(id => id.HasValue) .Select(id => id!.Value) .Distinct() .Take(300) .ToArray(); } }