/// <summary> /// In this mode, the Booking Engine also handles generation of open data feeds and the dataset site /// /// Note this is also the mode used by the StoreBookingEngine /// /// In order to use RenderDatasetSite, DatasetSiteGeneratorSettings must be provided /// </summary> /// <param name="settings"></param> /// <param name="datasetSettings"></param> public CustomBookingEngine(BookingEngineSettings settings, DatasetSiteGeneratorSettings datasetSettings) : this(settings, datasetSettings?.OpenBookingAPIBaseUrl, datasetSettings?.OpenDataFeedBaseUrl) { if (datasetSettings == null) { throw new ArgumentNullException(nameof(datasetSettings)); } this.datasetSettings = datasetSettings; }
/// <summary> /// In this mode, the Booking Engine does not handle open data feeds or dataset site rendering, and these must both be handled manually /// </summary> /// <param name="settings"></param> /// <param name="openBookingAPIBaseUrl"></param> public CustomBookingEngine(BookingEngineSettings settings, Uri openBookingAPIBaseUrl) { if (settings == null) { throw new ArgumentNullException(nameof(settings)); } if (openBookingAPIBaseUrl == null) { throw new ArgumentNullException(nameof(openBookingAPIBaseUrl)); } this.settings = settings; }
public CustomBookingEngine(BookingEngineSettings settings, Uri openBookingAPIBaseUrl, Uri openDataFeedBaseUrl) : this(settings, openBookingAPIBaseUrl) { // Check constructor configuration is correct if (openDataFeedBaseUrl == null) { throw new ArgumentNullException(nameof(openDataFeedBaseUrl)); } if (settings.OpenDataFeeds == null) { throw new ArgumentNullException("settings.OpenDataFeeds"); } // Check Seller configuration is provided if (settings.SellerStore == null || settings.SellerIdTemplate == null) { throw new EngineConfigurationException("SellerStore and SellerIdTemplate must be specified in BookingEngineSettings"); } this.openDataFeedBaseUrl = openDataFeedBaseUrl; foreach (var idConfiguration in settings.IdConfiguration) { idConfiguration.RequiredBaseUrl = settings.JsonLdIdBaseUrl; } settings.OrderIdTemplate.RequiredBaseUrl = settings.OrderBaseUrl; settings.SellerIdTemplate.RequiredBaseUrl = settings.JsonLdIdBaseUrl; // Create a lookup of each IdTemplate to pass into the appropriate RpdeGenerator // TODO: Output better error if there is a feed assigned across two templates // (there should never be, as each template represents everyting you need in one feed) this.feedAssignedTemplates = settings.IdConfiguration.Select(t => t.IdConfigurations.Select(x => new { assignedFeed = x.AssignedFeed, bookablePairIdTemplate = t })).SelectMany(x => x.ToList()).ToDictionary(k => k.assignedFeed, v => v.bookablePairIdTemplate); // Create a lookup for the purposes of finding arbitary IdConfigurations, for use in the store // TODO: Pull this and the above into a function? this.OpportunityTemplateLookup = settings.IdConfiguration.Select(t => t.IdConfigurations.Select(x => new { opportunityType = x.OpportunityType, bookablePairIdTemplate = t })).SelectMany(x => x.ToList()).ToDictionary(k => k.opportunityType, v => v.bookablePairIdTemplate); // Setup each RPDEFeedGenerator with the relevant settings, including the relevant IdTemplate inferred from the config foreach (var kv in settings.OpenDataFeeds) { kv.Value.SetConfiguration(OpportunityTypes.Configurations[kv.Key], settings.JsonLdIdBaseUrl, settings.RPDEPageSize, this.feedAssignedTemplates[kv.Key], settings.SellerIdTemplate, openDataFeedBaseUrl); } settings.OrderFeedGenerator.SetConfiguration(settings.RPDEPageSize, settings.OrderIdTemplate, settings.SellerIdTemplate, settings.OrdersFeedUrl); settings.SellerStore.SetConfiguration(settings.SellerIdTemplate); // Create a dictionary of RPDEFeedGenerator indexed by FeedPath this.feedLookup = settings.OpenDataFeeds.Values.ToDictionary(x => x.FeedPath); // Set supportedFeeds locally for use by dataset site this.supportedFeeds = settings.OpenDataFeeds.Keys.ToList(); // Check that OpenDataFeeds match IdConfiguration if (supportedFeeds.Except(feedAssignedTemplates.Keys).Any() || feedAssignedTemplates.Keys.Except(supportedFeeds).Any()) { throw new ArgumentException("Feeds configured in OpenDataFeeds must match those in IdConfiguration"); } // Setup array of types for lookup of OrderItem, based on the type string that will be supplied with the opportunity this.idConfigurationLookup = settings.IdConfiguration.Select(t => t.IdConfigurations.Select(x => new { // TODO: Create an extra prop in DatasetSite lib so that we don't need to parse the URL here opportunityTypeName = OpportunityTypes.Configurations[x.OpportunityType].SameAs.AbsolutePath.Trim('/'), bookablePairIdTemplate = t })).SelectMany(x => x.ToList()) .GroupBy(g => g.opportunityTypeName) .ToDictionary(k => k.Key, v => v.Select(y => y.bookablePairIdTemplate).ToList()); }