Files
tiku-backend.net/Tiku.Domain/Learning/LearningAccessV2Entities.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

179 lines
5.9 KiB
C#

using Tiku.Domain.Common;
namespace Tiku.Domain.Learning;
public sealed class TenantBusinessLicense : AuditableTenantEntity
{
public Guid BusinessLineId { get; set; }
public LicenseLifecycleStatus Status { get; set; } = LicenseLifecycleStatus.Active;
public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? EndsAt { get; set; }
public long Version { get; set; } = 1;
}
public sealed class TenantLicensedTarget : Entity, ITenantOwned
{
public Guid TenantBusinessLicenseId { get; set; }
public Guid ExamTargetProfileVersionId { get; set; }
public bool IsBaseTarget { get; set; }
public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? EndsAt { get; set; }
public Guid TenantId { get; set; }
}
public sealed class ProductAccessManifest : AuditableTenantEntity
{
public Guid LearningProductId { get; set; }
public Guid? CurrentVersionId { get; set; }
public bool IsActive { get; set; } = true;
}
public sealed class ProductAccessManifestVersion : Entity, ITenantOwned
{
public Guid ProductAccessManifestId { get; set; }
public int VersionNo { get; set; } = 1;
public AccessManifestStatus Status { get; set; } = AccessManifestStatus.Draft;
public int MaxActiveTargets { get; set; } = 1;
public int MaxAlternateTargets { get; set; }
public int? DailyQuestionLimit { get; set; }
public int? TotalQuestionLimit { get; set; }
public DateTimeOffset? PublishedAt { get; set; }
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
public Guid TenantId { get; set; }
}
public sealed class ProductManifestRelease : Entity, ITenantOwned
{
public Guid ProductAccessManifestVersionId { get; set; }
public Guid ContentOwnerTenantId { get; set; }
public Guid ContentReleaseId { get; set; }
public Guid? PlatformContentPackageOwnerTenantId { get; set; }
public Guid? PlatformContentPackageVersionId { get; set; }
public Guid TenantId { get; set; }
}
public sealed class ProductManifestTarget : Entity, ITenantOwned
{
public Guid ProductAccessManifestVersionId { get; set; }
public Guid ExamTargetProfileVersionId { get; set; }
public bool MayBePrimary { get; set; } = true;
public bool MayBeAlternate { get; set; }
public Guid TenantId { get; set; }
}
public sealed class ProductManifestResource : Entity, ITenantOwned
{
public Guid ProductAccessManifestVersionId { get; set; }
public AccessResourceType ResourceType { get; set; }
public Guid ResourceId { get; set; }
public string DisplayName { get; set; } = string.Empty;
public int SortOrder { get; set; }
public Guid TenantId { get; set; }
}
public sealed class StudentEntitlement : AuditableTenantEntity
{
public Guid UserId { get; set; }
public Guid LearningProductId { get; set; }
public Guid ProductAccessManifestVersionId { get; set; }
public StudentEntitlementStatus Status { get; set; } = StudentEntitlementStatus.Active;
public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? EndsAt { get; set; }
public string SourceType { get; set; } = string.Empty;
public Guid? SourceId { get; set; }
public int UsedQuestionCount { get; set; }
public DateTimeOffset? RevokedAt { get; set; }
public Guid? RevokedBy { get; set; }
public string? RevokedReason { get; set; }
}
public sealed class StudentTargetSelectionHistory : AuditableTenantEntity
{
public Guid UserId { get; set; }
public Guid BusinessLineId { get; set; }
public Guid ExamTargetProfileVersionId { get; set; }
public TargetSelectionRole Role { get; set; } = TargetSelectionRole.Primary;
public Guid? EntitlementId { get; set; }
public string SourceType { get; set; } = string.Empty;
public Guid SourceId { get; set; }
public DateTimeOffset EffectiveAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? EndedAt { get; set; }
public bool IsCurrent { get; set; } = true;
public Guid? ChangedBy { get; set; }
public string? Reason { get; set; }
}
public sealed class ClassAssignmentGrant : AuditableTenantEntity
{
public Guid ClassId { get; set; }
public Guid ProductAccessManifestVersionId { get; set; }
public AccessResourceType ResourceType { get; set; }
public Guid ResourceId { get; set; }
public DateTimeOffset StartsAt { get; set; } = DateTimeOffset.UtcNow;
public DateTimeOffset? EndsAt { get; set; }
public ClassAssignmentGrantStatus Status { get; set; } = ClassAssignmentGrantStatus.Active;
public Guid? CreatedBy { get; set; }
public Guid? RevokedBy { get; set; }
public string? RevokedReason { get; set; }
}
public sealed class EffectiveAccessProjection : TenantEntity
{
public Guid UserId { get; set; }
public Guid BusinessLineId { get; set; }
public Guid? PrimaryProfileVersionId { get; set; }
public Guid[] AlternateProfileVersionIds { get; set; } = [];
public Guid[] ContentReleaseIds { get; set; } = [];
public Guid[] AudienceSegmentIds { get; set; } = [];
public Guid[] ManifestVersionIds { get; set; } = [];
public long GrantVersion { get; set; } = 1;
public long ContentVersion { get; set; } = 1;
public long StrongRevocationVersion { get; set; } = 1;
public DateTimeOffset ValidUntil { get; set; }
public DateTimeOffset CompiledAt { get; set; } = DateTimeOffset.UtcNow;
}
public enum LicenseLifecycleStatus
{
Active,
Suspended,
Expired,
Cancelled
}
public enum AccessManifestStatus
{
Draft,
Published,
Retired
}
public enum AccessResourceType
{
ContentRelease,
CurriculumNode,
CollectionRelease,
BlueprintRelease
}
public enum TargetSelectionRole
{
Primary,
Alternate
}
public enum StudentEntitlementStatus
{
Active,
Expired,
Revoked,
Cancelled
}
public enum ClassAssignmentGrantStatus
{
Active,
Revoked,
Expired
}