Пример #1
0
        public async Task ApplyRuleChanges(RuleDescription[] newRules, RuleDescription[] existingRules, string[] messagesTypes)
        {
            var newRulesAlreadyPresent = new List <Rule>();

            foreach (var newRuleDescription in newRules)
            {
                var existingRulesWithSameName = new List <Rule>();

                foreach (var ruleDescription in existingRules)
                {
                    var oldRule = GetRuleVersion(ruleDescription);
                    var newRule = GetRuleVersion(newRuleDescription);

                    if (oldRule.RuleDescription.Name == newRule.RuleDescription.Name)
                    {
                        existingRulesWithSameName.Add(oldRule);
                        break;
                    }

                    if (oldRule.Name == newRule.Name && oldRule.Version >= newRule.Version)
                    {
                        existingRulesWithSameName.Add(oldRule);
                        break;
                    }
                }

                if (!existingRulesWithSameName.Any())
                {
                    continue;
                }

                newRulesAlreadyPresent.Add(GetRuleVersion(newRuleDescription));

                if (((SqlFilter)existingRulesWithSameName.First().RuleDescription.Filter).SqlExpression !=
                    ((SqlFilter)newRuleDescription.Filter).SqlExpression)
                {
                    throw new InvalidOperationException("Message types inside the assembly have changed, but the assembly version number has not.");
                }
            }

            if (newRulesAlreadyPresent.Count < newRules.Length)
            {
                foreach (var newRule in GetNewRulesNotAlreadyPresent(newRules, newRulesAlreadyPresent.Select(x => x.RuleDescription.Name)))
                {
                    await _ruleApplier.AddRule(newRule).ConfigureAwait(false);
                }
            }

            foreach (var existingRule in GetOutdatedExistingRules(existingRules, newRules))
            {
                await _ruleApplier.RemoveRule(existingRule).ConfigureAwait(false);
            }
        }