153 lines
4.5 KiB
C#
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);
|
|
}
|