public OffersResponse(string RequestId, bool status = false) { this.Status = status; this.Data = new OffersDataObject(); this.Meta = new MetaDataObject(RequestId); }
/// <summary> /// Function that will return offers depending on the request (LiveOffers or TestOffers) with PID /// </summary> /// <param name="Request"></param> /// <param name="ApiUser"></param> /// <param name="pid"></param> /// <param name="respondentAttributes"></param> /// <returns></returns> public OffersDataObject GetOffersByPid(HttpRequestMessage Request, string ApiUser, string pid) { LoggingUtility log = LoggerFactory.GetLogger(); OffersDataObject data = new OffersDataObject(); String requestId = Request.Properties["requestId"].ToString(); Dictionary<string, string> parameters = new Dictionary<string, string>(); OfferFilter OfferType = GetOfferType(Request.GetRouteData().Values["controller"].ToString()); string OperationName = operationName.GetOffersPID.ToString(); int errorKey = ErrorKey.ERR_INTERNAL_FATAL; parameters.Add("RespondentId", pid); log.ProcessingDebug(requestId, "Received GET " + OfferType + "s with pid request."); try { var excludedOffers = new List<Guid>(); log.ProcessingDebug(requestId, "Getting request attributes from URL."); Dictionary<string, string> respondentAttributes = GetRequestAttributes(Request); foreach (var respondentAttribute in respondentAttributes) { parameters.Add(respondentAttribute.Key, respondentAttribute.Value); } if (VerifyRequiredAttributes(respondentAttributes)) { // handle the PID attribute, get/update attributes in respondent catalog // Before each internal web service call we have to set the error key to the PROVIDER_BACKEND_UNAVAILABLE to be able to show the provider the correct message errorKey = ErrorKey.ERR_PROVIDER_BACKEND_UNAVAILABLE; log.ProcessingDebug(requestId, "Calling LiveMatch to get the internal pid."); var internalPid = LiveMatch().GetInternalPid(pid, ApiUser, requestId); // The internal web service call succeeded so we reset back the error key to the internal key errorKey = ErrorKey.ERR_INTERNAL_FATAL; if (!string.IsNullOrEmpty(internalPid)) { errorKey = ErrorKey.ERR_PROVIDER_BACKEND_UNAVAILABLE; log.ProcessingDebug(requestId, "Updating attributes to respondent catalog."); if (AddRespondentCatalogAttributes(respondentAttributes, internalPid)) { errorKey = ErrorKey.ERR_INTERNAL_FATAL; log.ProcessingDebug(requestId, "Getting " + OfferType + "s from the database."); List<OfferApiObject> offers = RetrieveOffers(respondentAttributes, ApiUser, OfferType); if (offers != null && offers.Count > 0) { errorKey = ErrorKey.ERR_PROVIDER_BACKEND_UNAVAILABLE; log.ProcessingDebug(requestId, "Fetching non panelist studies."); var studiesList = (FetchNonPanelistStudies(offers, internalPid, requestId)); errorKey = ErrorKey.ERR_INTERNAL_FATAL; if (studiesList != null && studiesList.Count > 0) offers = (RetrieveExludedOffers(studiesList, offers)); if (offers != null && offers.Count > 0) { data.Offers = offers; } else { data.Errors.Add(new ErrorObject(ErrorKey.ERR_PROVIDER_NO_MATCHING_OFFERS)); } } //There is no matching offers else { data.Errors.Add(new ErrorObject(ErrorKey.ERR_PROVIDER_NO_MATCHING_OFFERS)); } } else { data.Errors.Add(new ErrorObject(errorKey)); } } } else data.Errors.Add(new ErrorObject(ErrorKey.ERR_PROVIDER_MISSING_DATA_ARGUMENTS)); } catch (Exception e) { data.Errors.Add(new ErrorObject(errorKey)); log.ErrorJson(new Methods().Exception_ToLogObject(requestId, ApiUser, OperationType, OperationName, e)); } finally { //If the response has errors, insert an error message into the logs //Edit for R184 if (data.Errors.Count != 0) { log.InfoJson(new Methods().Error_ToLogObject(requestId, ApiUser, OperationType, OperationName, parameters, data.Errors)); log.ProcessingDebug(requestId, "GET " + OfferType + "s with PID request was unsuccessful."); } //The response has no errors, we insert a request successful message into the logs else { log.InfoJson(new Methods().Response_ToLogObject(requestId, ApiUser, OperationType, OperationName, parameters, data)); log.ProcessingDebug(requestId, "GET " + OfferType + "s with PID request was successful."); } } return data; }
public void GetLiveOffersWithPIDTest() { var IOffersManager = new Mock<IOffersManager>(); OkNegotiatedContentResult<OffersResponse> response; OffersDataObject OffersData = new OffersDataObject() { Errors = new List<ErrorObject>(), Offers = new List<OfferApiObject>() { new OfferApiObject() } }; IOffersManager.Setup(i => i.GetOffersByPid(It.IsAny<HttpRequestMessage>(), It.IsAny<string>(),It.IsAny<string>())).Returns(OffersData); controller = new InitController("Liveoffers").initLiveOffersController(IOffersManager.Object); response = controller.Get(It.IsAny<string>()) as OkNegotiatedContentResult<OffersResponse>; Assert.NotNull(response.Content.Data.Offers); Assert.Null(response.Content.Data.Errors); }
/// <summary> /// Function that will return offers depending on the request (LiveOffers or TestOffers) without PID /// </summary> /// <param name="Request"></param> /// <param name="ApiUser"></param> /// <returns></returns> public OffersDataObject GetOffers(HttpRequestMessage Request, string ApiUser) { LoggingUtility log = LoggerFactory.GetLogger(); OffersDataObject data = new OffersDataObject(); String requestId = Request.Properties["requestId"].ToString(); Dictionary<string, string> parameters = new Dictionary<string, string>(); OfferFilter OfferType = GetOfferType(Request.GetRouteData().Values["controller"].ToString()); string OperationName = (OfferType.Equals(OfferFilter.TestOffer)) ? operationName.GetAllTestOffers.ToString() : operationName.GetAllLiveOffers.ToString(); log.ProcessingDebug(requestId, "Received GET " + OfferType + "s request."); try { log.ProcessingDebug(requestId, "Getting request attributes from URL."); Dictionary<string, string> respondentAttributes = GetRequestAttributes(Request); foreach (var respondentAttribute in respondentAttributes) { parameters.Add(respondentAttribute.Key, respondentAttribute.Value); } log.ProcessingDebug(requestId, "Getting " + OfferType + "s from database."); var offers = RetrieveOffers(respondentAttributes, ApiUser, OfferType); //Check if active offers count is greater than 0 fill the response envelope data if (offers != null && offers.Count() > 0) { //Filling the data object in the response envelope with the LiveOffers list data.Offers = offers; } else { if (respondentAttributes.Count == 0) data.Errors.Add(new ErrorObject(ErrorKey.ERR_PROVIDER_NO_AVAILABLE_OFFER)); else data.Errors.Add(new ErrorObject(ErrorKey.ERR_PROVIDER_NO_MATCHING_OFFERS)); } } catch (Exception e) { data.Errors.Add(new ErrorObject(ErrorKey.ERR_INTERNAL_FATAL)); log.InfoJson(new Methods().Exception_ToLogObject(requestId, ApiUser, OperationType, OperationName, e)); } finally { //If the response has errors, insert an error message into the logs //Edit for R184 if (data.Errors.Count != 0) { log.InfoJson(new Methods().Error_ToLogObject(requestId, ApiUser, OperationType, OperationName, parameters, data.Errors)); log.ProcessingDebug(requestId, "GET " + OfferType + "s request was unsuccessful."); } //The response has no errors, we insert a request successful message into the logs else { log.InfoJson(new Methods().Response_ToLogObject(requestId, ApiUser, OperationType, OperationName, parameters, data.Offers)); log.ProcessingDebug(requestId, "GET " + OfferType + "s request was successful."); } } return data; }
public void GetLiveOffersWithPIDFailureTest() { var IOffersManager = new Mock<IOffersManager>(); OkNegotiatedContentResult<OffersResponse> response; OffersDataObject OffersData = new OffersDataObject() { Errors = new List<ErrorObject>() { new ErrorObject(ErrorKey.ERR_INTERNAL_FATAL) }, Offers = null }; IOffersManager.Setup(i => i.GetOffersByPid(It.IsAny<HttpRequestMessage>(), It.IsAny<string>(), It.IsAny<string>())).Returns(OffersData); controller = new InitController("Liveoffers").initLiveOffersController(IOffersManager.Object); response = controller.Get(It.IsAny<string>()) as OkNegotiatedContentResult<OffersResponse>; Assert.Null(response.Content.Data.Offers); Assert.NotNull(response.Content.Data.Errors); Assert.True(response.Content.Data.Errors.Exists(i => i.Code == 3000)); }