using PartnerDAL.DTO.ClientDomain; using PartnerDAL.DTO.Partner; using PartnerDAL.DTO.PartnerApiKey; using PartnerDAL.DTO.PartnerBrand; using PartnerDAL.DTO.PartnerProduct; using PartnerDAL.DTO.PartnerTerm; using PartnerDAL.DTO.PartnerWebhook; namespace PartnerDAL.DTO.PartnerSetup { // One request bundling every table a full white-labeling setup touches. Every section // is REQUIRED — nothing here is skipped or defaulted; the orchestrator writes to all 9 // real per-partner tables (TPARTNER, TPARTNERPRODUCT, TPARTNERBRAND, MCLIENTDETAILS, // TPARTNERPRODUCTBRAND, TPARTNERTERM (at least 1 entry), TPARTNERAPIKEY, TCLIENTDOMAIN, // TPARTNERWEBHOOK) on every call. IDs on each nested DTO are ignored/overwritten by the // orchestrator as it wires PartnerId/PartnerProductId from earlier steps into later // ones — callers should not pre-fill them, but every OTHER field on each DTO must be // supplied. // // Not included even as required fields: MSERVERCONFIG (Table 1 — must already exist, // created separately via RegisterConnection/OnboardClient, since ConnectionName/ // DatabaseName provisioning is a distinct concern from partner branding), MFILE (files // are uploaded separately via the framework upload endpoint; only the resulting FileId // is referenced here), and TPLATFORMSETTINGS (a global, one-time platform setting, not // a per-partner value). public class PartnerSetupDTO { // Table 3: TPARTNER public PartnerDTO Partner { get; set; } = new(); // Table 4: TPARTNERPRODUCT public PartnerProductDTO PartnerProduct { get; set; } = new(); // Table 5: TPARTNERBRAND public PartnerBrandDTO PartnerBrand { get; set; } = new(); // Table 2 (MCLIENTDETAILS): the ClientId/ClientSiteId that gets a row created (if // missing) and PartnerProductId assigned. The MSERVERCONFIG row for this ClientId // must already exist — see RegisterConnection. public int ClientId { get; set; } public int ClientSiteId { get; set; } // Table 6: TPARTNERPRODUCTBRAND (per-product brand override) public PartnerProductBrandDTO PartnerProductBrand { get; set; } = new(); // Table 7: TPARTNERTERM — at least one term is required (list must be non-empty) public List PartnerTerms { get; set; } = new(); // Table 9: TPARTNERAPIKEY (M2M API access) public PartnerApiKeyDTO PartnerApiKey { get; set; } = new(); // Table 10: TCLIENTDOMAIN (custom domain) public ClientDomainDTO ClientDomain { get; set; } = new(); // Table 11: TPARTNERWEBHOOK — at least one webhook is required (list must be non-empty) public List PartnerWebhooks { get; set; } = new(); } // Reports exactly what happened per table — no silent partial success. Every field // that was attempted is populated; fields for skipped optional sections stay null. public class PartnerSetupResultDTO { public int? PartnerId { get; set; } public int? PartnerProductId { get; set; } public int? PartnerBrandId { get; set; } public bool ClientDetailCreatedOrExisted { get; set; } public bool PartnerProductAssigned { get; set; } public int? PartnerProductBrandId { get; set; } public List? PartnerTermIds { get; set; } public int? PartnerApiKeyId { get; set; } public int? ClientDomainId { get; set; } public List? PartnerWebhookIds { get; set; } public List Messages { get; set; } = new(); } }