Пример #1
0
        /// <summary>
        /// Service method to log a user in.
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <TokenModel> LogUserIn(LoginModel model)
        {
            if (model == null)
            {
                return(null);
            }
            FXUser user        = new FXUser();
            var    userContext = _httpContextAccessor.HttpContext.User.Identity.Name;

            //_httpContextAccessor.HttpContext.Request.
            //get bsae url wt above
            log.LogInformation($"Attempting to retrieve user {userContext} info.");
            try
            {
                user = await _userrepo.FirstOrDefault(u => u.Username == model.Username);

                if (user == null)
                {
                    return(null);
                }
            }
            catch (Exception e)
            {
                log.LogError($"{e.Message}");
                return(null);
            }


            var verifyPwd = AuthUtil.VerifyPasswordHash(model.Password, user.PasswordHash, user.PasswordSalt);

            if (!verifyPwd)
            {
                return(null);
            }

            var claims    = new ClaimsIdentity(new[] { new Claim("id", $"{user.Id}"), new Claim(ClaimTypes.Role, user.Role), new Claim(ClaimTypes.Name, user.Username) });
            var jwtSecret = configuration["JwtSettings:Secret"];
            var token     = AuthUtil.GenerateJwtToken(jwtSecret, claims);

            claims.AddClaim(new Claim("token", token));

            var refreshToken = AuthUtil.GenerateRefreshToken();

            // Save tokens to DB
            user.AuthToken    = token;
            user.RefreshToken = refreshToken;

            await _userrepo.Update(user);

            return(new TokenModel
            {
                Token = token,
                RefreshToken = refreshToken,
                Email = user.Email,
                UserID = user.Id,
                Role = user.Role,
                Username = user.Username
            });
            //throw new NotImplementedException("h");
        }
Пример #2
0
        private async Task <(WalletView entity, string Message)> GenerateEliteWallet(FXUser userInDb, string toCapsSymbol, string symbolName, string userCtx, decimal amt)
        {
            Random random = new Random();
            // Any random integer
            int num             = random.Next(10000, 9999999);
            var walletAcctDigit = $"00{num}";
            var newWallet       = new Wallet
            {
                CurrnencyTitle = symbolName,
                CurrencySymbol = toCapsSymbol,
                UserId         = userInDb.Id,
                AcctDigits     = walletAcctDigit,
                CreatedAt      = DateTime.Now,
                ModifiedAt     = DateTime.Now,
                ActionTaken    = "Created new Wallet",
                CreatedBy      = userCtx,
                User           = userInDb
            };


            var returnToView = new WalletView
            {
                CurrencyTitle  = symbolName,
                CurrencySymbol = toCapsSymbol,
                UserId         = userInDb.Id,
                CreatedAt      = DateTime.Now,
                ModifiedAt     = DateTime.Now,
                ActionTaken    = "Created new Wallet",
                CreatedBy      = userCtx,
                WalletAcct     = walletAcctDigit,
                UserCreated    = userInDb
            };

            if (amt > 0)
            {
                newWallet.GrandAmount = amt;
                newWallet.Amount      = amt;
                newWallet.ActionTaken = $"You tried to fund a wallet that didnt exist so a new one was created. with the amount {newWallet.CurrencySymbol} {amt}";
                returnToView.Amount   = amt;
            }
            _ = await _walletrepo.Insert(newWallet);

            return(entity : returnToView, Message : $"Successfully created your wallet.");
        }
Пример #3
0
        public async Task <(WalletView entity, string Message)> GenerateWallet(FXUser userInDb, string symbolName, string toCapsSymbol, string userCtx)
        {
            Random random = new Random();
            // Any random integer
            int generateAcctDigits = random.Next(10000, 9999999);
            var walletAcctDigit    = $"10{generateAcctDigits}";
            var newWallet          = new Wallet
            {
                CurrnencyTitle = symbolName,
                CurrencySymbol = toCapsSymbol,
                UserId         = userInDb.Id,
                AcctDigits     = walletAcctDigit,
                CreatedAt      = DateTime.Now,
                ModifiedAt     = DateTime.Now,
                ActionTaken    = "Created new Wallet",
                CreatedBy      = userCtx,
            };

            newWallet.IsMainCurrency = true;

            _ = await _walletrepo.Insert(newWallet);

            var returnToView = new WalletView
            {
                CurrencyTitle  = symbolName,
                CurrencySymbol = toCapsSymbol,
                UserId         = userInDb.Id,
                CreatedAt      = DateTime.Now,
                ModifiedAt     = DateTime.Now,
                ActionTaken    = "Created new Wallet",
                CreatedBy      = userCtx,
                WalletAcct     = walletAcctDigit
            };

            return(entity : returnToView, Message : $"Successfully created your wallet.");
        }
