public ApiResult <Account> GetById(string accountId) { if (accountId == null) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Null {nameof(accountId)}")); } // SELECT FROM Account IQueryable <Account> accountResultSearch = _dbContext.Set <Account>().AsQueryable().Where(a => a.AccountId == accountId); var account = accountResultSearch.Include(c => c.Cards).SingleOrDefault(); if (account == null) { return(new ApiResult <Account>() { Code = Constants.ApiResultCode.NotFound, ErrorText = $"Customer {accountId} was not found" }); } else { return(new ApiResult <Account>() { Data = account }); } }
public ApiResult <Account> Create(Guid customerId, CreateAccountOptions options) { if (options == null) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Null {nameof(options)}")); } if (string.IsNullOrWhiteSpace(options.CurrencyCode) || !options.CurrencyCode.Equals( Constants.CurrencyCode.Euro, StringComparison.OrdinalIgnoreCase)) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Invalid or unsupported currency {options.CurrencyCode}")); } var customerResult = _customers.GetById(customerId); if (!customerResult.IsSuccessful()) { return(customerResult.ToResult <Account>()); } var customer = customerResult.Data; var account = new Account() { AccountId = CreateAccountId(customer.CountryCode), Balance = 0M, CurrencyCode = options.CurrencyCode, Customer = customer, State = Constants.AccountState.Active, Description = options.Description }; _dbContext.Add(account); try { _dbContext.SaveChanges(); } catch (Exception) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.InternalServerError, "Could not save account")); } return(ApiResult <Account> .CreateSuccessful(account)); }
public ApiResult <Card> GetByCardNumber(string cardNumber) { if (cardNumber == null) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Null {nameof(cardNumber)}")); } IQueryable <Card> cardsSearchRes = _dbContext.Set <Card>().AsQueryable().Where(a => a.CardNumber == cardNumber); var card = cardsSearchRes.SingleOrDefault(); if (card == null) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.NotFound, $"CardNumber {cardNumber} was not found")); } return(new ApiResult <Card>() { Data = card }); }
public static ApiResult <Card> Validations(this Card card, PaymentOptions options) { if (card == null) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.NotFound, $"Card {options.CardNumber} was not found")); } if (!card.IsValidRequest(options)) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Bad Request")); } if (!card.IsActive()) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, $"InActive Card {options.CardNumber}")); } return(null); }
public ApiResult <Account> Charge(string accountId, decimal amount) { if (accountId == null) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Null {nameof(accountId)}")); } IQueryable <Account> accountResultSearch = _dbContext.Set <Account>().AsQueryable().Where(a => a.AccountId == accountId); var account = accountResultSearch.Include(c => c.Cards).SingleOrDefault(); if (account == null) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.NotFound, $"Account {accountId} was not found")); } if (account.State != Constants.AccountState.Active) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.Success, $"Account State {account.State}")); } if (account.Balance < amount) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.Success, "Ιnsufficient Βalance")); } account.Balance -= amount; //_dbContext.Add(account); try { _dbContext.SaveChanges(); } catch (Exception) { return(ApiResult <Account> .CreateFailed( Constants.ApiResultCode.InternalServerError, "Could not save account")); } return(ApiResult <Account> .CreateSuccessful(account)); }
public static ApiResult <Card> Validations(this Account account, PaymentOptions options) { if (account == null) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, "No Connected Account")); } if (account.State != Constants.AccountState.Active) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Account State {account.State}")); } decimal amount = options.Amount; if (account.Balance < amount) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, "Ιnsufficient Βalance")); } return(null); }
public ApiResult <Card> Create(string accountId, CreateCardOptions options) { if (options == null) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Null {nameof(options)}")); } var accountResult = _accountService.GetById(accountId); if (!accountResult.IsSuccessful()) { return(accountResult.ToResult <Card>()); } var account = accountResult.Data; var card = new Card() { CardNumber = options.CardNumber, CardType = options.CardType, Active = true }; card.Accounts.Add(account); _dbContext.Add(card); try { _dbContext.SaveChanges(); } catch (Exception) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.InternalServerError, "Could not save account")); } return(ApiResult <Card> .CreateSuccessful(card)); }
public ApiResult <Card> Checkout(PaymentOptions options) { if (options == null || !options.IsValid()) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.BadRequest, $"Null {nameof(options)}")); } var card = Get(options.CardNumber); var cardValidationsApiResult = card.Validations(options); if (cardValidationsApiResult != null) { return(cardValidationsApiResult); } var account = card.Accounts.FirstOrDefault(); var accountValidationsApiResult = account.Validations(options); if (accountValidationsApiResult != null) { return(accountValidationsApiResult); } decimal amount = options.Amount; account.Balance -= amount; try { _dbContext.SaveChanges(); } catch (Exception) { return(ApiResult <Card> .CreateFailed( Constants.ApiResultCode.InternalServerError, "Could Not Save")); } return(ApiResult <Card> .CreateSuccessful(card)); }