public ApiResult <Card> Payment(SearchCardOptions options) { if (options == null) { return(ReturnResult(ApiResultCode.BadRequest, $"Null {nameof(options)}")); } if (!string.IsNullOrWhiteSpace(options.CardNumber)) { var card = GetByCardNumber(options.CardNumber); if (card == null) { return(ReturnResult(ApiResultCode.NotFound, $"Card Number {options.CardNumber} was not found")); } var expirationMonth = card.Expiration.Month.ToString(); var requestMonth = FixMonth(options.ExpirationMonth); var expirationYear = card.Expiration.Year.ToString(); if (!expirationMonth.Equals(requestMonth) || !expirationYear.Equals(options.ExpirationYear)) { return(ReturnResult(ApiResultCode.Conflict, $"Card's Expiration Month or Year are wrong")); } if (!card.Active) { return(ReturnResult(ApiResultCode.BadRequest, $"Card {options.CardNumber} is not active!")); } return(CheckAndUpdateAccount(options, card)); } return(null); }
public IActionResult Index(SearchCardOptions options) { return(View( new SearchCardViewModel() { })); }
public IActionResult Payment([FromBody] SearchCardOptions options) { var result = _cards.Payment(options); if (!result.IsSuccessful()) { return(result.ToActionResult()); } return(Ok(options)); }
private ApiResult <Card> CheckAndUpdateAccount(SearchCardOptions options, Card card) { var accountBalance = card.Accounts.SingleOrDefault().Balance; if (accountBalance >= options.Amount) { accountBalance -= options.Amount; var result = UpdateAccount(card.Accounts.SingleOrDefault().AccountId, accountBalance); if (!result) { return(ReturnResult(ApiResultCode.Conflict, $"Balance is lower than the requested amount!")); } } return(ApiResult <Card> .UpdateSuccessful(card)); }
public void Card_Payment_Success() { var options = new SearchCardOptions() { CardNumber = "5351420084404288", ExpirationMonth = "04", ExpirationYear = "2023", Amount = 50 }; var result = _cards.Payment(options); Assert.True(result.IsSuccessful()); Assert.NotNull(result.Data); var card = result.Data; Assert.Equal(options.CardNumber, card.CardNumber); Assert.True(card.Active); }
public SearchCardViewModel() { Cards = new List <Card>(); SearchOptions = new SearchCardOptions(); }