using BuildingBlock.Catalog.Contracts.Conventions; using BuildingBlock.Catalog.Contracts.Products; using BuildingBlock.Catalog.Contracts.Responses; using BuildingBlock.Inventory.Contracts.Conventions; using BuildingBlock.Inventory.Contracts.Requests; using BuildingBlock.Inventory.Contracts.Responses; using Furniture.Domain.Contracts; namespace Furniture.Domain.Decisions; /// /// Default domain implementation for furniture availability composition decisions. /// public sealed class FurnitureAvailabilityDecisionService : IFurnitureAvailabilityDecisionService { private const string ContractVersion = "1.0.0"; /// public InventoryItemLookupRequest BuildInventoryRequest(FurnitureAvailabilityDecisionRequest request) { return new InventoryItemLookupRequest( new InventoryContractEnvelope(ContractVersion, ResolveCorrelationId(request.CorrelationId)), request.FurnitureId); } /// public ProductContract BuildCatalogRequest(FurnitureAvailabilityDecisionRequest request) { return new ProductContract( new CatalogContractEnvelope(ContractVersion, ResolveCorrelationId(request.CorrelationId)), request.FurnitureId, string.Empty); } /// public FurnitureAvailabilityDecisionResponse ComposeResponse( FurnitureAvailabilityDecisionRequest request, ProductContractResponse catalogResponse, InventoryItemLookupResponse inventoryResponse) { return new FurnitureAvailabilityDecisionResponse( request.FurnitureId, catalogResponse.DisplayName, inventoryResponse.QuantityAvailable); } private static string ResolveCorrelationId(string correlationId) { if (!string.IsNullOrWhiteSpace(correlationId)) { return correlationId; } return $"corr-{Guid.NewGuid():N}"; } }