public async Task TestTipCornFromUnregistered()
        {
            var dbContext = TestUtils.CreateDatabase();

            try
            {
                var startToUser  = dbContext.TwitchQuery(_configuration["Config:TestToUserId"]).FirstOrDefault().UserWallet.Balance;
                var txController = new TxController(dbContext);
                var request      = new TipRequest();
                request.Columns  = new string[] { };
                request.To       = "twitch|" + _configuration["Config:TestToUserId"];
                request.From     = "twitch|123123";
                request.Platform = "twitch";
                request.Amount   = 100;
                var response = await txController.Tipcorn(request);

                var receipt = response.Value[0];
                Assert.Null(receipt.Tx);
                Assert.Null(receipt.From);
                Assert.NotNull(receipt.To);
                var endToUser = dbContext.TwitchQuery(_configuration["Config:TestToUserId"]).FirstOrDefault().UserWallet.Balance;
                Assert.Equal(startToUser, endToUser);
            }
            finally
            {
                dbContext.Dispose();
            }
        }
예제 #2
0
        public static Task AddRequestAsync(TipRequest request)
        {
            var collection = GetCollection();

            collection.Insert(request);
            collection.EnsureIndex(x => x.From);
            collection.EnsureIndex(x => x.To);
            return(Task.CompletedTask);
        }
예제 #3
0
        private void CalculateButton_Click(object sender, EventArgs e)
        {
            double price;

            if(double.TryParse(_priceEditTExt.Text, out price))
            {
                var tipRequest = new TipRequest() { Price = price, Satisfaction = Satisfaction.Excellent };
                var result = _tipService.CalculateTip(tipRequest) as TipCalculationResult;
                if (result == null) return;
                _tipOutput.Text = result.Tip.ToString("0.00");
            }
        }
    public ActionResult<TipResponse> StoreTip([FromBody] TipRequest tips)
    {
        if (tips == null || tips.Numbers == null || tips.Numbers.Length != 6 
            || tips.Numbers.Any(n => n < 1 || n > 45) || tips.Numbers.GroupBy(n => n).Any(g => g.Count() > 1))
        {
            return BadRequest();
        }

        return Ok(new TipResponse
        {
            ReceiptNumber = new Random().Next(10000, 99999),
            ReceiptTimestamp = DateTime.UtcNow
        });
    }
예제 #5
0
        public IObservable<TipResponse> Search(double latitude, double longitude, int page, int limit)
        {
            var request = new TipRequest
            {
                Latitude = latitude,
                Longitude = longitude,
                Offset = page,
                Limit = limit
            };

            var func = Observable.FromAsyncPattern<TipRequest, TipResponse>(this.BeginAsync<TipRequest, TipResponse>, this.EndAsync<TipResponse>);

            return func(request);
        }
예제 #6
0
 public CreateResponse Create(TipRequest request)
 {
     try
     {
         var tip = TypeAdapter.Adapt <Tip>(request);
         _tipValidator.ValidateAndThrowException(tip, "Base");
         _tipRepository.Add(tip);
         return(new CreateResponse(tip.Id));
     }
     catch (DataAccessException)
     {
         throw new ApplicationException();
     }
 }
        async Task <TxTestResult> Tip(decimal amount, User fromUser, User toUser, bool writeOutput = true)
        {
            var dbContext = TestUtils.CreateDatabase();

            try
            {
                var tipResult = new TxTestResult();
                tipResult.Amount     = amount;
                tipResult.ToUserId   = toUser.UserId;
                tipResult.FromUserId = fromUser.UserId;

                var txController = new TxController(dbContext);
                var request      = new TipRequest();
                request.Columns = new string[] { };

                tipResult.FromStartBalance = fromUser.UserWallet.Balance.Value;
                tipResult.ToStartBalance   = toUser.UserWallet.Balance.Value;

                request.Amount   = amount;
                request.Platform = "twitch";

                request.From = "twitch|" + fromUser.UserIdentity.TwitchId;
                request.To   = "twitch|" + toUser.UserIdentity.TwitchId;

                var response = (await txController.Tipcorn(request));
                if (writeOutput)
                {
                    using (var dbContext2 = TestUtils.CreateDatabase())
                    {
                        var fromEnd = dbContext2.TwitchQuery(fromUser.UserIdentity.TwitchId).FirstOrDefault().UserWallet.Balance;//(decimal)responseData[0].From[nameof(UserWallet.Balance).ToLower()];
                        var toEnd   = dbContext2.TwitchQuery(toUser.UserIdentity.TwitchId).FirstOrDefault().UserWallet.Balance;

                        tipResult.FromEndBalance = fromEnd.Value;
                        tipResult.ToEndBalance   = toEnd.Value;
                    }
                }
                tipResult.ResponseObject = response;
                return(tipResult);
            }
            finally
            {
                dbContext.Dispose();
            }
        }
