Beispiel #1
0
        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
                });
            }
        }
Beispiel #2
0
        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));
        }
Beispiel #3
0
        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
            });
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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));
        }
Beispiel #6
0
        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);
        }
Beispiel #7
0
        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));
        }
Beispiel #8
0
        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));
        }