Пример #4
0
        private async Task <(FundedWalletRespnse entity, string Message)> FundNoob(FundedWalletRespnse fundedResponse, string symbolCaps, FXUser userInDb, FundWalletModel model, List <Wallet> uwallet)
        {
            //var getUserWallet = await _walletrepo.FirstOrDefault(t => t.UserId == userInDb.Id);
            var    getUserWallet = uwallet.FirstOrDefault(r => r.UserId == userInDb.Id);
            string message       = "";

            if (getUserWallet == null)
            {
                return(entity : null, Message : $"WALLET NOT FOUND.");
            }
            if (getUserWallet.CurrencySymbol == symbolCaps)
            {
                var walletdto = getUserWallet;
                walletdto.GrandAmount        += model.Amount;
                walletdto.IsCurrencyConverted = true;
                walletdto.ActionTaken         = $"Funded Wallet by {userInDb.Username}.";

                fundedResponse.AcctDigits = getUserWallet.AcctDigits;
                // This New Amount is the proposed amount user will have after approval.
                fundedResponse.NewAmountAfterApproval = walletdto.GrandAmount;

                // Noob User still sees previous amount
                fundedResponse.Amount       = getUserWallet.Amount;
                fundedResponse.UserIdToFund = userInDb.Id;

                if (userInDb.Role == UserRoles.Admin)
                {
                    message = $"Successful. wallet is funded.";
                    fundedResponse.IsApproved = true;
                    walletdto.Amount          = walletdto.GrandAmount;
                }

                // Update wallet in db when admin has approved
                await _walletrepo.Update(walletdto);

                message = $"Success. Account funded in {getUserWallet.CurrencySymbol}. You just need wait for admin to approve funding.";
                return(entity : fundedResponse, Message : message);
            }
            try
            {
                var(conversionresult, info) = await _currency.CurrencyConversion(symbolCaps, getUserWallet.CurrencySymbol, model.Amount);

                if (conversionresult == null)
                {
                    return(entity : null, Message : $"An error occurred.");
                }

                var walletdto = getUserWallet;
                walletdto.GrandAmount        += conversionresult.Result;
                walletdto.IsCurrencyConverted = true;
                walletdto.ActionTaken         = $"Funded Wallet by {userInDb.Username}.";
                log.LogInformation($"{conversionresult.Result}");
                await _walletrepo.Update(walletdto);

                fundedResponse.AcctDigits = getUserWallet.AcctDigits;
                // This New Amount is the proposed amount user will have after approval.
                fundedResponse.NewAmountAfterApproval = walletdto.GrandAmount;

                // Noob User still sees previous amount before approval
                fundedResponse.Amount       = getUserWallet.Amount;
                fundedResponse.UserIdToFund = userInDb.Id;

                if (userInDb.Role == UserRoles.Admin)
                {
                    message = $"Successful. wallet is funded. And approved.";
                    fundedResponse.IsApproved = true;
                }

                message = $"Success. Account funded in {getUserWallet.CurrencySymbol}. You just need wait for admin to approve funding.";
                return(entity : fundedResponse, Message : message);
            }
            catch (Exception e)
            {
                log.LogError($"An error occurred. {e.Message}");
            }
            return(entity : null, Message : $"An error occurred. out side if block");
        }
