using System.Text.Json; using Tiku.Domain.Common; using Tiku.Domain.Operations; using Tiku.Domain.Tenancy; namespace Tiku.Application.TenantAdmin; public sealed record TenantAdminActor(Guid TenantId, Guid UserId, TenantRole Role = TenantRole.TenantAdmin); public sealed record TenantAdminClassFilter( Guid? RegionId = null, string? Status = null, string? Keyword = null, int? Limit = null); public sealed record TenantAdminClassMemberFilter( Guid ClassId, string? MemberType = null, string? Status = null, int? Limit = null); public sealed record TenantAdminStudentFilter( Guid? RegionId = null, Guid? ClassId = null, string? Status = null, string? Keyword = null, int? Limit = null); public sealed record TenantAdminStudentActivityFilter( Guid? StudentUserId = null, string? Status = null, int? Limit = null); public sealed record TenantAdminMemberFilter( string? Role = null, string? Status = null, string? Keyword = null, int? Limit = null); public sealed record TenantAdminAuditLogFilter( string? Action = null, string? TargetType = null, Guid? ActorUserId = null, int? Limit = null); public sealed record TenantAdminRoleTemplateFilter( string? Status = null, int? Limit = null); public sealed record UpsertTenantAdminClassCommand( Guid? Id, Guid? RegionId, string? LegacyId, string? Code, string Name, string? Description, string? Status, int? Order, JsonElement Metadata); public sealed record UserLookupCommand( Guid? UserId, string? Username, string? Email, string? Phone, string? Name, string? AvatarUrl); public sealed record UpsertTenantAdminClassMemberCommand( Guid ClassId, UserLookupCommand User, string? MemberType, string? Status, JsonElement Metadata); public sealed record UpsertTenantAdminStudentCommand( UserLookupCommand User, Guid? RegionId, Guid? SelectedSchoolId, Guid? SelectedMajorId, string? AvatarPreset, JsonElement Stats, JsonElement Progress, JsonElement ModuleSelections, JsonElement RawProfile); public sealed record UpdateTenantAdminStudentStatusCommand( Guid UserId, string? Status, string? Reason); public sealed record UpsertTenantAdminStudentNoteCommand( Guid? Id, Guid StudentUserId, string? NoteType, string Content, string? Visibility, bool? IsPinned, JsonElement Metadata); public sealed record UpsertTenantAdminStudentFollowupCommand( Guid? Id, Guid StudentUserId, Guid? AssignedToUserId, Guid? ClassId, string Title, string? Description, string? FollowupType, string? Priority, string? Status, DateTimeOffset? DueAt, JsonElement Metadata); public sealed record UpsertTenantAdminMemberCommand( Guid? MembershipId, UserLookupCommand User, string? Role, string? Status, Guid? RoleTemplateId, JsonElement Permissions, string? PrimaryRole); public sealed record UpsertTenantAdminRoleTemplateCommand( Guid? Id, string? Code, string Name, string? Description, string? BaseRole, string? Status, JsonElement Permissions, JsonElement MenuPermissions, JsonElement ModulePermissions, JsonElement FieldPermissions, JsonElement DataScope, int? Order); public sealed record UpsertTenantBrandingCommand( string BrandName, string? ShortName, string? Slogan, string? OrganizationName, string? LogoUrl, string? FaviconUrl, string? ServiceWechat, string? ServiceAccountName); public sealed record UpsertTenantSettingsCommand( JsonElement FeatureFlags, JsonElement AdminFeatureFlags, JsonElement PublicConfig); public sealed record PreviewTenantThemeCommand( string TemplateCode, JsonElement Theme, JsonElement PublicAssets); public sealed record PublishTenantThemeCommand( bool UseDraft, string? TemplateCode, JsonElement Theme, JsonElement PublicAssets); public sealed record CreateTenantDomainCommand( string Host, string? DomainType, bool IsPrimary); public sealed record UpsertTenantAuthProviderCommand( string Provider, string? Status, string? DisplayName, JsonElement ConfigPublic); public sealed record TenantAdminClassList( IReadOnlyCollection Items, bool Scoped); public sealed record TenantAdminStudentList( IReadOnlyCollection Items, bool Scoped); public sealed record TenantAdminClassItem( Guid Id, Guid? RegionId, string? RegionName, string? LegacyId, string? Code, string Name, string? Description, TenantRecordStatus Status, int Order, JsonElement Metadata, int StudentCount, int StaffCount, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminClassMemberItem( Guid Id, Guid ClassId, Guid UserId, TenantClassMemberType MemberType, TenantClassMemberStatus Status, DateTimeOffset JoinedAt, DateTimeOffset? LeftAt, JsonElement Metadata, TenantAdminUserSummary User); public sealed record TenantAdminUserSummary( Guid Id, string? Username, string? Email, string? Phone, string? Name, string? AvatarUrl, string PrimaryRole); public sealed record TenantAdminStudentItem( Guid MembershipId, Guid UserId, MembershipStatus Status, TenantAdminUserSummary User, Guid? ProfileId, string AvatarPreset, Guid? RegionId, string? RegionName, Guid? SelectedSchoolId, string? SelectedSchoolName, Guid? SelectedMajorId, string? SelectedMajorName, JsonElement Stats, JsonElement Progress, JsonElement ModuleSelections, IReadOnlyCollection Classes, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminStudentClassSummary( Guid ClassId, string ClassName, string? ClassCode, TenantClassMemberType MemberType, DateTimeOffset JoinedAt); public sealed record TenantAdminStudentStatusItem( Guid MembershipId, Guid UserId, TenantRole Role, MembershipStatus Status, DateTimeOffset UpdatedAt); public sealed record TenantAdminStudentNoteItem( Guid Id, Guid StudentUserId, StudentNoteType NoteType, string Content, StudentNoteVisibility Visibility, bool IsPinned, JsonElement Metadata, Guid? CreatedBy, Guid? UpdatedBy, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminStudentFollowupItem( Guid Id, Guid StudentUserId, Guid? AssignedToUserId, Guid? ClassId, string Title, string? Description, StudentFollowupType FollowupType, StudentFollowupPriority Priority, StudentFollowupStatus Status, DateTimeOffset? DueAt, DateTimeOffset? CompletedAt, Guid? CompletedBy, JsonElement Metadata, Guid? CreatedBy, Guid? UpdatedBy, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminMemberItem( Guid MembershipId, Guid UserId, TenantRole Role, MembershipStatus Status, JsonElement Permissions, Guid? RoleTemplateId, string? RoleTemplateCode, string? RoleTemplateName, string? LegacyRole, TenantAdminUserSummary User, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAdminAuditLogItem( Guid Id, Guid? ActorUserId, string Action, string? TargetType, string? TargetId, JsonElement Details, string? IpAddress, string? UserAgent, string? ActorName, string? ActorPhone, DateTimeOffset CreatedAt); public sealed record TenantAdminPermissionMatrix( TenantAdminCurrentPermission Current, IReadOnlyCollection Permissions, IReadOnlyDictionary> RoleDefaults); public sealed record TenantAdminCurrentPermission( Guid UserId, Guid TenantId, TenantRole Role); public sealed record TenantAdminPermissionCatalogItem(string Key, string Label); public sealed record TenantAdminRoleTemplateItem( Guid Id, string Code, string Name, string? Description, TenantRole BaseRole, TenantRoleTemplateStatus Status, JsonElement Permissions, JsonElement MenuPermissions, JsonElement ModulePermissions, JsonElement FieldPermissions, JsonElement DataScope, bool IsSystem, int Order, Guid? CreatedBy, Guid? UpdatedBy, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantBrandingItem( Guid TenantId, string BrandName, string? ShortName, string? Slogan, string? OrganizationName, string? LogoUrl, string? FaviconUrl, string? ServiceWechat, string? ServiceAccountName, JsonElement Theme, JsonElement PublicAssets, DateTimeOffset UpdatedAt); public sealed record TenantSettingsItem( Guid TenantId, JsonElement FeatureFlags, JsonElement AdminFeatureFlags, JsonElement PublicConfig, DateTimeOffset UpdatedAt); public sealed record TenantThemeTemplateItem( string Code, string Name, string? Description, string? PreviewImageUrl, JsonElement Theme, JsonElement PublicAssets, int Order); public sealed record TenantThemeItem( Guid TenantId, string? ActiveTemplateCode, JsonElement ActiveTheme, JsonElement ActivePublicAssets, string? DraftTemplateCode, JsonElement DraftTheme, JsonElement DraftPublicAssets, TenantThemeConfigStatus Status, DateTimeOffset? PublishedAt, Guid? PublishedBy, Guid? DraftUpdatedBy, DateTimeOffset UpdatedAt); public sealed record TenantDomainItem( Guid Id, string Host, TenantDomainType DomainType, TenantDomainStatus Status, bool IsPrimary, string? VerificationToken, DateTimeOffset? VerifiedAt, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed record TenantAuthProviderItem( Guid Id, string Provider, TenantAuthProviderStatus Status, string? DisplayName, JsonElement ConfigPublic, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public sealed class TenantAdminDirectException(string message, string code) : Exception(message) { public string Code { get; } = code; }