예제 #1
0
        public ActivityResponse Search(ActivitySearchRequest model)
        {
            List <ActivitiesDto> result;

            if (string.IsNullOrEmpty(model.Search))
            {
                result = _bookingDbContext.Activities.OrderBy(a => a.Name).Skip(model.Start).Take(model.Limit)
                         .Select(a => _mapper.Map <ActivitiesDto>(a)).ToList();
                return(new ActivityResponse(200, result));
            }
            result = _bookingDbContext.Activities.Where(a => EF.Functions.Like(a.Name, "%" + model.Search.ToLower() + "%"))
                     .OrderBy(a => a.Name)
                     .Skip(model.Start).Take(model.Limit)
                     .Select(a => _mapper.Map <ActivitiesDto>(a)).ToList();
            return(new ActivityResponse(200, result));
        }
        /// <summary>
        /// Checks whether the activity search request is valid.
        /// </summary>
        /// <param name="ActivitySearchRequest">Activity search request part of the client's request message.</param>
        /// <param name="MessageBuilder">Client's network message builder.</param>
        /// <param name="RequestMessage">Full request message from client.</param>
        /// <param name="ErrorResponse">If the function fails, this is filled with error response message that is ready to be sent to the client.</param>
        /// <returns>true if the search request is valid, false otherwise.</returns>
        public static bool ValidateActivitySearchRequest(ActivitySearchRequest ActivitySearchRequest, ProxMessageBuilder MessageBuilder, ProxProtocolMessage RequestMessage, out ProxProtocolMessage ErrorResponse)
        {
            log.Trace("()");

            bool res = false;

            ErrorResponse = null;
            string details = null;

            int responseResultLimit = ProxMessageProcessor.ActivitySearchMaxResponseRecords;
            int totalResultLimit    = ProxMessageProcessor.ActivitySearchMaxTotalRecords;

            bool maxResponseRecordCountValid = (1 <= ActivitySearchRequest.MaxResponseRecordCount) &&
                                               (ActivitySearchRequest.MaxResponseRecordCount <= responseResultLimit);

            if (!maxResponseRecordCountValid)
            {
                log.Debug("Invalid maxResponseRecordCount value '{0}'.", ActivitySearchRequest.MaxResponseRecordCount);
                details = "maxResponseRecordCount";
            }

            if (details == null)
            {
                bool maxTotalRecordCountValid = (1 <= ActivitySearchRequest.MaxTotalRecordCount) &&
                                                (ActivitySearchRequest.MaxTotalRecordCount <= totalResultLimit) &&
                                                (ActivitySearchRequest.MaxResponseRecordCount <= ActivitySearchRequest.MaxTotalRecordCount);
                if (!maxTotalRecordCountValid)
                {
                    log.Debug("Invalid maxTotalRecordCount value '{0}'.", ActivitySearchRequest.MaxTotalRecordCount);
                    details = "maxTotalRecordCount";
                }
            }

            if ((details == null) && (ActivitySearchRequest.OwnerNetworkId.Length > 0))
            {
                bool ownerNetworkIdValid = ActivitySearchRequest.OwnerNetworkId.Length == ProtocolHelper.NetworkIdentifierLength;
                if (!ownerNetworkIdValid)
                {
                    log.Debug("Invalid owner network ID length '{0}'.", ActivitySearchRequest.OwnerNetworkId.Length);
                    details = "ownerNetworkId";
                }
            }

            if ((details == null) && (ActivitySearchRequest.Type != null))
            {
                bool typeValid = Encoding.UTF8.GetByteCount(ActivitySearchRequest.Type) <= ProxMessageBuilder.MaxActivitySearchTypeLengthBytes;
                if (!typeValid)
                {
                    log.Debug("Invalid type value length '{0}'.", ActivitySearchRequest.Type.Length);
                    details = "type";
                }
            }

            if ((details == null) && ((ActivitySearchRequest.StartNotAfter != 0) || (ActivitySearchRequest.ExpirationNotBefore != 0)))
            {
                DateTime?startNotAfter       = null;
                DateTime?expirationNotBefore = null;

                if (ActivitySearchRequest.StartNotAfter != 0)
                {
                    startNotAfter = ProtocolHelper.UnixTimestampMsToDateTime(ActivitySearchRequest.StartNotAfter);
                    bool startNotAfterValid = startNotAfter != null;
                    if (!startNotAfterValid)
                    {
                        log.Debug("Start not after {0} is not a valid timestamp value.", ActivitySearchRequest.StartNotAfter);
                        details = "startNotAfter";
                    }
                }

                if ((details == null) && (ActivitySearchRequest.ExpirationNotBefore != 0))
                {
                    expirationNotBefore = ProtocolHelper.UnixTimestampMsToDateTime(ActivitySearchRequest.ExpirationNotBefore);
                    bool expirationNotBeforeValid = expirationNotBefore != null;
                    if (!expirationNotBeforeValid)
                    {
                        log.Debug("Expiration not before {0} is not a valid timestamp value.", ActivitySearchRequest.ExpirationNotBefore);
                        details = "expirationNotBefore";
                    }
                    else if (ActivitySearchRequest.StartNotAfter != 0)
                    {
                        expirationNotBeforeValid = ActivitySearchRequest.StartNotAfter <= ActivitySearchRequest.ExpirationNotBefore;
                        if (!expirationNotBeforeValid)
                        {
                            log.Debug("Expiration not before {0} is smaller than start not after {1}.", ActivitySearchRequest.StartNotAfter, ActivitySearchRequest.ExpirationNotBefore);
                            details = "expirationNotBefore";
                        }
                    }
                }
            }

            if ((details == null) && (ActivitySearchRequest.Latitude != GpsLocation.NoLocationLocationType))
            {
                GpsLocation locLat  = new GpsLocation(ActivitySearchRequest.Latitude, 0);
                GpsLocation locLong = new GpsLocation(0, ActivitySearchRequest.Longitude);
                if (!locLat.IsValid())
                {
                    log.Debug("Latitude '{0}' is not a valid GPS latitude value.", ActivitySearchRequest.Latitude);
                    details = "latitude";
                }
                else if (!locLong.IsValid())
                {
                    log.Debug("Longitude '{0}' is not a valid GPS longitude value.", ActivitySearchRequest.Longitude);
                    details = "longitude";
                }
            }

            if ((details == null) && (ActivitySearchRequest.Latitude != GpsLocation.NoLocationLocationType))
            {
                bool radiusValid = ActivitySearchRequest.Radius > 0;
                if (!radiusValid)
                {
                    log.Debug("Invalid radius value '{0}'.", ActivitySearchRequest.Radius);
                    details = "radius";
                }
            }

            if ((details == null) && (ActivitySearchRequest.ExtraData != null))
            {
                bool validLength    = (Encoding.UTF8.GetByteCount(ActivitySearchRequest.ExtraData) <= ProxMessageBuilder.MaxActivitySearchExtraDataLengthBytes);
                bool extraDataValid = RegexTypeValidator.ValidateRegex(ActivitySearchRequest.ExtraData);
                if (!validLength || !extraDataValid)
                {
                    log.Debug("Invalid extraData regular expression filter.");
                    details = "extraData";
                }
            }

            if (details == null)
            {
                res = true;
            }
            else
            {
                ErrorResponse = MessageBuilder.CreateErrorInvalidValueResponse(RequestMessage, details);
            }

            log.Trace("(-):{0}", res);
            return(res);
        }
예제 #3
0
        public IActionResult Search([FromQuery] ActivitySearchRequest model)
        {
            var response = _activityService.Search(model);

            return(StatusCode(response.StatusCode, response));
        }