using System.ComponentModel.DataAnnotations; using System.Text.Json; using Tiku.Application.TenantAdmin; using Tiku.Domain.Common; namespace Tiku.Api.Contracts; public sealed class TenantAdminClassQueryDto { public Guid? RegionId { get; set; } public string? Status { get; set; } public string? Keyword { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminClassFilter ToFilter() { return new TenantAdminClassFilter(RegionId, Status, Keyword, Limit); } } public sealed class TenantAdminClassMemberQueryDto { [Required] public Guid ClassId { get; set; } public string? MemberType { get; set; } public string? Status { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminClassMemberFilter ToFilter() { return new TenantAdminClassMemberFilter(ClassId, MemberType, Status, Limit); } } public sealed class TenantAdminStudentQueryDto { public Guid? RegionId { get; set; } public Guid? ClassId { get; set; } public string? Status { get; set; } public string? Keyword { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminStudentFilter ToFilter() { return new TenantAdminStudentFilter(RegionId, ClassId, Status, Keyword, Limit); } } public sealed class TenantAdminStudentActivityQueryDto { public Guid? StudentUserId { get; set; } public string? Status { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminStudentActivityFilter ToFilter() { return new TenantAdminStudentActivityFilter(StudentUserId, Status, Limit); } } public sealed class TenantAdminMemberQueryDto { public string? Role { get; set; } public string? Status { get; set; } public string? Keyword { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminMemberFilter ToFilter() { return new TenantAdminMemberFilter(Role, Status, Keyword, Limit); } } public sealed class TenantAdminAuditLogQueryDto { public string? Action { get; set; } public string? TargetType { get; set; } public Guid? ActorUserId { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminAuditLogFilter ToFilter() { return new TenantAdminAuditLogFilter(Action, TargetType, ActorUserId, Limit); } } public sealed class TenantAdminRoleTemplateQueryDto { public string? Status { get; set; } [Range(1, 500)] public int? Limit { get; set; } public TenantAdminRoleTemplateFilter ToFilter() { return new TenantAdminRoleTemplateFilter(Status, Limit); } } public sealed class UpsertTenantAdminClassDto { public Guid? Id { get; set; } public Guid? RegionId { get; set; } public string? LegacyId { get; set; } public string? Code { get; set; } public required string Name { get; set; } public string? Description { get; set; } public string? Status { get; set; } public int? Order { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminClassCommand ToCommand() { return new UpsertTenantAdminClassCommand(Id, RegionId, LegacyId, Code, Name, Description, Status, Order, Metadata); } } public sealed class TenantAdminUserLookupDto { public Guid? UserId { get; set; } public string? Username { get; set; } public string? Email { get; set; } public string? Phone { get; set; } public string? Name { get; set; } public string? AvatarUrl { get; set; } public UserLookupCommand ToCommand() { return new UserLookupCommand(UserId, Username, Email, Phone, Name, AvatarUrl); } } public sealed class UpsertTenantAdminClassMemberDto { [Required] public Guid ClassId { get; set; } public TenantAdminUserLookupDto User { get; set; } = new(); public string? MemberType { get; set; } public string? Status { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminClassMemberCommand ToCommand() { return new UpsertTenantAdminClassMemberCommand(ClassId, User.ToCommand(), MemberType, Status, Metadata); } } public sealed class RemoveTenantAdminClassMemberDto { [Required] public Guid ClassMemberId { get; set; } } public sealed class UpsertTenantAdminStudentDto { public TenantAdminUserLookupDto User { get; set; } = new(); public Guid? RegionId { get; set; } public Guid? SelectedSchoolId { get; set; } public Guid? SelectedMajorId { get; set; } public string? AvatarPreset { get; set; } public JsonElement Stats { get; set; } = JsonDefaults.Object(); public JsonElement Progress { get; set; } = JsonDefaults.Object(); public JsonElement ModuleSelections { get; set; } = JsonDefaults.Object(); public JsonElement RawProfile { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentCommand ToCommand() { return new UpsertTenantAdminStudentCommand( User.ToCommand(), RegionId, SelectedSchoolId, SelectedMajorId, AvatarPreset, Stats, Progress, ModuleSelections, RawProfile); } } public sealed class UpdateTenantAdminStudentStatusDto { [Required] public Guid UserId { get; set; } public string? Status { get; set; } public string? Reason { get; set; } public UpdateTenantAdminStudentStatusCommand ToCommand() { return new UpdateTenantAdminStudentStatusCommand(UserId, Status, Reason); } } public sealed class UpsertTenantAdminStudentNoteDto { public Guid? Id { get; set; } [Required] public Guid StudentUserId { get; set; } public string? NoteType { get; set; } public required string Content { get; set; } public string? Visibility { get; set; } public bool? IsPinned { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentNoteCommand ToCommand() { return new UpsertTenantAdminStudentNoteCommand(Id, StudentUserId, NoteType, Content, Visibility, IsPinned, Metadata); } } public sealed class UpsertTenantAdminStudentFollowupDto { public Guid? Id { get; set; } [Required] public Guid StudentUserId { get; set; } public Guid? AssignedToUserId { get; set; } public Guid? ClassId { get; set; } public required string Title { get; set; } public string? Description { get; set; } public string? FollowupType { get; set; } public string? Priority { get; set; } public string? Status { get; set; } public DateTimeOffset? DueAt { get; set; } public JsonElement Metadata { get; set; } = JsonDefaults.Object(); public UpsertTenantAdminStudentFollowupCommand ToCommand() { return new UpsertTenantAdminStudentFollowupCommand( Id, StudentUserId, AssignedToUserId, ClassId, Title, Description, FollowupType, Priority, Status, DueAt, Metadata); } } public sealed class UpsertTenantAdminMemberDto { public Guid? MembershipId { get; set; } public TenantAdminUserLookupDto User { get; set; } = new(); public string? Role { get; set; } public string? Status { get; set; } public Guid? RoleTemplateId { get; set; } public JsonElement Permissions { get; set; } = JsonDefaults.Object(); public string? PrimaryRole { get; set; } public UpsertTenantAdminMemberCommand ToCommand() { return new UpsertTenantAdminMemberCommand(MembershipId, User.ToCommand(), Role, Status, RoleTemplateId, Permissions, PrimaryRole); } } public sealed class DisableTenantAdminMemberDto { [Required] public Guid MembershipId { get; set; } } public sealed class UpsertTenantAdminRoleTemplateDto { public Guid? Id { get; set; } public string? Code { get; set; } public required string Name { get; set; } public string? Description { get; set; } public string? BaseRole { get; set; } public string? Status { get; set; } public JsonElement Permissions { get; set; } = JsonDefaults.Object(); public JsonElement MenuPermissions { get; set; } = JsonDefaults.Object(); public JsonElement ModulePermissions { get; set; } = JsonDefaults.Object(); public JsonElement FieldPermissions { get; set; } = JsonDefaults.Object(); public JsonElement DataScope { get; set; } = JsonDefaults.Object(); public int? Order { get; set; } public UpsertTenantAdminRoleTemplateCommand ToCommand() { return new UpsertTenantAdminRoleTemplateCommand( Id, Code, Name, Description, BaseRole, Status, Permissions, MenuPermissions, ModulePermissions, FieldPermissions, DataScope, Order); } } public sealed class DisableTenantAdminRoleTemplateDto { [Required] public Guid RoleTemplateId { get; set; } } public sealed class UpsertTenantBrandingDto { public required string BrandName { get; set; } public string? ShortName { get; set; } public string? Slogan { get; set; } public string? OrganizationName { get; set; } public string? LogoUrl { get; set; } public string? FaviconUrl { get; set; } public string? ServiceWechat { get; set; } public string? ServiceAccountName { get; set; } public UpsertTenantBrandingCommand ToCommand() { return new UpsertTenantBrandingCommand( BrandName, ShortName, Slogan, OrganizationName, LogoUrl, FaviconUrl, ServiceWechat, ServiceAccountName); } } public sealed class UpsertTenantSettingsDto { public JsonElement FeatureFlags { get; set; } = JsonDefaults.Object(); public JsonElement AdminFeatureFlags { get; set; } = JsonDefaults.Object(); public JsonElement PublicConfig { get; set; } = JsonDefaults.Object(); public UpsertTenantSettingsCommand ToCommand() { return new UpsertTenantSettingsCommand(FeatureFlags, AdminFeatureFlags, PublicConfig); } } public sealed class PreviewTenantThemeDto { public required string TemplateCode { get; set; } public JsonElement Theme { get; set; } = JsonDefaults.Object(); public JsonElement PublicAssets { get; set; } = JsonDefaults.Object(); public PreviewTenantThemeCommand ToCommand() { return new PreviewTenantThemeCommand(TemplateCode, Theme, PublicAssets); } } public sealed class PublishTenantThemeDto { public bool? UseDraft { get; set; } public string? TemplateCode { get; set; } public JsonElement Theme { get; set; } = JsonDefaults.Object(); public JsonElement PublicAssets { get; set; } = JsonDefaults.Object(); public PublishTenantThemeCommand ToCommand() { return new PublishTenantThemeCommand(UseDraft ?? true, TemplateCode, Theme, PublicAssets); } } public sealed class CreateTenantDomainDto { public required string Host { get; set; } public string? DomainType { get; set; } public bool IsPrimary { get; set; } public CreateTenantDomainCommand ToCommand() { return new CreateTenantDomainCommand(Host, DomainType, IsPrimary); } } public sealed class UpsertTenantAuthProviderDto { public required string Provider { get; set; } public string? Status { get; set; } public string? DisplayName { get; set; } public JsonElement ConfigPublic { get; set; } = JsonDefaults.Object(); public UpsertTenantAuthProviderCommand ToCommand() { return new UpsertTenantAuthProviderCommand(Provider, Status, DisplayName, ConfigPublic); } }