using CustomerOnlineV2.Common.Helper; using CustomerOnlineV2.Common.Models; using CustomerOnlineV2.Common.Models.AccountModel; using CustomerOnlineV2.Common.Models.Notification; using CustomerOnlineV2.Repository.Repository.AccountRepository; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System.Text; using static CustomerOnlineV2.Common.Models.Notification.PasswordGenerator; namespace CustomerOnlineV2.Business.Business.AccountBusiness { public class AccountBusiness : IAccountBusiness { private readonly ILogger _logger; private readonly IAccountRepository _accountRepo; public AccountBusiness(ILogger logger, IAccountRepository accountRepo) { _logger = logger; _accountRepo = accountRepo; } public async Task Login(LoginModel model) { return await _accountRepo.Login(model); } public async Task ChangePassword(ForceChangePasswordModel model, LoginResponse logindetails) { if (model.NewPassword != model.ConfirmNewPassword) { return new CommonResponse(ResponseHelper.FAILED, "New Password and confirm new password does not match!"); } return await _accountRepo.ChangePassword(model, logindetails); } public async Task PasswordReset(PasswordResetModel model, LoginResponse logindetails) { //var randomPassword = PasswordGenerator.GenerateRandomPassword(); //model.RandomPassword = randomPassword; SendNotificationRequest request = new SendNotificationRequest() { IsBulkNotification = false, UserName = model.Username, //ProcessId = processId, ProviderId = "ResetPassword", NotificationTypeId = NOTIFICATION_TYPE.EMAIL.ToString(), //Template = Common.Model.Enum.NotifyTemplate.RESET_PASSWORD_EMAIL, Recipients = new List() { new RecipientViewModel() { NotificationContent = new NotificationDTO() { // Body = JsonConvert.SerializeObject(bodyMappings), //Title will be set by mapping json }, Address= model.Username } } }; return await _accountRepo.PasswordReset(model, logindetails); } public static string GenerateRandomPassword(PasswordOptions opts = null) { if (opts == null) opts = new PasswordOptions() { RequiredLength = 8, RequiredUniqueChars = 4, RequireDigit = true, RequireLowercase = true, RequireNonAlphanumeric = true, RequireUppercase = true }; string[] randomChars = new[] { "ABCDEFGHJKMNPQRSTUVWXYZ", // uppercase "abcdefghjkmnpqrstuvwxyz", // lowercase "23456789", // digits "@#" // non-alphanumeric }; string[] randomChars1 = new[] { // uppercase "abcdefghjkmnpqrstuvwxyz", // lowercase "23456789", // digits // non-alphanumeric }; Random rand = new Random(); List chars = new List(); if (opts.RequireUppercase) chars.Insert(rand.Next(0, chars.Count), randomChars[0][rand.Next(0, randomChars[0].Length)]); if (opts.RequireLowercase) chars.Insert(rand.Next(0, chars.Count), randomChars[1][rand.Next(0, randomChars[1].Length)]); if (opts.RequireDigit) chars.Insert(rand.Next(0, chars.Count), randomChars[2][rand.Next(0, randomChars[2].Length)]); if (opts.RequireNonAlphanumeric) chars.Insert(rand.Next(0, chars.Count), randomChars[3][rand.Next(0, randomChars[3].Length)]); for (int i = chars.Count; i < opts.RequiredLength || chars.Distinct().Count() < opts.RequiredUniqueChars; i++) { string rcs = randomChars1[rand.Next(0, randomChars1.Length)]; chars.Insert(rand.Next(0, chars.Count), rcs[rand.Next(0, rcs.Length)]); } return new string(chars.ToArray()); } public async Task VerifyOtp(RequestOTPModel requestOTPModel, LoginResponse loginDetails) { JsonRxResponse jsonRx = new JsonRxResponse(); try { jsonRx = await _accountRepo.VerifyOtp(requestOTPModel, loginDetails); _logger.LogDebug("SubmitOTP | DB RESPONSE : " + JsonConvert.SerializeObject(jsonRx)); //if (jsonRx.ErrorCode.Equals("0")) //{ // List bodyMappings = new List(); // bodyMappings.Add(new Mapping() { SValue = "CustomerName", SText = loginDetails.FullName }); // bodyMappings.Add(new Mapping() { SValue = "CustomerId", SText = loginDetails.MembershipId.ToString() }); // bodyMappings.Add(new Mapping() { SValue = "UserId", SText = loginDetails.MembershipId }); // bodyMappings.Add(new Mapping() { SValue = "FirstName", SText = loginDetails.FullName }); // bodyMappings.Add(new Mapping() { SValue = "MiddleName", SText = loginDetails.FullName }); // bodyMappings.Add(new Mapping() { SValue = "LastName", SText = loginDetails.FullName }); // bodyMappings.Add(new Mapping() { SValue = "MobileNo", SText = loginDetails.MobileNumber }); // bodyMappings.Add(new Mapping() { SValue = "Address", SText = loginDetails.UserName }); // bodyMappings.Add(new Mapping() { SValue = "EMAIL_ID", SText = loginDetails.Email }); // bodyMappings.Add(new Mapping() { SValue = "RegisteredDate", SText = "" }); // SendNotificationRequest request = new SendNotificationRequest() // { // IsBulkNotification = false, // UserName = loginDetails.Email, // ProviderId = "BasicRegistration", // NotificationTypeId = NOTIFICATION_TYPE.EMAIL.ToString(), // Template = NotifyTemplate.BASIC_REGISTRATION_EMAIL, // Recipients = new List() // { // new RecipientViewModel() // { // NotificationContent = new NotificationDTO() { // Body = JsonConvert.SerializeObject(bodyMappings), // //Title will be set by mapping json // }, // Address= loginDetails.Email // } // } // }; // jsonRx = NotifierV2.SendNotification(request, NOTIFICATION_TYPE.EMAIL); //} //return jsonRx; return await Task.FromResult(jsonRx); } catch (Exception ex) { _logger.LogError("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Error occurred while calling RequestOTP."); return await Task.FromResult(jsonRx); } } public JsonRxResponse RequestOTP(RequestOTPModel requestOTPModel) { JsonRxResponse jsonRx = new JsonRxResponse(); try { requestOTPModel.OTP = Utilities.GenerateOTP(); jsonRx = _accountRepo.RequestOTP(requestOTPModel); _logger.LogDebug("GenerateOTP | RESPONSE : " + JsonConvert.SerializeObject(jsonRx)); if (jsonRx.ErrorCode == "0") { bool emailSent = false; bool smsSent = false; if (requestOTPModel.userId.IsValidEmail()) { if (!string.IsNullOrEmpty(jsonRx.ErrorCode) && jsonRx.ErrorCode.Equals("0")) { List bodyMappings = new List(); bodyMappings.Add(new Mapping() { SValue = "CustomerName", SText = requestOTPModel.CreatedBy }); //bodyMappings.Add(new Mapping() { SValue = "OTP_CODE", SText = requestOTPModel.OTP }); bodyMappings.Add(new Mapping() { SValue = "OTP_CODE", SText = jsonRx.Id }); bodyMappings.Add(new Mapping() { SValue = "TYPE", SText = requestOTPModel.requestFor }); try { SendNotificationRequest request = new SendNotificationRequest() { IsBulkNotification = false, UserName = requestOTPModel.CreatedBy, ControlNo = requestOTPModel.receiverId, ProviderId = "REQUESTOTP_EMAIL", Template = NotifyTemplate.OTP_EMAIL, Recipients = new List() { new RecipientViewModel() { NotificationContent = new NotificationDTO() { Body = JsonConvert.SerializeObject(bodyMappings), //Title will be set by mapping json }, Address= requestOTPModel.CreatedBy, DeviceType = requestOTPModel.DeviceType, } } }; _logger.LogDebug("SendNotification.EMAIL | REQUEST : " + JsonConvert.SerializeObject(request)); var jsonRx1 = NotifierV2.SendNotification(request, NOTIFICATION_TYPE.EMAIL); _logger.LogDebug("SendNotification.EMAIL | RESPONSE : " + JsonConvert.SerializeObject(jsonRx1)); emailSent = true; } catch (Exception emailException) { _logger.LogError("Error sending email", emailException); } try { string ProcessId = Guid.NewGuid().ToString().Replace("-", "") + ":sendSms"; string mobileNum = jsonRx.Extra2; var mobNum = getSenderFormattedNumber(mobileNum); SendSMSApiService _sendAPI = new SendSMSApiService(); StringBuilder s = new StringBuilder(); s.AppendLine($"Dear {jsonRx.Extra}"); s.AppendLine($"Your OTP code for Customer Registration is {requestOTPModel.OTP}."); s.AppendLine("Regards, IME London"); SMSRequestModel _req = new SMSRequestModel { ProviderId = "onewaysms", MobileNumber = mobileNum, SMSBody = s.ToString(), ProcessId = ProcessId.Substring(ProcessId.Length - 40, 40), RequestedBy = requestOTPModel.userId, UserName = requestOTPModel.userId, method = "send", ControlNo = "", // GetControlNo() }; _logger.LogDebug("SendNotification.SMS | REQUEST : " + JsonConvert.SerializeObject(_req)); APIJsonResponse _resp = _sendAPI.SMSTPApi(_req); _logger.LogDebug("SendNotification.SMS | RESPONSE : " + JsonConvert.SerializeObject(_resp)); smsSent = true; } catch (Exception smsException) { _logger.LogError("Error sending SMS", smsException); } if (emailSent || smsSent) { jsonRx.ErrorCode = "0"; jsonRx.SetResponse("0", "OTP has been Sent."); return jsonRx; } } } } else { jsonRx.ErrorCode = "1"; return new JsonRxResponse { ErrorCode = jsonRx.ErrorCode, Msg = jsonRx.Msg }; } jsonRx.ErrorCode = jsonRx.ErrorCode == "103" ? "0" : jsonRx.ErrorCode;//103 = previous OTP was not expired so same was used return jsonRx; } catch (Exception ex) { _logger.LogError("Something Went Wrong, Please Try Again!!", ex); jsonRx.SetResponse("1", "Error occurred while calling RequestOTP."); return jsonRx; } } private string getSenderFormattedNumber(string number) { string finalNo = number; if (!number.Contains("+44")) { string mobileFirst = number.Substring(0, 1); if (mobileFirst == "0") { if (number.Length == 11) { finalNo = "+44" + number.Substring(1, number.Length - 1); return finalNo; } else if (number.Length < 11) { finalNo = $"+44{number}"; } } else if (number.Substring(0, 1) != "0" && number.Length == 10) { finalNo = $"+44{number}"; } } else if (number.Contains("+44")) { string MobN = number.Substring(4, 1); if (MobN == "0" && number.Length > 14) { finalNo = number.Remove(4, 1); } } if (!finalNo.Substring(0, 1).Contains("+")) finalNo = $"+{finalNo}"; return finalNo; } } }