private async Task <StoryResult> UpdateStoryInternal(Guid storyId, UpdateStoryInput input)
        {
            var retVal = new StoryResult {
                StoryId = storyId
            };

            var entity = await Repository
                         .FirstOrDefaultAsync(x => x.Id == storyId);

            entity.InjectFrom(input);

            entity.Updated     = DateTimeOffset.UtcNow;
            entity.ObjectState = ObjectState.Modified;

            var records = await Repository.UpdateAsync(entity, true);

            _logger.LogDebug(GetLogMessage("{0} Records updated"), records);


            if (records > 0)
            {
                retVal.Succeeded = true;
                await Task.Run(() =>
                {
                    RaiseEvent(new StoryUpdatedEvent
                    {
                        StoryId = storyId
                    });
                });
            }

            return(retVal);
        }
        private async Task <StoryResult> DeleteStoryInternal(Guid storyId)
        {
            _logger.LogInformation(GetLogMessage("Story: {0}"), storyId);
            var retVal = new StoryResult {
                StoryId = storyId
            };

            var entity = await Repository.FirstOrDefaultAsync(x => x.Id == storyId);

            entity.IsDeleted = true;
            entity.Updated   = DateTimeOffset.UtcNow;

            var result = await Repository.UpdateAsync(entity, true);

            _logger.LogDebug(GetLogMessage("{0} results updated"), result);

            if (result > 0)
            {
                retVal.Succeeded = true;
                await Task.Run(() =>
                {
                    RaiseEvent(new StoryDeletedEvent
                    {
                        StoryId = storyId
                    });
                });
            }

            return(retVal);
        }
        public async Task <ActionResult <StoryResult> > Related(int id)
        {
            var card = await _meredithDbContext.Cards.FirstOrDefaultAsync(c => c.Id == id);

            if (card is null)
            {
                return(NotFound());
            }

            var result = new StoryResult(card.Id, card.Text, card.CallToAction, card.CallToActionUrl,
                                         card.BackgroundUrl, card.PosterUrl, card.CardType);

            return(Ok(result));
        }
Esempio n. 4
0
        public async Task <IStoryResult> Play(IStory story, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (cancellationToken == default(CancellationToken))
            {
                cancellationToken = new CancellationTokenSource(TimeSpan.FromMinutes(5)).Token;
            }

            var steps = story.StoryFrames.Select(sf => new StoryPlayerStep
            {
                StoryFrame = sf,
                Status     = StoryPlayerStepStatus.NotDone,
            })
                        .ToArray();

            await this.InitializeMessaging(cancellationToken);

            foreach (var step in steps)
            {
                await this.Process(step, cancellationToken);
            }

            // At the end there should be no unprocessed received messages
            if (steps.Last().StoryFrame.Actor == Actor.Bot)
            {
                Assert.Empty(this.receivedMessages);
            }

            var result = new StoryResult();

            foreach (var pair in this.outputValues)
            {
                result.OutputValues.Add(pair.Key, pair.Value);
            }

            return(result);
        }
        private async Task <StoryResult> AssignStory(Story story, AssignStoryInput input)
        {
            _logger.LogInformation(GetLogMessage("Story: {0}"), story.Id);

            var result = new StoryResult {
                StoryId = story.Id
            };

            var originalContractorId = story.ContractorId;

            story.ContractorId     = input.ContractorId;
            story.AssignedDateTime = DateTimeOffset.UtcNow;

            story.Updated     = DateTimeOffset.UtcNow;
            story.ObjectState = ObjectState.Modified;
            if (input.ContractorId.HasValue)
            {
                _logger.LogDebug(GetLogMessage("assign"));

                story.Status = StoryStatus.Assigned;
            }
            else
            {
                _logger.LogDebug(GetLogMessage("unassign"));


                switch (story.Project.Status)
                {
                case ProjectStatus.Pending:
                    story.Status = StoryStatus.Pending;
                    break;

                case ProjectStatus.Active:
                    story.Status = StoryStatus.Approved;
                    break;

                case ProjectStatus.Paused:
                    story.Status = StoryStatus.Pending;
                    break;

                case ProjectStatus.Ended:
                    story.Status = StoryStatus.Archived;
                    break;

                case ProjectStatus.Inactive:
                    story.Status = StoryStatus.Pending;
                    break;
                }
            }
            story.StatusTransitions.Add(new StoryStatusTransition()
            {
                Status      = story.Status,
                ObjectState = ObjectState.Added
            });


            var records = await Repository.UpdateAsync(story, true);

            _logger.LogDebug(GetLogMessage("{0} Records Updated"), records);

            if (records > 0)
            {
                result.Succeeded = true;

                if (originalContractorId != story.ContractorId && story.ContractorId.HasValue)
                {
                    await Task.Run(() => RaiseEvent(new StoryAssignedEvent()
                    {
                        StoryId = story.Id
                    }));
                }
            }

            return(result);
        }
        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);
        }