Files
tiku-backend.net/Tiku.Application/Content/ContentV2AuthoringModels.cs
xiong 3f5957d744
Some checks failed
ci / release-gate (push) Has been cancelled
feat(content): establish v2 learning delivery foundation
2026-08-06 09:52:18 +08:00

153 lines
4.5 KiB
C#

using System.Text.Json;
using Tiku.Domain.Content;
namespace Tiku.Application.Content;
public sealed record ContentAuthorActor(Guid TenantId, Guid UserId);
public interface IPlatformContentActorResolver
{
Task<ContentAuthorActor> ResolveAsync(Guid userId, CancellationToken cancellationToken = default);
}
public sealed record QuestionRevisionDraft(
string QuestionType,
string? TypeLabel,
int? Difficulty,
string? Content,
JsonElement Options,
int? CorrectOptionIndex,
JsonElement CorrectOptionIndices,
string? AnswerText,
string? Explanation,
JsonElement SubQuestions,
string? CodeLang,
string? CodeTemplate);
public sealed record QuestionDuplicateCandidate(
Guid QuestionAssetOwnerTenantId,
Guid QuestionAssetId,
Guid QuestionRevisionId,
string Source,
bool ExactDeliveryMatch,
double PromptSimilarity,
string QuestionType,
string? Content,
int? Difficulty);
public sealed record QuestionDuplicateSearchResult(
string DeliveryFingerprint,
IReadOnlyCollection<QuestionDuplicateCandidate> Candidates);
public enum QuestionImportDecision
{
ReusePlatform,
ReuseTenant,
CreateNew,
CreateVariant,
Skip,
ManualReview
}
public sealed record ExecuteQuestionAuthoringCommand(
QuestionImportDecision Decision,
QuestionRevisionDraft Draft,
Guid? ReuseQuestionAssetId = null,
Guid? FamilyId = null,
bool PublishAsset = false);
public sealed record QuestionAuthoringResult(
QuestionImportDecision Decision,
Guid? QuestionAssetOwnerTenantId,
Guid? QuestionAssetId,
Guid? QuestionRevisionId,
string DeliveryFingerprint,
string Status);
public sealed record QuestionImportPreviewRow(
string RowKey,
string DeliveryFingerprint,
QuestionImportDecision SuggestedDecision,
IReadOnlyCollection<QuestionDuplicateCandidate> Candidates);
public sealed record QuestionImportPreviewResult(
int RowCount,
IReadOnlyCollection<QuestionImportPreviewRow> Rows);
public sealed record ExecuteQuestionImportRow(
string RowKey,
ExecuteQuestionAuthoringCommand Command);
public sealed record QuestionImportExecutionRow(
string RowKey,
QuestionAuthoringResult Result);
public sealed record QuestionImportExecutionResult(
int RowCount,
IReadOnlyCollection<QuestionImportExecutionRow> Rows);
public sealed record PlacementConditionCommand(
Guid TargetDimensionDefinitionId,
Guid TargetNodeId,
TargetRuleOperator Operator);
public sealed record PlacementRuleGroupCommand(
int GroupOrder,
IReadOnlyCollection<PlacementConditionCommand> Conditions);
public sealed record CreateQuestionPlacementCommand(
Guid QuestionAssetOwnerTenantId,
Guid QuestionAssetId,
Guid CurriculumVersionId,
Guid CurriculumNodeId,
Guid AssessmentPolicyVersionId,
IReadOnlyCollection<Guid> KnowledgeConceptIds,
IReadOnlyCollection<PlacementRuleGroupCommand> RuleGroups,
int? DifficultyOverride = null,
bool Activate = false);
public sealed record QuestionPlacementItem(
Guid Id,
Guid QuestionAssetOwnerTenantId,
Guid QuestionAssetId,
Guid CurriculumVersionId,
Guid CurriculumNodeId,
Guid AssessmentPolicyVersionId,
string Status);
public interface IContentV2AuthoringService
{
Task<QuestionDuplicateSearchResult> SearchDuplicatesAsync(
ContentAuthorActor actor,
QuestionRevisionDraft draft,
int limit = 20,
CancellationToken cancellationToken = default);
Task<QuestionAuthoringResult> ExecuteAsync(
ContentAuthorActor actor,
ExecuteQuestionAuthoringCommand command,
CancellationToken cancellationToken = default);
Task<QuestionAuthoringResult> CreateRevisionAsync(
ContentAuthorActor actor,
Guid questionAssetId,
QuestionRevisionDraft draft,
bool publishAsset,
CancellationToken cancellationToken = default);
Task<QuestionPlacementItem> CreatePlacementAsync(
ContentAuthorActor actor,
CreateQuestionPlacementCommand command,
CancellationToken cancellationToken = default);
Task<QuestionImportPreviewResult> PreviewImportAsync(
ContentAuthorActor actor,
IReadOnlyCollection<(string RowKey, QuestionRevisionDraft Draft)> rows,
CancellationToken cancellationToken = default);
Task<QuestionImportExecutionResult> ExecuteImportAsync(
ContentAuthorActor actor,
IReadOnlyCollection<ExecuteQuestionImportRow> rows,
CancellationToken cancellationToken = default);
}