public HttpResponseMessage PendingVerification(SenderRequestModel requestModel) { if (!ModelState.IsValid) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Invalid Request"); } requestModel = new SenderRequestModel() { CountryName = requestModel.CountryName, PhoneNumber = requestModel.PhoneNumber, IsoCodes = requestModel.IsoCodes.ToUpper(), ErrorMessage = requestModel.ErrorMessage, IsSmsSuccessfull = requestModel.IsSmsSuccessfull, SmsRequestId = requestModel.SmsRequestId }; VerificationAction verifyActions = new VerificationAction(); SenderResponseModel responseModel = verifyActions.SenderRequest(requestModel); if (responseModel.Error != null) { return Request.CreateResponse(HttpStatusCode.OK, responseModel, "application/json"); } return Request.CreateResponse(HttpStatusCode.OK, responseModel, "application/json"); }
public SenderResponseModel SenderRequest(SenderRequestModel requestModel) { VerificationCase verifycase = new VerificationCase(); return verifycase.SenderRequest(requestModel); }
/// <summary> /// Sender Entertain Sms Request One By One /// </summary> /// <param name="requestModel"></param> /// <returns></returns> public SenderResponseModel SenderRequest(SenderRequestModel requestModel) { SenderResponseModel responseModel = new SenderResponseModel(); DurationOfNextRequestToServerFromSender = SmsSendingInterval + SmsReceivingInterval + threeAttemptsByServer; #region //Check Whether SMS sent Or Not or Did sender previously entertained any request if (requestModel.IsSmsSuccessfull == true && requestModel.ErrorMessage == null) { var GetSmsRequestObject = listOfSmsModel.Where(x => x.UniqueId == requestModel.SmsRequestId).FirstOrDefault(); // Mark status as sent GetSmsRequestObject.IsSmsSuccessfull = true; GetSmsRequestObject.ErrorMessage = null; GetSmsRequestObject.SmsState = "Sent"; } else if (requestModel.IsSmsSuccessfull == false && requestModel.ErrorMessage != null) { var GetSmsRequestObject = listOfSmsModel.Where(x => x.UniqueId == requestModel.SmsRequestId).FirstOrDefault(); //Mark Status as Read GetSmsRequestObject.IsSmsSuccessfull = false; GetSmsRequestObject.ErrorMessage = requestModel.ErrorMessage; GetSmsRequestObject.SmsState = "NotSent"; } else if (requestModel.IsSmsSuccessfull == false && requestModel.ErrorMessage == null) { //Nothing To Do Means this Incoming Request from Sender Not Previously entertain any sms Request } #endregion #region //Check If Any pool Exist var IsPoolExist = PoolList.Any(); if (!IsPoolExist) { responseModel.IsValid = false; responseModel.Error = "No Pool Exist"; return responseModel; } #endregion #region //Check If Country Exist in atleast one pool bool IsCountryExistInAnyPool = false; foreach (var item in PoolList) { if (item.CountryCodes.Contains(requestModel.IsoCodes)) { IsCountryExistInAnyPool = true; break; } } if (!IsCountryExistInAnyPool) { responseModel.IsValid = false; responseModel.Error = "No Pool Contains Specified Country"; return responseModel; } #endregion #region //Add number to specific pool if not already exist bool IsContain = false; foreach (var item in PoolList) { //Check if current pools contains this country if (item.CountryCodes.Contains(requestModel.IsoCodes)) { //Check if this is 1st sender if (item.ListOfSenders.Count == 0) { item.ListOfSenders.Add( new ListOfSender { CoutryName = requestModel.CountryName, IsoCode = requestModel.IsoCodes, MobileNumber = requestModel.PhoneNumber, IsActive = true }); } //Check if this sender is already in this pool foreach (var phonenumbers in item.ListOfSenders) { //Ifnumber exist then update object if (phonenumbers.MobileNumber == requestModel.PhoneNumber) { phonenumbers.LastAppear = DateTime.Now; //phonenumbers.NextAppearTime = phonenumbers.LastAppear.AddSeconds(DurationOfNextRequest); IsContain = true; break; } } //If sender is not in pool then add sender to current pool if (!IsContain) { item.ListOfSenders.Add( new ListOfSender { CoutryName = requestModel.CountryName, IsoCode = requestModel.IsoCodes, MobileNumber = requestModel.PhoneNumber, LastAppear = DateTime.Now, IsActive = true //NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequest) }); } } } #endregion #region //Get All Request var getRequest = listOfSmsModel.OrderBy(x => x.RequestTime).Where(x => x.SmsState == "Unread" && x.CountryCode == requestModel.IsoCodes).ToList(); #endregion #region //GetSenderObject var GetSenderObject = (from pool in PoolList from sendersList in pool.ListOfSenders where sendersList.MobileNumber == requestModel.PhoneNumber select sendersList).FirstOrDefault(); GetSenderObject.IsActive = true; //Set Active Property o true #endregion #region //If no request exist then set next possible time to come if (getRequest == null || getRequest.Count == 0) { var sendersList = (from pool in PoolList from sendersLists in pool.ListOfSenders where pool.CountryCodes.Contains(requestModel.IsoCodes) select sendersLists).ToList(); #region //If one sender then set next appear time of sender if (sendersList.Count == 1) { GetSenderObject.NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender); //sendersList.OrderByDescending(x => x.NextAppearTime).FirstOrDefault().NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender); responseModel.Error = null; responseModel.IsValid = true; responseModel.EstimatedTimeToComeAgain = DurationOfNextRequestToServerFromSender; responseModel.IsRequestexist = false; return responseModel; } #endregion #region //Check if any sender has to come after datetime.Now ListOfSender highestNextAppearTimeObject = sendersList.OrderByDescending(x => x.NextAppearTime).ElementAt(0); //if No sender Then add default time in datetime.Now and return defautl time interval to sender if (highestNextAppearTimeObject.NextAppearTime < DateTime.Now) { GetSenderObject.NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender); //sendersList.OrderByDescending(x => x.NextAppearTime).FirstOrDefault().NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender); responseModel.EstimatedTimeToComeAgain = DurationOfNextRequestToServerFromSender; responseModel.Error = null; responseModel.IsValid = true; responseModel.IsRequestexist = false; return responseModel; } #endregion #region //Set Next Appear Time for sender According to highesttimeOfSender GetSenderObject.NextAppearTime = highestNextAppearTimeObject.NextAppearTime.AddSeconds(DurationOfNextRequestToServerFromSender); responseModel.EstimatedTimeToComeAgain = (GetSenderObject.NextAppearTime - DateTime.Now).TotalSeconds; responseModel.Error = null; responseModel.IsValid = true; responseModel.IsRequestexist = false; return responseModel; #endregion } #endregion #region //Assign To Sender getRequest[0].SmsState = "Read"; getRequest[0].SenderId = requestModel.PhoneNumber; #endregion #region //Set Next Appear Time for sender Not fixed GetSenderObject.NextAppearTime = DateTime.Now.AddSeconds(DurationOfNextRequestToServerFromSender); #endregion #region //Return Response responseModel.PhoneNumber = getRequest[0].PhoneNumber; responseModel.Code = getRequest[0].PinCode; responseModel.EstimatedTimeToComeAgain = 0; responseModel.IsRequestexist = true; responseModel.SmsRequestId = getRequest[0].UniqueId; responseModel.IsValid = true; responseModel.Error = null; return responseModel; #endregion }