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));
        }