コード例 #1
0
 public Task <StoryResult> CreateStory(
     IOrganizationAccountManager organizationAccountManager,
     CreateStoryInput input
     )
 {
     return(CreateStoryInternal(input, organizationAccountManager.OrganizationId));
 }
コード例 #2
0
 public async Task <StoryResult> CreateStory(
     IOrganizationProjectManager pm,
     CreateStoryInput input
     )
 {
     return(await CreateStoryInternal(input, pm.OrganizationId));
 }
コード例 #3
0
 public Task <StoryResult> CreateStory(
     IProviderAgencyOwner agencyOwner,
     CreateStoryInput input
     )
 {
     return(CreateStoryInternal(input, agencyOwner.OrganizationId));
 }
コード例 #4
0
        public async Task <IActionResult> CreateStory(
            [FromRoute] Guid organizationId,
            [FromBody] CreateStoryInput input
            )
        {
            var story = await _storyService
                        .CreateStory(_accountManager, input);

            return(Ok(story));
        }
コード例 #5
0
        private async Task <StoryResult> CreateStoryInternal(CreateStoryInput input, Guid organizationId)
        {
            _logger.LogInformation(GetLogMessage("Org: {0}"), organizationId);

            var retVal = new StoryResult();

            var project = _projectService.Repository.Queryable()
                          .Include(x => x.Proposal)
                          .Where(x => x.Id == input.ProjectId && x.ProjectManagerOrganizationId == organizationId)
                          .FirstOrDefaultAsync();


            var existingStoryCount = Repository.Queryable()
                                     .CountAsync(x => x.ProjectId == input.ProjectId);

            await Task.WhenAll(project, existingStoryCount);

            if (project.Result == null)
            {
                retVal.ErrorMessage = "No project found";
                return(retVal);
            }

            _logger.LogDebug(GetLogMessage("Project: {0}; Status: {1}"), project.Result.Id, project.Result.Status);

            var story = new Story
            {
                Status                   = input.ContractorId.HasValue ? StoryStatus.Assigned : StoryStatus.Pending,
                StoryId                  = project.Result.Abbreviation + "-" + (existingStoryCount.Result + 1),
                ObjectState              = ObjectState.Added,
                StoryTemplateId          = input.TemplateId,
                StoryPoints              = input.StoryPoints,
                ContractorId             = input.ContractorId,
                ContractorOrganizationId = input.ContractorId.HasValue ? organizationId : (Guid?)null
            };

            switch (project.Result.Status)
            {
            case ProjectStatus.Active:

                story.CustomerAcceptanceDate = DateTimeOffset.UtcNow;
                story.Updated               = DateTimeOffset.UtcNow;
                story.ObjectState           = ObjectState.Modified;
                story.Status                = StoryStatus.Approved;
                story.CustomerApprovedHours = story.StoryPoints * project.Result.Proposal.EstimationBasis;

                break;
            }

            story.InjectFrom(input);

            story.StatusTransitions.Add(new StoryStatusTransition()
            {
                Status      = story.Status,
                ObjectState = ObjectState.Added
            });


            var storyRecords = Repository.Insert(story, true);

            _logger.LogDebug(GetLogMessage("{0} records updated in db."), storyRecords);

            if (storyRecords > 0)
            {
                retVal.StoryId   = story.Id;
                retVal.Succeeded = true;

                await Task.Run(() =>
                {
                    if (story.Status == StoryStatus.Pending)
                    {
                        RaiseEvent(new StoryCreatedEvent
                        {
                            StoryId = story.Id
                        });
                    }

                    if (story.ContractorId.HasValue)
                    {
                        RaiseEvent(new StoryAssignedEvent()
                        {
                            StoryId = story.Id
                        });
                    }

                    if (story.Status == StoryStatus.Approved)
                    {
                        RaiseEvent(new StoryApprovedEvent()
                        {
                            StoryId = story.Id
                        });
                    }
                });
            }

            return(retVal);
        }