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> 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)); }
private bool UpdateAccount(string accountId, decimal balance) { bool res = false; var account = _dbContext.Set <Account>().AsQueryable().Where(c => c.AccountId == accountId).SingleOrDefault(); account.Balance = balance; try { _dbContext.SaveChanges(); } catch (Exception) { return(res); } res = true; return(res); }
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 }); } }