feat: add student video and profile experience

This commit is contained in:
2026-07-28 15:23:42 +08:00
parent 5e993298e7
commit 7a3cf09a99
31 changed files with 19821 additions and 170 deletions

View File

@@ -0,0 +1,80 @@
using System.Text.Json;
using Tiku.Application.Catalog;
using Tiku.Domain.Content;
namespace Tiku.Application.Assets;
public sealed record VideoPlaybackActor(Guid TenantId, Guid UserId);
public sealed record VideoSearchQuery(
string? Keyword = null,
Guid? SubjectId = null,
int? Limit = null);
public sealed record QuestionVideoQuery(
Guid? QuestionId = null,
IReadOnlyCollection<Guid>? QuestionIds = null,
int? Limit = null);
public sealed record VideoPlayCommand(Guid VideoId, Guid? QuestionId = null);
public sealed record VideoProgressCommand(
Guid VideoId,
Guid? QuestionId,
int PositionSeconds,
int? DurationSeconds,
int? WatchedSeconds,
bool? IsCompleted,
JsonElement Metadata);
public sealed record VideoPlaybackItem(
Guid VideoId,
Guid? QuestionId,
string Title,
string? Description,
string? PlayUrl,
string? ThumbnailUrl,
int? DurationSeconds,
VideoProgressItem? Progress,
JsonElement Metadata);
public sealed record VideoProgressItem(
Guid Id,
Guid VideoId,
Guid? QuestionId,
int PositionSeconds,
int? DurationSeconds,
int WatchedSeconds,
bool IsCompleted,
DateTimeOffset? CompletedAt,
DateTimeOffset LastPlayedAt,
int PlayCount,
JsonElement Metadata);
public interface IVideoPlaybackService
{
Task<CatalogList<VideoExplanationCatalogItem>> SearchAsync(
VideoPlaybackActor actor,
VideoSearchQuery query,
CancellationToken cancellationToken = default);
Task<VideoPlaybackItem> PlayAsync(
VideoPlaybackActor actor,
VideoPlayCommand command,
CancellationToken cancellationToken = default);
Task<VideoProgressItem> ReportProgressAsync(
VideoPlaybackActor actor,
VideoProgressCommand command,
CancellationToken cancellationToken = default);
Task<CatalogList<QuestionVideoCatalogItem>> GetQuestionVideosAsync(
VideoPlaybackActor actor,
QuestionVideoQuery query,
CancellationToken cancellationToken = default);
}
public sealed class VideoPlaybackException(string message, string code) : Exception(message)
{
public string Code { get; } = code;
}