/// <summary> /// Gets the list of compatible templates /// </summary> /// <param name="configuration"> /// The configuration to check /// </param> /// <param name="context"> /// The configuration data context /// </param> /// <returns> /// The list of compatible templates /// </returns> public static IEnumerable <CompatibleTemplate> GetCompatibleTemplates( this Configuration configuration, ConfigurationContext context) { if (configuration?.Settings?.NodeTemplates == null) { yield break; } var currentConfiguration = context.Configurations.Include(nameof(Configuration.CompatibleTemplatesBackward)) .FirstOrDefault(r => r.State == EnConfigurationState.Active); if (currentConfiguration?.Settings?.NodeTemplates == null) { yield break; } foreach (var template in currentConfiguration.Settings.NodeTemplates) { var currentTemplate = configuration.Settings.NodeTemplates.FirstOrDefault(t => t.Code == template.Code); if (currentTemplate == null) { continue; } if (currentTemplate.Configuration != template.Configuration) { continue; } var oldRequirements = string.Join( "; ", template.PackageRequirements.OrderBy(p => p.Id).Select(p => $"{p.Id} {p.SpecificVersion}")); var newRequirements = string.Join( "; ", template.PackageRequirements.OrderBy(p => p.Id).Select(p => $"{p.Id} {p.SpecificVersion}")); if (oldRequirements != newRequirements) { continue; } var needPackageUpdate = false; foreach (var requirement in currentTemplate.PackageRequirements.Where(r => r.SpecificVersion == null)) { var oldVersion = configuration.Settings.Packages.FirstOrDefault(p => p.Id == requirement.Id); var newVersion = currentConfiguration.Settings.Packages.FirstOrDefault(p => p.Id == requirement.Id); if (newVersion == null || oldVersion?.Version != newVersion.Version) { needPackageUpdate = true; break; } } if (needPackageUpdate) { continue; } yield return (new CompatibleTemplate { CompatibleConfigurationId = currentConfiguration.Id, ConfigurationId = configuration.Id, TemplateCode = template.Code }); foreach ( var compatible in currentConfiguration.CompatibleTemplatesBackward.Where(ct => ct.TemplateCode == template.Code)) { yield return (new CompatibleTemplate { CompatibleConfigurationId = compatible.CompatibleConfigurationId, ConfigurationId = configuration.Id, TemplateCode = template.Code }); } } }