using ControlPlane.Core.Models; namespace ControlPlane.Core.Messages; /// API -> Worker: kick off the saga. public record ProvisionClientCommand { public Guid JobId { get; init; } public string ClientName { get; init; } = string.Empty; public string StateCode { get; init; } = string.Empty; public string Subdomain { get; init; } = string.Empty; public string AdminEmail { get; init; } = string.Empty; public string SiteCode { get; init; } = string.Empty; public string Environment { get; init; } = "fdev"; public TenantTier Tier { get; init; } = TenantTier.Shared; } /// Worker -> API/Gateway: one log event per saga step transition. public record ProvisioningProgressEvent { public Guid JobId { get; init; } public string Type { get; init; } = string.Empty; // step_started | step_complete | step_failed | job_complete | job_failed | diagnostic | compensation_started | compensation_complete public string? Step { get; init; } public string? Message { get; init; } /// Full exception string (stack trace) for diagnostic events. public string? Detail { get; init; } public DateTimeOffset Timestamp { get; init; } = DateTimeOffset.UtcNow; } /// Worker -> Gateway: published once when a job completes successfully. Triggers route registration. public record TenantProvisionedEvent { public Guid JobId { get; init; } public string Subdomain { get; init; } = string.Empty; public TenantTier Tier { get; init; } /// Base URL of the API instance for this tenant. For Shared/Isolated this is the shared API. For Dedicated it is the per-tenant instance. public string ApiBaseUrl { get; init; } = string.Empty; }