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); }
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); } }