예제 #8
0
 public SuccessResponse Update(TipRequest request)
 {
     try
     {
         var currentTip = _tipRepository.FindBy(request.Id);
         currentTip.ThrowExceptionIfRecordIsNull();
         var tipToCopy = TypeAdapter.Adapt <Tip>(request);
         TypeAdapter.Adapt(tipToCopy, currentTip);
         _tipValidator.ValidateAndThrowException(currentTip, "Base");
         _tipRepository.Update(currentTip);
         return(new SuccessResponse {
             IsSuccess = true
         });
     }
     catch (DataAccessException)
     {
         throw new ApplicationException();
     }
 }
 Object ITipCalculationService.CalculateTip(TipRequest p0)
 {
     return CalculateTip(p0);
 }
예제 #10
0
 public SuccessResponse Put(TipRequest request)
 {
     return(_tipService.Update(request));
 }
예제 #11
0
 public CreateResponse Post(TipRequest request)
 {
     return(_tipService.Create(request));
 }
예제 #12
0
 public void ShouldThrowExceptionWhenNoLocationIsSupplied()
 {
     TipRequest request = new TipRequest();
     var req = request.Create(new HttpRequestProxy());
 }
        public async Task TestTipCornToUnregistered()
        {
            var dbContext = TestUtils.CreateDatabase();

            try
            {
                var startFromUser = dbContext.TwitchQuery(_configuration["Config:TestFromUserId"]).FirstOrDefault().UserWallet.Balance;
                var txController  = new TxController(dbContext);

                var request = new TipRequest();
                request.Columns = new string[] { };
                string toTwitchId = "123123";
                request.To       = "twitch|" + toTwitchId;
                request.From     = "twitch|" + _configuration["Config:TestFromUserId"];
                request.Platform = "twitch";
                request.Amount   = 100;

                var toUser = await dbContext.TwitchAsync(toTwitchId);

                dbContext.RemoveRange(dbContext.UnclaimedTx);
                TestUtils.RemoveUserIfExists(dbContext, toUser);

                var response = await txController.Tipcorn(request);

                var receipt = response.Value[0];
                Assert.Null(receipt.Tx);
                Assert.NotNull(receipt.From);
                Assert.Null(receipt.To);

                using (var dbContext2 = TestUtils.CreateDatabase())
                {
                    var endFromUser = dbContext2.TwitchQuery(_configuration["Config:TestFromUserId"]).FirstOrDefault().UserWallet.Balance;
                    Assert.Equal(startFromUser - request.Amount, endFromUser);

                    dbContext2.AddUser(new UserIdentity()
                    {
                        Auth0Id       = "temp",
                        Auth0Nickname = "temp",
                        TwitchId      = toTwitchId
                    }, new UserWallet());
                    var to = await dbContext2.TwitchAsync(toTwitchId);

                    await TxUtils.TryClaimTx(new PlatformId()
                    {
                        Platform = "twitch", Id = toTwitchId
                    }, to, dbContext2);
                }
                using (var dbContext2 = TestUtils.CreateDatabase())
                {
                    var to = await dbContext2.TwitchAsync(toTwitchId);

                    Assert.Equal(request.Amount, to.UserWallet.Balance);
                    var claim2 = await TxUtils.TryClaimTx(new PlatformId()
                    {
                        Platform = "twitch", Id = toTwitchId
                    }, to, dbContext2);;
                    Assert.Equal(0, claim2);
                }
            }
            finally
            {
                dbContext.Dispose();
            }
        }
