/// <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"); }
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."); }
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."); }
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"); }
/// <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}"); } }
/// <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."); }