namespace GB5Shared.DTO.Promotion { // ============================================================ // PromotionBridgeDTOs — wire shapes for the cross-host Promotion bridge. // // GOP's own execution pipeline (GopWorkerService/GopExecutionPipeline) runs only inside // FrameworkSL's own standalone process. Every IPromotableEntity implementation built before // this bridge lived inside GB5Framework itself, so PromotionBLL could resolve it directly via // GetKeyedService in the same process. Entities owned by any other module // (TMS/TMSSL -> HRFinanceHost, CMS/CMSSL -> EngagementHost, etc.) live in a genuinely separate // process with no DI container overlap — there is no way to constructor-inject e.g. // ITrainingProgrammeBLL from FrameworkBLL without FrameworkBLL taking a ProjectReference on // TMSBLL (inverting the intended dependency direction and dragging TMS's own FLS/Assessment/ // Certificate dependency chain into the core framework host). // // The bridge instead lets each owning module expose its OWN local IPromotableEntity // implementations (registered locally via the exact same keyed-DI pattern FrameworkSL already // uses) behind three small HTTP endpoints on that module's own host, and FrameworkBLL's // RemoteHttpPromotionAdapter calls them over HTTP — the same "separate process, reached only // over HTTP, Login header carries identity" pattern already proven by JobEngineScheduleClient // (AutomationBLL -> JobEngine host) and the "entitlement-internal"/"eip-internal" named // HttpClients in FrameworkSL/Program.cs (both documented there for the exact same reason: a // PlatformHost-consolidated module has no shared DI container with this Framework host). // ============================================================ public class PromotionBridgeExportRequestDTO { public string EntityTypeCode { get; set; } = string.Empty; public int OriginEntityId { get; set; } } public class PromotionBridgeImportRequestDTO { public PromotionBundleDTO Bundle { get; set; } = new(); public byte DestinationSourceType { get; set; } public int? ExistingDestinationId { get; set; } } }