Ejemplo n.º 1
0
        public override Hash ProposeDevelopersAudition(ProposeAuditionInput input)
        {
            var projectInfo = State.Projects[input.ProjectId].Clone();

            if (projectInfo == null)
            {
                throw new AssertionException("Project not found.");
            }

            Assert(projectInfo.Status == ProjectStatus.Taken, "Project needs to be taken.");
            var developerOrganizationAddress = State.DeveloperOrganizationAddress[input.ProjectId];
            // ReSharper disable once PossibleNullReferenceException
            var targetBudgetPlan = projectInfo.BudgetPlans.Single(p => p.Index == input.BudgetPlanIndex);

            targetBudgetPlan.IsApprovedByDevelopers = true;
            var newProjectInfo = new ProjectInfo
            {
                PullRequestUrl         = projectInfo.PullRequestUrl,
                CommitId               = projectInfo.CommitId,
                CurrentBudgetPlanIndex = projectInfo.CurrentBudgetPlanIndex,
                PreAuditionHash        = projectInfo.PreAuditionHash,
                Status      = ProjectStatus.Taken,
                BudgetPlans = { targetBudgetPlan }
            };
            var proposalId = CreateProposalToDeveloperOrganization(developerOrganizationAddress,
                                                                   nameof(UpdateBountyProject), newProjectInfo.ToByteString());

            return(proposalId);
        }
Ejemplo n.º 2
0
        public override Hash ProposeDeliver(ProposeAuditionInput input)
        {
            var projectInfo = State.Projects[input.ProjectId];

            if (projectInfo == null)
            {
                throw new AssertionException("Project not found.");
            }

            if (projectInfo.ProjectType == ProjectType.Grant)
            {
                Assert(projectInfo.Status == ProjectStatus.Ready, "Project not ready.");
            }

            if (projectInfo.ProjectType == ProjectType.Bounty)
            {
                Assert(projectInfo.Status == ProjectStatus.Taken, "Project not taken.");
            }

            Assert(projectInfo.CurrentBudgetPlanIndex == input.BudgetPlanIndex,
                   "Incorrect budget plan index.");

            var newProjectInfo = new ProjectInfo
            {
                PullRequestUrl         = projectInfo.PullRequestUrl,
                CommitId               = projectInfo.CommitId,
                CurrentBudgetPlanIndex = input.BudgetPlanIndex.Add(1),
                Status = projectInfo.BudgetPlans.Select(p => p.Index).OrderBy(p => p).Last() == input.BudgetPlanIndex
                    ? ProjectStatus.Delivered
                    : projectInfo.ProjectType == ProjectType.Grant
                        ? ProjectStatus.Ready
                        : ProjectStatus.Taken,
                BudgetPlans = { projectInfo.BudgetPlans.Single(p => p.Index == input.BudgetPlanIndex) }
            };

            if (projectInfo.ProjectType == ProjectType.Bounty && projectInfo.IsDevelopersAuditionRequired)
            {
                Assert(projectInfo.BudgetPlans.All(p => p.IsApprovedByDevelopers),
                       "Project budget plans need to approved by developers before deliver.");
            }

            var budgetPlan = newProjectInfo.BudgetPlans.SingleOrDefault(p => p.Index == input.BudgetPlanIndex);

            Assert(budgetPlan != null, "Budget Plan not found.");
            // ReSharper disable once PossibleNullReferenceException
            budgetPlan.DeliverPullRequestUrl = input.DeliverPullRequestUrl;
            budgetPlan.DeliverCommitId       = input.DeliverCommitId;
            var proposalId =
                CreateProposalToSelf(
                    projectInfo.ProjectType == ProjectType.Grant
                        ? nameof(UpdateGrantProject)
                        : nameof(UpdateBountyProject), newProjectInfo.ToByteString());

            return(proposalId);
        }