public async Task <IActionResult> GetMergePolicies([Required] string repository, [Required] string branch)
        {
            if (string.IsNullOrEmpty(repository))
            {
                ModelState.TryAddModelError(nameof(repository), "The repository parameter is required");
            }

            if (string.IsNullOrEmpty(branch))
            {
                ModelState.TryAddModelError(nameof(branch), "The branch parameter is required");
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Data.Models.RepositoryBranch repoBranch = await Context.RepositoryBranches.FindAsync(repository, branch);

            if (repoBranch == null)
            {
                return(NotFound());
            }

            List <Data.Models.MergePolicyDefinition> policies =
                repoBranch.PolicyObject?.MergePolicies ?? new List <Data.Models.MergePolicyDefinition>();

            return(Ok(policies.Select(p => new MergePolicy(p))));
        }
        public async Task <IActionResult> GetHistory(string repository, string branch)
        {
            if (string.IsNullOrEmpty(repository))
            {
                ModelState.TryAddModelError(nameof(repository), "The repository parameter is required");
            }

            if (string.IsNullOrEmpty(branch))
            {
                ModelState.TryAddModelError(nameof(branch), "The branch parameter is required");
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Data.Models.RepositoryBranch repoBranch = await Context.RepositoryBranches.FindAsync(repository, branch);

            if (repoBranch == null)
            {
                return(NotFound());
            }

            IOrderedQueryable <RepositoryBranchUpdateHistoryEntry> query = Context.RepositoryBranchUpdateHistory
                                                                           .Where(u => u.Repository == repository && u.Branch == branch)
                                                                           .OrderByDescending(u => u.Timestamp);

            return(Ok(query));
        }
        public async Task <IActionResult> SetMergePolicies(
            [Required] string repository,
            [Required] string branch,
            [FromBody] IImmutableList <MergePolicy> policies)
        {
            if (string.IsNullOrEmpty(repository))
            {
                ModelState.TryAddModelError(nameof(repository), "The repository parameter is required");
            }

            if (string.IsNullOrEmpty(branch))
            {
                ModelState.TryAddModelError(nameof(branch), "The branch parameter is required");
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Data.Models.RepositoryBranch repoBranch = await GetRepositoryBranch(repository, branch);

            Data.Models.RepositoryBranch.Policy policy = repoBranch.PolicyObject ?? new Data.Models.RepositoryBranch.Policy();
            policy.MergePolicies    = policies?.Select(p => p.ToDb()).ToList() ?? new List <Data.Models.MergePolicyDefinition>();
            repoBranch.PolicyObject = policy;
            await Context.SaveChangesAsync();

            return(Ok());
        }
        public async Task <IActionResult> RetryActionAsync([Required] string repository, [Required] string branch, long timestamp)
        {
            if (string.IsNullOrEmpty(repository))
            {
                ModelState.TryAddModelError(nameof(repository), "The repository parameter is required");
            }

            if (string.IsNullOrEmpty(branch))
            {
                ModelState.TryAddModelError(nameof(branch), "The branch parameter is required");
            }

            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            DateTime ts = DateTimeOffset.FromUnixTimeSeconds(timestamp).UtcDateTime;

            Data.Models.RepositoryBranch repoBranch = await Context.RepositoryBranches.FindAsync(repository, branch);

            if (repoBranch == null)
            {
                return(NotFound());
            }

            RepositoryBranchUpdateHistoryEntry update = await Context.RepositoryBranchUpdateHistory
                                                        .Where(u => u.Repository == repository && u.Branch == branch)
                                                        .FirstOrDefaultAsync(u => Math.Abs(EF.Functions.DateDiffSecond(u.Timestamp, ts)) < 1);

            if (update == null)
            {
                return(NotFound());
            }

            if (update.Success)
            {
                return(StatusCode(
                           (int)HttpStatusCode.NotAcceptable,
                           new ApiError("That action was successful, it cannot be retried.")));
            }

            Queue.Post(
                async() =>
            {
                IPullRequestActor actor =
                    PullRequestActorFactory(PullRequestActorId.Create(update.Repository, update.Branch));
                await actor.RunActionAsync(update.Method, update.Arguments);
            });

            return(Accepted());
        }
        private async Task <Data.Models.RepositoryBranch> GetRepositoryBranch(string repository, string branch)
        {
            Data.Models.RepositoryBranch repoBranch = await Context.RepositoryBranches.FindAsync(repository, branch);

            if (repoBranch == null)
            {
                Context.RepositoryBranches.Add(
                    repoBranch = new Data.Models.RepositoryBranch
                {
                    RepositoryName = repository,
                    BranchName     = branch
                });
            }
            else
            {
                Context.RepositoryBranches.Update(repoBranch);
            }

            return(repoBranch);
        }
示例#6
0
 public RepositoryBranch(Data.Models.RepositoryBranch other)
 {
     Repository    = other.RepositoryName;
     Branch        = other.BranchName;
     MergePolicies = (other.PolicyObject?.MergePolicies ?? new List <Data.Models.MergePolicyDefinition>()).Select(p => new MergePolicy(p)).ToImmutableList();
 }