예제 #1
0
        public IActionResult CheckOut([FromBody] CheckoutCardOptions options)
        {
            var res = _cards.CheckOut(options);

            return(Json(res));
        }
예제 #2
0
        public ApiResult <CheckoutCardOptions> CheckOut(CheckoutCardOptions options)
        {
            try {
                if (options == null)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"Null {nameof(options)}"
                    });
                }


                if (string.IsNullOrWhiteSpace(options.CardNumber))
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"Null or empty {nameof(options.CardNumber)}"
                    });
                }

                var now = DateTime.Today;

                int ExpirationMonth = int.Parse(options.ExpirationMonth);
                int ExpirationYear  = int.Parse(options.ExpirationYear);

                if (ExpirationMonth == 0 || ExpirationMonth > 12)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"invalid expiration data"
                    });
                }

                if (options.Amount <= 0)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.BadRequest,
                        ErrorText = $"Invalid {nameof(options.Amount)}"
                    });
                }

                var r = GetByNumber(options.CardNumber);
                if (r.Code != ApiResultCode.Success)
                {
                    return(new ApiResult <CheckoutCardOptions> {
                        Code = r.Code, ErrorText = r.ErrorText
                    });
                }


                var card = r.Data;

                if (card.Expiration.Year != ExpirationYear || card.Expiration.Month != ExpirationMonth)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Transaction denied"
                    });
                }

                if (card.Expiration.Year < now.Year || (card.Expiration.Year == now.Year && card.Expiration.Month < now.Month))
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Card has expired"
                    });
                }

                if (!card.Active)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Card is inactive"
                    });
                }

                if (card.Accounts.Count == 0)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Card has no connected accounts"
                    });
                }



                //assume first active account
                var account = card.Accounts.AsQueryable().Where(a => a.State == AccountState.Active).SingleOrDefault();

                if (account == null)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"no active accounts"
                    });
                }


                if (account.Balance < options.Amount)
                {
                    return(new ApiResult <CheckoutCardOptions>()
                    {
                        Code = ApiResultCode.Forbidden,
                        ErrorText = $"Issuficient amount"
                    });
                }

                account.Balance -= options.Amount;
                _dbContext.SaveChanges();

                return(new ApiResult <CheckoutCardOptions> {
                    Code = ApiResultCode.Success, Data = options
                });
            }
            catch (Exception e) {
                return(new ApiResult <CheckoutCardOptions>()
                {
                    Code = ApiResultCode.InternalServerError,
                    ErrorText = $"General Error {e.Message}" //not for production
                });
            }
        }