feat: migrate direct tenant content and learning endpoints

This commit is contained in:
xiong
2026-07-26 17:57:03 +08:00
parent 1d7e09b1f0
commit 91a4162908
18 changed files with 4079 additions and 0 deletions

View File

@@ -2,6 +2,20 @@ namespace Tiku.Application.Learning;
public interface ILearningActivityService
{
Task<LearningStatsItem> GetStatsAsync(
LearningActor actor,
CancellationToken cancellationToken = default);
Task<LearningList<LearningTrendItem>> GetTrendAsync(
LearningActor actor,
LearningLimitFilter filter,
CancellationToken cancellationToken = default);
Task<LearningLeaderboardResult> GetLeaderboardAsync(
LearningActor actor,
LearningLimitFilter filter,
CancellationToken cancellationToken = default);
Task<AnswerRecordItem> SubmitAnswerAsync(
LearningActor actor,
SubmitAnswerCommand command,
@@ -22,6 +36,11 @@ public interface ILearningActivityService
LearningLimitFilter filter,
CancellationToken cancellationToken = default);
Task<WrongQuestionReviewPlan> GetWrongQuestionReviewPlanAsync(
LearningActor actor,
LearningLimitFilter filter,
CancellationToken cancellationToken = default);
Task<LearningActionResult> ResolveWrongQuestionAsync(
LearningActor actor,
QuestionActionCommand command,
@@ -32,11 +51,26 @@ public interface ILearningActivityService
LearningLimitFilter filter,
CancellationToken cancellationToken = default);
Task<WordReviewPlan> GetWordReviewPlanAsync(
LearningActor actor,
LearningLimitFilter filter,
CancellationToken cancellationToken = default);
Task<WordProgressItem> UpdateWordProgressAsync(
LearningActor actor,
WordProgressCommand command,
CancellationToken cancellationToken = default);
Task<WordProgressItem> ReviewWordAsync(
LearningActor actor,
WordReviewCommand command,
CancellationToken cancellationToken = default);
Task<WordStatsItem> GetWordStatsAsync(
LearningActor actor,
LearningLimitFilter filter,
CancellationToken cancellationToken = default);
Task<LearningList<FavoriteWordItem>> GetFavoriteWordsAsync(
LearningActor actor,
LearningLimitFilter filter,

View File

@@ -28,6 +28,62 @@ public sealed record FavoriteWordCommand(Guid WordId, bool? Favorite, string? No
public sealed record LearningLimitFilter(int? Limit = null, string? Status = null, Guid? UnitId = null);
public sealed record LearningStatsItem(
int AnswerCount,
int CorrectCount,
int WrongCount,
int FavoriteQuestionCount,
int FavoriteWordCount,
int WordProgressCount,
int PracticeSessionCount,
int PracticeReportCount);
public sealed record LearningTrendItem(DateOnly Date, int AnswerCount, int CorrectCount, int WrongCount);
public sealed record LearningLeaderboardItem(
Guid UserId,
string? DisplayName,
int AnswerCount,
int CorrectCount,
int WrongCount,
decimal Accuracy);
public sealed record LearningLeaderboardResult(
string Metric,
string Period,
IReadOnlyCollection<LearningLeaderboardItem> Items,
LearningLeaderboardItem? CurrentUser,
DateTimeOffset GeneratedAt);
public sealed record WrongQuestionReviewPlanItem(Guid QuestionId, int WrongCount, DateTimeOffset LastWrongAt);
public sealed record WrongQuestionReviewPlan(
IReadOnlyCollection<WrongQuestionReviewPlanItem> Items,
JsonElement NextAction);
public sealed record WordReviewPlanItem(
Guid WordId,
WordProgressStatus Status,
DateTimeOffset? NextReviewAt,
int CorrectCount,
int WrongCount,
WordDueLevel DueLevel);
public sealed record WordReviewPlan(
IReadOnlyCollection<WordReviewPlanItem> Items,
JsonElement NextAction);
public sealed record WordReviewCommand(Guid WordId, string? Result, DateTimeOffset? NextReviewAt);
public sealed record WordStatsItem(
int Total,
int NewCount,
int LearningCount,
int ReviewingCount,
int MasteredCount,
int DueCount,
int FavoriteCount);
public sealed record PracticeSessionCommand(
string? Mode,
string? TargetType,