Пример #5
0
        /// <summary>
        /// This Method has a job of Funding an elite Wallet.
        /// if a wallet exist with a passed amount it updates it
        /// else it creates it with that currency and amount passed
        /// </summary>
        /// <param name="fundedResponse"></param>
        /// <param name="symbolCaps"></param>
        /// <param name="symbolname"></param>
        /// <param name="userctx"></param>
        /// <param name="userInDb"></param>
        /// <param name="model"></param>
        /// <param name="uwallet"></param>
        /// <returns></returns>
        private async Task <(FundedWalletRespnse entity, string Message)> FundElite(FundedWalletRespnse response, string symbolname, string symbolCaps, string userctx, FXUser userInDb, FundWalletModel model, List <Wallet> uwallet, FXUser adminInCtx = null)
        {
            if (model == null)
            {
                return(entity : null, Message : $"An error occured  with details passed.");
            }
            var    eliteWallets   = uwallet;
            Wallet selectedWallet = null;

            try
            {
                selectedWallet = eliteWallets.FirstOrDefault(r => r.AcctDigits == model.AcctDigits && r.CurrencySymbol == symbolCaps && r.UserId == userInDb.Id);
                if (selectedWallet == null && adminInCtx.Username == userctx)
                {
                    return(entity : null, Message : $"Wallet Acct {model.AcctDigits} doesnt exist for {userInDb.Username}.");
                }
            }
            catch (Exception e)
            {
                log.LogError($"An error occured while retrieving wallet. {e.Message}");
                return(entity : null, Message : $"An error occured  while retrieving wallet for {userInDb.Username}");
            }

            // Create a new wallet if Elite user doenst have a wallet in the passed symbol currency
            // Then fund it with passed amount
            var newWallet = new Wallet();

            if (selectedWallet == null && userctx == userInDb.Username)
            {
                // Created wallet with passed currency
                var(newwallet, Message) = await GenerateEliteWallet(userInDb, symbolCaps, symbolname, userInDb.Username, model.Amount);

                // Funding new wallet it.
                newWallet.GrandAmount    = newwallet.Amount;
                newWallet.Amount         = newwallet.Amount;
                newWallet.AcctDigits     = newwallet.WalletAcct;
                newWallet.ActionTaken    = $"Created wallet and funded it.";
                newWallet.CreatedAt      = DateTime.Now;
                newWallet.ModifiedAt     = DateTime.Now;
                newWallet.CreatedBy      = userctx;
                newWallet.CurrencySymbol = newwallet.CurrencySymbol;
                newWallet.CurrnencyTitle = newwallet.CurrencyTitle;
                newWallet.UserId         = newwallet.UserId;
                await _walletrepo.Update(newWallet);

                // Populate response
                response.AcctDigits             = newwallet.WalletAcct;
                response.Amount                 = newwallet.Amount;
                response.IsApproved             = true;
                response.NewAmountAfterApproval = newwallet.Amount;
                response.UserIdToFund           = newwallet.UserId;

                return(entity : response, Message : $"Created wallet and funded it for {userctx}. by {userctx}");
            }
            else
            {
                // Fund wallet with passed currency
                selectedWallet.GrandAmount += model.Amount;
                selectedWallet.Amount      += model.Amount;
                selectedWallet.ActionTaken  = $"Created wallet and funded it.";
                selectedWallet.CreatedAt    = DateTime.Now;
                selectedWallet.ModifiedAt   = DateTime.Now;
                selectedWallet.CreatedBy    = userctx;

                await _walletrepo.Update(selectedWallet);

                // Populate response
                response.AcctDigits             = selectedWallet.AcctDigits;
                response.Amount                 = selectedWallet.GrandAmount;
                response.IsApproved             = true;
                response.NewAmountAfterApproval = selectedWallet.Amount;
                response.UserIdToFund           = selectedWallet.UserId;

                return(entity : response, Message : $"Wallet Funded for {userctx}");
            }
        }
Пример #6
0
        /// <summary>
        /// Service method to register a new user
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public async Task <(UserView user, string message)> RegisterUser(SignUp model)
        {
            var userExists = await _userrepo.FirstOrDefault(r => r.Username == model.Username || r.Email == model.Email);

            if (userExists != null)
            {
                return(user : null, message : $"User {userExists.Username} exists.");
            }
            // Validate Email-add in-app
            var(IsValid, Email) = AuthUtil.ValidateEmail(model.Email);

            if (IsValid == false || model.Password.Length == 0)
            {
                return(user : null, message : $"Email format incorrect. or Password not inputed");
            }

            if (userExists == null)
            {
                AuthUtil.CreatePasswordHash(model.Password, out byte[] passwordHash, out byte[] passwordSalt);
                var userDetails = new FXUser
                {
                    CreatedAt    = DateTime.Now,
                    PasswordHash = passwordHash,
                    PasswordSalt = passwordSalt,
                    Username     = model.Username,
                    Email        = model.Email,
                    Role         = UserRoles.User
                };

                //Send verification notification
                Random rand               = new Random();
                string digits             = rand.Next(0, 999999).ToString("D6");
                var    prepMessageDetails = new EmailMessage();
                prepMessageDetails.ToEmail = model.Email;
                prepMessageDetails.Subject = $"Verify your Email";
                prepMessageDetails.Body    = $"Your OTP is {digits}";

                // TODO: Set expiry on OTP.
                userDetails.OTP = digits;

                var newuser = await _userrepo.Insert(userDetails);

                //send email to user
                var sendmail = await _mail.SendEmailAsync(prepMessageDetails);

                if (sendmail)
                {
                    var returnView = new UserView
                    {
                        Username   = newuser.Username,
                        Email      = newuser.Email,
                        LastName   = model.LastName,
                        FirstName  = model.FirstName,
                        Message    = $"An Email has been sent to {model.Email} for verification.",
                        IsVerified = false
                    };

                    return(user : returnView, message : $"User created successfully. Check email {model.Email} for an OTP.");
                }
            }
            return(user : null, message : $"Something went wrong.");
        }