Example #1
0
        public async Task <MergePolicyEvaluationResult> EvaluateAsync(
            string prUrl,
            IRemote darc,
            IReadOnlyList <MergePolicyDefinition> policyDefinitions)
        {
            var context = new MergePolicyEvaluationContext(prUrl, darc);

            foreach (MergePolicyDefinition definition in policyDefinitions)
            {
                if (MergePolicies.TryGetValue(definition.Name, out MergePolicy policy))
                {
                    using (Logger.BeginScope("Evaluating Merge Policy {policyName}", policy.Name))
                    {
                        context.CurrentPolicy = policy;
                        await policy.EvaluateAsync(context, new MergePolicyProperties(definition.Properties));
                    }
                }
                else
                {
                    context.CurrentPolicy = null;
                    context.Fail($"Unknown Merge Policy: '{definition.Name}'");
                }
            }

            return(context.Result);
        }
Example #2
0
        public async Task <IActionResult> MergePolicies([FromBody] MergePolicies merge)
        {
            var scope = AuthenticationService.GetScope(User);

            var result = await PolicyService.MergePolicies(scope, merge);

            if (!result.Success)
            {
                return(BadRequest(result.ValidationFailures));
            }

            return(Ok(result));
        }
        public async Task MergePolicies()
        {
            var policy = new PolicyEdit()
            {
                Id = Guid.NewGuid(),
            };
            var merge = new MergePolicies()
            {
                TargetPolicy    = policy,
                SourcePolicyIds = new List <Guid>()
                {
                    Guid.NewGuid(), Guid.NewGuid()
                }
            };

            var service     = new Mock <IPolicyService>();
            var authService = TestHelper.MockAuthenticationService(Scope.Branch);

            var result = new Result()
            {
                Success = true
            };

            ScopeOptions  options = null;
            MergePolicies merged  = null;

            service.Setup(c => c.MergePolicies(It.IsAny <ScopeOptions>(), It.Is <MergePolicies>(m => m == merge)))
            .Callback((ScopeOptions o, MergePolicies m) =>
            {
                merged  = m;
                options = o;
            })
            .ReturnsAsync(result);

            var controller = new MergeController(null, service.Object, authService.Object);

            var actual = await controller.MergePolicies(merge);

            Assert.Same(merge, merged);
            Assert.Equal(Scope.Branch, options.Scope);

            var okResult    = Assert.IsType <OkObjectResult>(actual);
            var returnValue = Assert.IsType <Result>(okResult.Value);

            Assert.Same(result, returnValue);
        }
Example #4
0
        public async Task <Result> MergePolicies(ScopeOptions scope, MergePolicies merge)
        {
            var clientValidator = new PolicyValidator(_context, scope, true);
            var result          = clientValidator.Validate(merge.TargetPolicy, ruleSet: "default").GetResult();

            if (!result.Success)
            {
                return(result);
            }

            var mergeValidator = new MergePoliciesValidator(_context, scope);

            result = mergeValidator.Validate(merge).GetResult();

            if (!result.Success)
            {
                return(result);
            }

            var strategy = _context.Database.CreateExecutionStrategy();

            result = await strategy.ExecuteAsync <Result>(async() =>
            {
                using (var transaction = _context.Database.BeginTransaction())
                {
                    try
                    {
                        //Insert the 'new' policy
                        var entity = MapModelToEntity(merge.TargetPolicy);
                        await _context.Policy.AddAsync(entity);
                        await _context.SaveChangesAsync();

                        merge.TargetPolicy.Id = entity.Id;

                        //Move dependancies to the new policy ----------------------------------------------------

                        //1. Commissions
                        var commmissions = await _context.Commission.Where(p => merge.SourcePolicyIds.Contains(p.PolicyId)).ToListAsync();
                        foreach (var commmission in commmissions)
                        {
                            commmission.PolicyId = merge.TargetPolicy.Id.Value;
                        }

                        //2. Commission Errors
                        var commissionErrors = await _context.CommissionError.Where(c => merge.SourcePolicyIds.Contains(c.PolicyId.Value)).ToListAsync();
                        foreach (var commissionError in commissionErrors)
                        {
                            commissionError.PolicyId = merge.TargetPolicy.Id.Value;
                        }

                        //3. Commission Split Rule Policies
                        var commissionSplitRulePolicies = await _context.CommissionSplitRulePolicy.Where(c => merge.SourcePolicyIds.Contains(c.PolicyId)).ToListAsync();
                        foreach (var commissionSplitRulePolicy in commissionSplitRulePolicies)
                        {
                            commissionSplitRulePolicy.PolicyId = merge.TargetPolicy.Id.Value;
                        }

                        //4. Commission Allocation Policies
                        var commissionAllocationPolicies = await _context.CommissionAllocationPolicy.Where(c => merge.SourcePolicyIds.Contains(c.PolicyId)).ToListAsync();
                        foreach (var commissionAllocationPolicy in commissionAllocationPolicies)
                        {
                            commissionAllocationPolicy.PolicyId = merge.TargetPolicy.Id.Value;
                        }

                        await _context.SaveChangesAsync();
                        //----------------------------------------------------------------------------------------

                        //Delete 'old' policies
                        var policiesToDelete = await _context.Policy.Where(m => merge.SourcePolicyIds.Contains(m.Id)).ToListAsync();
                        foreach (var policyToDelete in policiesToDelete)
                        {
                            _context.Remove(policyToDelete);
                        }
                        await _context.SaveChangesAsync();

                        //Commit
                        await transaction.CommitAsync();

                        return(new Result(true));
                    }
                    catch
                    {
                        transaction.Rollback();
                        return(new Result(false));
                    }
                }
            });

            result.Tag = merge.TargetPolicy;

            await _auditService.InsertAuditLog(scope, "Merge", "Policy", merge.TargetPolicy.Id, merge);

            return(result);
        }