Files
tiku-backend.net/Tiku.Api/Contracts/PlatformAdminDtos.cs

285 lines
7.4 KiB
C#

using System.ComponentModel.DataAnnotations;
using System.Text.Json;
using Tiku.Application.PlatformAdmin;
using Tiku.Domain.Common;
using Tiku.Domain.Commerce;
using Tiku.Domain.Identity;
using Tiku.Domain.Platform;
using Tiku.Domain.Tenancy;
namespace Tiku.Api.Contracts;
public sealed class PlatformAdminQueryDto
{
[StringLength(32)]
public string? Status { get; set; }
[StringLength(200)]
public string? Search { get; set; }
[Range(1, 200)]
public int? Limit { get; set; }
public PlatformAdminQuery ToQuery() => new(Status, Search, Limit);
}
public sealed class CreatePlatformTenantDto
{
[Required]
[StringLength(100)]
public string Slug { get; set; } = string.Empty;
[Required]
[StringLength(200)]
public string Name { get; set; } = string.Empty;
[StringLength(300)]
public string? LegalName { get; set; }
public TenantStatus Status { get; set; } = TenantStatus.Active;
public BillingStatus BillingStatus { get; set; } = BillingStatus.Trial;
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
public CreatePlatformTenantCommand ToCommand() => new(Slug, Name, LegalName, Status, BillingStatus, Metadata);
}
public sealed class UpdatePlatformTenantStatusDto
{
[Required]
public Guid TenantId { get; set; }
public TenantStatus Status { get; set; } = TenantStatus.Active;
public BillingStatus BillingStatus { get; set; } = BillingStatus.Active;
[StringLength(1000)]
public string? Reason { get; set; }
public UpdatePlatformTenantStatusCommand ToCommand() => new(TenantId, Status, BillingStatus, Reason);
}
public sealed class UpsertPlatformTenantBillingProfileDto
{
[Required]
public Guid TenantId { get; set; }
[StringLength(300)]
public string? BillingName { get; set; }
[StringLength(100)]
public string? TaxId { get; set; }
[StringLength(100)]
public string? ContactName { get; set; }
[StringLength(32)]
public string? ContactPhone { get; set; }
[StringLength(320)]
public string? ContactEmail { get; set; }
[StringLength(1000)]
public string? BillingAddress { get; set; }
[StringLength(300)]
public string? InvoiceTitle { get; set; }
public TenantInvoiceTitleType? InvoiceType { get; set; }
[StringLength(300)]
public string? BankName { get; set; }
[StringLength(100)]
public string? BankAccountMasked { get; set; }
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
public UpsertPlatformTenantBillingProfileCommand ToCommand() => new(
TenantId,
BillingName,
TaxId,
ContactName,
ContactPhone,
ContactEmail,
BillingAddress,
InvoiceTitle,
InvoiceType,
BankName,
BankAccountMasked,
Metadata);
}
public sealed class UpsertPlatformSubscriptionDto
{
[Required]
public Guid TenantId { get; set; }
[Required]
[StringLength(100)]
public string PlanCode { get; set; } = string.Empty;
public TenantSubscriptionStatus Status { get; set; } = TenantSubscriptionStatus.Active;
public DateTimeOffset? StartsAt { get; set; }
public DateTimeOffset? ExpiresAt { get; set; }
[StringLength(32)]
public string? BillingCycle { get; set; }
[Range(0, int.MaxValue)]
public int AmountCents { get; set; }
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
public UpsertPlatformSubscriptionCommand ToCommand() => new(
TenantId,
PlanCode,
Status,
StartsAt,
ExpiresAt,
BillingCycle,
AmountCents,
Metadata);
}
public sealed class ReplacePlatformPlanModulesDto
{
[Required]
public IReadOnlyCollection<string> ModuleCodes { get; set; } = [];
public ReplacePlatformPlanModulesCommand ToCommand(string planCode) => new(planCode, ModuleCodes);
}
public sealed class UpsertPlatformTenantModuleOverrideDto
{
public TenantModuleOverrideMode Mode { get; set; }
public DateTimeOffset? ExpiresAt { get; set; }
[Required]
[StringLength(1000, MinimumLength = 1)]
public string Reason { get; set; } = string.Empty;
public UpsertPlatformTenantModuleOverrideCommand ToCommand(Guid tenantId, string moduleCode) =>
new(tenantId, moduleCode, Mode, ExpiresAt, Reason);
}
public sealed class UpsertPlatformStaffDto
{
public Guid? UserId { get; set; }
[StringLength(320)]
public string? Email { get; set; }
[StringLength(32)]
public string? Phone { get; set; }
[StringLength(200)]
public string? Name { get; set; }
public UserStatus Status { get; set; } = UserStatus.Active;
public IReadOnlyCollection<Guid> RoleIds { get; set; } = [];
public UpsertPlatformStaffCommand ToCommand() => new(UserId, Email, Phone, Name, Status, RoleIds);
}
public sealed class UpdatePlatformStaffStatusDto
{
[Required]
public Guid UserId { get; set; }
public UserStatus Status { get; set; } = UserStatus.Active;
[StringLength(1000)]
public string? Reason { get; set; }
public UpdatePlatformStaffStatusCommand ToCommand() => new(UserId, Status, Reason);
}
public sealed class UpdatePlatformAuditAlertStatusDto
{
[Required]
public Guid AlertId { get; set; }
public PlatformAuditAlertStatus Status { get; set; } = PlatformAuditAlertStatus.Acknowledged;
[StringLength(1000)]
public string? ResolutionNote { get; set; }
public UpdatePlatformAuditAlertStatusCommand ToCommand() => new(AlertId, Status, ResolutionNote);
}
public sealed class UpsertPlatformDunningChannelDto
{
public Guid? ChannelId { get; set; }
[Required]
[StringLength(100)]
public string ChannelCode { get; set; } = string.Empty;
[Required]
[StringLength(200)]
public string Name { get; set; } = string.Empty;
[StringLength(1000)]
public string? Description { get; set; }
public bool Enabled { get; set; } = true;
public PlatformDunningProvider Provider { get; set; } = PlatformDunningProvider.Generic;
[Required]
[StringLength(2048)]
public string WebhookUrl { get; set; } = string.Empty;
[StringLength(300)]
public string? SecretRef { get; set; }
public IReadOnlyCollection<string> ReminderTypes { get; set; } = ["overdue", "final_notice"];
public IReadOnlyCollection<string> ReminderChannels { get; set; } = ["internal"];
[Range(1, 20)]
public int MinReminderLevel { get; set; } = 1;
public IReadOnlyCollection<Guid> TenantIds { get; set; } = [];
[Range(1, 60)]
public int TimeoutSeconds { get; set; } = 10;
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
public UpsertPlatformDunningChannelCommand ToCommand() => new(
ChannelId,
ChannelCode,
Name,
Description,
Enabled,
Provider,
WebhookUrl,
SecretRef,
ReminderTypes,
ReminderChannels,
MinReminderLevel,
TenantIds,
TimeoutSeconds,
Metadata);
}
public sealed class DisablePlatformDunningChannelDto
{
[Required]
public Guid ChannelId { get; set; }
[StringLength(1000)]
public string? Reason { get; set; }
public DisablePlatformDunningChannelCommand ToCommand() => new(ChannelId, Reason);
}
public sealed class RetryPlatformDunningEventDto
{
[Required]
public Guid EventId { get; set; }
[StringLength(1000)]
public string? Reason { get; set; }
public RetryPlatformDunningEventCommand ToCommand() => new(EventId, Reason);
}