Ejemplo n.º 1
0
        public async Task <Unit> Handle(ProcessTokenPurchaseCommand request, CancellationToken cancellationToken)
        {
            var order = await _mediator.Send(new GetOrderByIdQuery { OrderId = request.Order.Id }, cancellationToken);

            if (order == null || order.Status == OrderStatus.Completed)
            {
                throw new NotFoundException("ProcessTokenPurchase_OrderNotFound", request.Order.Id);
            }

            using (var transaction = await _db.Database.BeginTransactionAsync(cancellationToken))
            {
                order.Status = OrderStatus.Completed;
                _db.Update(order);
                await _db.SaveChangesAsync(cancellationToken);

                await _mediator.Send(
                    new UserUpdateBalanceCommand
                {
                    Amount = request.Order.Quantity, UserId = order.UserId, OrderId = order.Id, Type = AddRemove.Add
                }, cancellationToken);

                transaction.Commit();
                return(Unit.Value);
            }
        }
        public async Task <Unit> Handle(PaypalFinishOrderCommand request, CancellationToken cancellationToken)
        {
            if (request.Callback.ResourceType != "sale")
            {
                return(Unit.Value);
            }

            var orderId = request.Callback.Resource.ParentPayment;

            var order = await _db.Orders.FirstOrDefaultAsync(w =>
                                                             w.PaypalId == orderId, cancellationToken);

            if (order == null)
            {
                throw new NotFoundException("PaypalOrderCallback", orderId);
            }

            if (order.Status == OrderStatus.Completed || order.Status == OrderStatus.Processing)
            {
                throw new Exception("Order is already processing or completed.");
            }

            order.Status = OrderStatus.Processing;
            _db.Update(order);
            await _db.SaveChangesAsync(cancellationToken);

            await _mediator.Send(new ProcessPaypalOrderCommand { Order = order }, cancellationToken);

            return(Unit.Value);
        }
        public async Task <int> Handle(UserUpdateBalanceCommand request, CancellationToken cancellationToken)
        {
            var user = await _db.Users.FirstOrDefaultAsync(w => w.Id == request.UserId, cancellationToken);

            if (user == null)
            {
                throw new UserNotFoundException(request.UserId);
            }

            var balanceChange = new BalanceChange
            {
                OldBalance = user.Balance
            };

            switch (request.Type)
            {
            case AddRemove.Add:
                user.Balance += request.Amount;
                break;

            case AddRemove.Remove:
                user.Balance -= request.Amount;
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }

            balanceChange.NewBalance  = user.Balance;
            balanceChange.UserId      = user.Id;
            balanceChange.Timestamp   = DateTimeOffset.UtcNow;
            balanceChange.AdminUserId = request.AdminUserId;
            balanceChange.OrderId     = request.OrderId;

            _db.Update(user);
            _db.BalanceChanges.Add(balanceChange);
            await _db.SaveChangesAsync(cancellationToken);

            return(user.Balance);
        }
Ejemplo n.º 4
0
        public async Task <int> Handle(CreateScriptCommand request, CancellationToken cancellationToken)
        {
            request = CleanCommand(request);
            using (var transaction = await _db.Database.BeginTransactionAsync(cancellationToken))
            {
                var script = request.Script;

                var exists =
                    await _db.Scripts.FirstOrDefaultAsync(s =>
                                                          s.Name.ToLower() == script.Name.ToLower() || s.Id == script.Id, cancellationToken);

                await AssertCanCreate(request, exists);

                var isUpdatingPending =
                    exists != null && exists.Status == ScriptStatus.Pending && script.Id != default(int);

                script.UserId     = request.User.Id;
                script.Status     = ScriptStatus.Pending;
                script.LastUpdate = DateTimeOffset.UtcNow;
                script.Version    = exists?.Version + (decimal)0.01 ?? (decimal)0.01;

                if (isUpdatingPending)
                {
                    TinyMapper.Map(script, exists);
                    _db.Scripts.Update(exists);
                }
                else
                {
                    script.Id = 0;
                    await _db.Scripts.AddAsync(script, cancellationToken);
                }

                await _db.SaveChangesAsync(cancellationToken);

                if (exists != null && !isUpdatingPending)
                {
                    await _db.PendingScripts.AddAsync(new PendingScript
                    {
                        LiveScriptId    = exists.Id,
                        PendingScriptId = script.Id
                    }, cancellationToken);
                }

                var compile =
                    await _mediator.Send(
                        new CompileScriptCommand { GitlabUrl = request.RepositoryUrl },
                        cancellationToken);

                if (isUpdatingPending)
                {
                    var content = await _mediator.Send(new GetScriptContentQuery { ScriptId = exists.Id },
                                                       cancellationToken);

                    content.Content = compile.Content;
                    _db.Update(content);
                }
                else
                {
                    await _db.ScriptContents.AddAsync(new ScriptContent
                    {
                        ScriptId = script.Id,
                        Content  = compile.Content
                    }, cancellationToken);
                }

                await _db.SaveChangesAsync(cancellationToken);

                transaction.Commit();

                return(isUpdatingPending ? exists.Id : script.Id);
            }
        }