public async Task <Unit> Handle(Command request, CancellationToken cancellationToken)
            {
                using var tx = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);

                var order = await db.Orders.FirstAsync(o => o.Id == request.OrderId, cancellationToken);

                var candidateHero = await db.Heroes.FirstAsync(h => h.Id == request.SelectedHero, cancellationToken);

                var availableHeroes = await db.FindHeroForOrder(order);

                var heroAvailable = availableHeroes.Any(h => h.Id == candidateHero.Id);

                if (!heroAvailable)
                {
                    throw new ApplicationException(($"Hero {candidateHero.Name} not available!"));
                }

                order.CreateOfferWithHero(candidateHero);

                await db.SaveChangesAsync(cancellationToken);

                await bpmnService.CompleteTask(request.TaskId, order);

                tx.Complete();

                return(Unit.Value);
            }
Example #2
0
            public async Task <ICollection <HeroDto> > Handle(Query request, CancellationToken cancellationToken)
            {
                var order           = db.Orders.FirstOrDefault(o => o.Id == request.OrderId);
                var availableHeroes = await db.FindHeroForOrder(order);

                return(availableHeroes.Select(HeroDto.FromEntity).ToList());
            }