예제 #14
0
        public async Task <ActionResult <TxReceipt[]> > Tipcorn([FromBody] TipRequest tipRequest)
        {
            if (tipRequest == null)
            {
                throw new ArgumentNullException();
            }
            if (tipRequest.From == null)
            {
                throw new ArgumentNullException();
            }
            if (tipRequest.To == null)
            {
                throw new ArgumentNullException();
            }
            if (tipRequest.To == tipRequest.From)
            {
                return(StatusCode((int)HttpStatusCode.BadRequest));
            }
            if (tipRequest.Amount <= 0)
            {
                return(StatusCode((int)HttpStatusCode.BadRequest));
            }

            try
            {
                var processInfo = await TxUtils.ProcessRequest(tipRequest, _dbContext);

                var transactions = processInfo.Transactions;
                if (transactions != null && transactions.Length > 0)
                {
                    StringBuilder sql = new StringBuilder();
                    if (processInfo.WriteTransactionOutput(sql))
                    {
                        var receipt = transactions[0];
                        if (receipt.Tx != null)
                        {
                            var    to        = receipt.To.User.UserStat;
                            var    from      = receipt.From.User.UserStat;
                            var    amount    = tipRequest.Amount;
                            string table     = nameof(UserStat);
                            var    pk        = nameof(UserStat.UserId);
                            var    fromStats = new List <ColumnValuePair>();

                            fromStats.Add(new ColumnValuePair(nameof(UserStat.Tip), 1));
                            fromStats.Add(new ColumnValuePair(nameof(UserStat.TipTotal), amount));

                            sql.Append(TxUtils.ModifyNumbers(table, fromStats, '+', pk, from.UserId));

                            var toStats = new List <ColumnValuePair>();
                            toStats.Add(new ColumnValuePair(nameof(UserStat.Tipped), 1));
                            toStats.Add(new ColumnValuePair(nameof(UserStat.TippedTotal), amount));

                            sql.Append(TxUtils.ModifyNumbers(table, toStats, '+', pk, to.UserId));

                            sql.Append(TxUtils.UpdateNumberIfTop(table, nameof(UserStat.TopTip), amount, pk, from.UserId));
                            sql.Append(TxUtils.UpdateNumberIfTop(table, nameof(UserStat.TopTipped), amount, pk, to.UserId));

                            await _dbContext.Database.ExecuteSqlRawAsync(sql.ToString());

                            await _dbContext.SaveAsync(IsolationLevel.RepeatableRead);
                        }
                    }
                    else
                    {
                        if (processInfo.From != null && !processInfo.From.IsBanned && processInfo.Transactions[0].To == null)
                        {
                            if (processInfo.From.UserWallet.Balance >= tipRequest.Amount)
                            {
                                var unclaimed = new UnclaimedTx();
                                unclaimed.TxType             = ((ITxRequest)tipRequest).TxType;
                                unclaimed.Platform           = tipRequest.Platform;
                                unclaimed.ReceiverPlatformId = BitcornUtils.GetPlatformId(tipRequest.To).Id;
                                unclaimed.Amount             = tipRequest.Amount;
                                unclaimed.Timestamp          = DateTime.Now;
                                unclaimed.SenderUserId       = processInfo.From.UserId;
                                unclaimed.Expiration         = DateTime.Now.AddMinutes(TimeToClaimTipMinutes);
                                unclaimed.Claimed            = false;
                                unclaimed.Refunded           = false;

                                _dbContext.UnclaimedTx.Add(unclaimed);
                                await _dbContext.Database.ExecuteSqlRawAsync(TxUtils.ModifyNumber(nameof(UserWallet), nameof(UserWallet.Balance), tipRequest.Amount, '-', nameof(UserWallet.UserId), processInfo.From.UserId));

                                await _dbContext.SaveAsync();
                            }
                        }
                    }
                    await TxUtils.AppendTxs(transactions, _dbContext, tipRequest.Columns);
                }
                return(transactions);
            }
            catch (Exception e)
            {
                await BITCORNLogger.LogError(_dbContext, e);

                throw e;
            }
        }