Ejemplo n.º 1
0
        /// <summary>
        /// Add parameters to the method name if specified in the query string
        /// </summary>
        /// <param name="actorQueryParameters">Actor query parameters</param>
        /// <param name="httpContext">HttpContext</param>
        /// <returns>method name</returns>
        public static string GetMethodText(this ActorQueryParameters actorQueryParameters, HttpContext httpContext)
        {
            _ = actorQueryParameters ?? throw new ArgumentNullException(nameof(actorQueryParameters));
            _ = httpContext ?? throw new ArgumentNullException(nameof(httpContext));

            string method = "GetActors";

            // add the query parameters to the method name if exists
            if (httpContext.Request.Query.ContainsKey("q"))
            {
                method = $"{method}:q:{actorQueryParameters.Q}";
            }

            if (httpContext.Request.Query.ContainsKey("pageNumber"))
            {
                method = $"{method}:pageNumber:{actorQueryParameters.PageNumber}";
            }

            if (httpContext.Request.Query.ContainsKey("pageSize"))
            {
                method = $"{method}:pageSize:{actorQueryParameters.PageSize}";
            }

            return(method);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Get a list of Actors by search string
        ///
        /// The search is a "contains" search on actor name
        /// If q is empty, all actors are returned
        /// </summary>
        /// <param name="actorQueryParameters">search parameters</param>
        /// <returns>List of Actors or an empty list</returns>
        public async Task <IEnumerable <Actor> > GetActorsAsync(ActorQueryParameters actorQueryParameters)
        {
            if (actorQueryParameters == null)
            {
                throw new ArgumentNullException(nameof(actorQueryParameters));
            }

            string key = actorQueryParameters.GetKey();

            if (App.Cache && cache.Contains(key) && cache.Get(key) is List <Actor> ac)
            {
                return(ac);
            }

            string       sql = App.SearchService.GetActorIds(actorQueryParameters);
            List <Actor> res;

            if (!string.IsNullOrWhiteSpace(sql))
            {
                res = (List <Actor>) await InternalCosmosDBSqlQuery <Actor>(sql).ConfigureAwait(false);
            }
            else
            {
                res = new List <Actor>();
            }

            // add to cache
            if (App.Cache)
            {
                cache.Add(new CacheItem(key, res), cachePolicy);
            }

            return(res);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Search Actors Healthcheck
        /// </summary>
        /// <returns>HealthzCheck</returns>
        private async Task <HealthzCheck> SearchActorsAsync(string query, Dictionary <string, object> data = null)
        {
            const string name = "searchActors";

            ActorQueryParameters actorQuery = new ActorQueryParameters {
                Q = query
            };

            string path = "/api/actors?q=" + actorQuery.Q;

            stopwatch.Restart();

            try
            {
                _ = await DataService.Read <List <Actor> >(path, string.Empty).ConfigureAwait(false);

                return(BuildHealthzCheck(path, MaxResponseTime, null, data, name));
            }
            catch (Exception ex)
            {
                BuildHealthzCheck(path, MaxResponseTime, ex, data, name);

                // throw the exception so that HealthCheck logs
                throw;
            }
        }
Ejemplo n.º 4
0
 /// <summary>
 /// Get actors by search criteria
 /// </summary>
 /// <param name="actorQueryParameters">search criteria</param>
 /// <returns>List of Actor</returns>
 public Task <IEnumerable <Actor> > GetActorsAsync(ActorQueryParameters actorQueryParameters)
 {
     return(Task <IEnumerable <Actor> > .Factory.StartNew(() =>
     {
         return GetActors(actorQueryParameters);
     }));
 }
Ejemplo n.º 5
0
        public async Task <IActionResult> GetActorsAsync([FromQuery] ActorQueryParameters actorQueryParameters)
        {
            if (actorQueryParameters == null)
            {
                throw new ArgumentNullException(nameof(actorQueryParameters));
            }

            System.Collections.Generic.List <Middleware.Validation.ValidationError> list = actorQueryParameters.Validate();

            if (list.Count > 0)
            {
                Logger.LogWarning(
                    new EventId((int)HttpStatusCode.BadRequest, HttpStatusCode.BadRequest.ToString()),
                    nameof(GetActorsAsync),
                    "Invalid query string",
                    HttpContext);

                return(ResultHandler.CreateResult(list, Request.Path.ToString() + (Request.QueryString.HasValue ? Request.QueryString.Value : string.Empty)));
            }

            IActionResult res = await ResultHandler.Handle(dal.GetActorsAsync(actorQueryParameters), Logger).ConfigureAwait(false);

            // use cache dal on Cosmos 429 errors
            if (App.Cache && res is JsonResult jres && jres.StatusCode == 429)
            {
                res = await ResultHandler.Handle(App.CacheDal.GetActorsAsync(actorQueryParameters), Logger).ConfigureAwait(false);
            }

            return(res);
        }
Ejemplo n.º 6
0
        /// <summary>
        /// Get a list of Actors by search string
        ///
        /// The search is a "contains" search on actor name
        /// If q is empty, all actors are returned
        /// </summary>
        /// <param name="actorQueryParameters">search parameters</param>
        /// <returns>List of Actors or an empty list</returns>
        public async Task <IEnumerable <Actor> > GetActorsAsync(ActorQueryParameters actorQueryParameters)
        {
            _ = actorQueryParameters ?? throw new ArgumentNullException(nameof(actorQueryParameters));

            string sql = ActorSelect;

            int offset = actorQueryParameters.GetOffset();
            int limit  = actorQueryParameters.PageSize;

            string offsetLimit = string.Format(CultureInfo.InvariantCulture, ActorOffset, offset, limit);

            if (!string.IsNullOrEmpty(actorQueryParameters.Q))
            {
                // convert to lower and escape embedded '
                actorQueryParameters.Q = actorQueryParameters.Q.Trim().ToLowerInvariant().Replace("'", "''", System.StringComparison.OrdinalIgnoreCase);

                if (!string.IsNullOrEmpty(actorQueryParameters.Q))
                {
                    // get actors by a "like" search on name
                    sql += string.Format(CultureInfo.InvariantCulture, $" and contains(m.textSearch, @q) ");
                }
            }

            sql += ActorOrderBy + offsetLimit;

            QueryDefinition queryDefinition = new QueryDefinition(sql);

            if (!string.IsNullOrEmpty(actorQueryParameters.Q))
            {
                queryDefinition.WithParameter("@q", actorQueryParameters.Q);
            }

            return(await InternalCosmosDBSqlQuery <Actor>(queryDefinition).ConfigureAwait(false));
        }
Ejemplo n.º 7
0
        public async Task <IActionResult> GetActorsAsync([FromQuery] ActorQueryParameters actorQueryParameters)
        {
            _ = actorQueryParameters ?? throw new ArgumentNullException(nameof(actorQueryParameters));

            return(await ResultHandler.Handle(
                       dal.GetActorsAsync(actorQueryParameters), actorQueryParameters.GetMethodText(HttpContext), Constants.ActorsControllerException, logger)
                   .ConfigureAwait(false));
        }
Ejemplo n.º 8
0
        public async Task <IActionResult> GetActorsAsync([FromQuery] ActorQueryParameters actorQueryParameters)
        {
            if (actorQueryParameters == null)
            {
                throw new ArgumentNullException(nameof(actorQueryParameters));
            }

            return(await DataService.Read <List <Actor> >(Request).ConfigureAwait(false));
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Get actors by search criteria
        /// </summary>
        /// <param name="actorQueryParameters">search criteria</param>
        /// <returns>List of Actor</returns>
        public List <Actor> GetActors(ActorQueryParameters actorQueryParameters)
        {
            if (actorQueryParameters == null)
            {
                return(GetActors(string.Empty, 0, 100));
            }

            return(GetActors(actorQueryParameters.Q, actorQueryParameters.GetOffset(), actorQueryParameters.PageSize));
        }
Ejemplo n.º 10
0
        /// <summary>
        /// Get actors by search criteria
        /// </summary>
        /// <param name="actorQueryParameters">search criteria</param>
        /// <returns>List of Actor</returns>
        public Task <IEnumerable <Actor> > GetActorsAsync(ActorQueryParameters actorQueryParameters)
        {
            if (actorQueryParameters == null)
            {
                return(GetActorsAsync(string.Empty, 0, 100));
            }

            return(GetActorsAsync(actorQueryParameters.Q, actorQueryParameters.GetOffset(), actorQueryParameters.PageSize));
        }
Ejemplo n.º 11
0
        public void PageSizeInput_ValidateModel_ReturnsExpectedResult(int input, bool expectedResult)
        {
            // Arrange
            var queryParameters = new ActorQueryParameters();

            // Act
            var actualValue = IsValidProperty(queryParameters, input, "PageSize");

            // Assert
            Assert.Equal(expectedResult, actualValue);
        }
Ejemplo n.º 12
0
        public void QueryString_ValidateRegularExpression_ReturnsExpectedResult(string input, bool expectedResult)
        {
            // Arrange
            var queryParameter = new ActorQueryParameters();

            // Act
            var isValid = IsValidProperty(queryParameter, input, "Q");

            // Assert
            Assert.Equal(expectedResult, isValid);
        }
Ejemplo n.º 13
0
        public void GivenPageNumber_ValidateOffset_ReturnsExpectedResult(int pageNumber, int expectedResult)
        {
            // Arrange
            var queryParameters = new ActorQueryParameters {
                PageNumber = pageNumber
            };

            // Act
            var actualResult = queryParameters.GetOffset();

            // Assert
            Assert.Equal(expectedResult, actualResult);
        }
Ejemplo n.º 14
0
        /// <summary>
        /// Get a list of Actors by search string
        ///
        /// The search is a "contains" search on actor name
        /// If q is empty, all actors are returned
        /// </summary>
        /// <param name="actorQueryParameters">search parameters</param>
        /// <returns>List of Actors or an empty list</returns>
        public async Task <IEnumerable <Actor> > GetActorsAsync(ActorQueryParameters actorQueryParameters)
        {
            if (actorQueryParameters == null)
            {
                throw new ArgumentNullException(nameof(actorQueryParameters));
            }

            string key = actorQueryParameters.GetKey();

            if (App.UseCache && cache.Contains(key) && cache.Get(key) is List <Actor> ac)
            {
                return(ac);
            }

            string sql = ActorSelect;

            int offset = actorQueryParameters.GetOffset();
            int limit  = actorQueryParameters.PageSize;

            string offsetLimit = string.Format(CultureInfo.InvariantCulture, ActorOffset, offset, limit);

            if (!string.IsNullOrEmpty(actorQueryParameters.Q))
            {
                // convert to lower and escape embedded '
                actorQueryParameters.Q = actorQueryParameters.Q.Trim().ToLowerInvariant().Replace("'", "''", System.StringComparison.OrdinalIgnoreCase);

                if (!string.IsNullOrEmpty(actorQueryParameters.Q))
                {
                    // get actors by a "like" search on name
                    sql += string.Format(CultureInfo.InvariantCulture, $" and contains(m.textSearch, @q) ");
                }
            }

            sql += ActorOrderBy + offsetLimit;

            QueryDefinition queryDefinition = new QueryDefinition(sql);

            if (!string.IsNullOrEmpty(actorQueryParameters.Q))
            {
                queryDefinition.WithParameter("@q", actorQueryParameters.Q);
            }

            List <Actor> res = (List <Actor>) await InternalCosmosDBSqlQuery <Actor>(queryDefinition).ConfigureAwait(false);

            cache.Add(new System.Runtime.Caching.CacheItem(key, res), cachePolicy);

            return(res);
        }
Ejemplo n.º 15
0
        public async Task <IActionResult> GetActorsAsync([FromQuery] ActorQueryParameters actorQueryParameters)
        {
            Logger.LogInformation(nameof(GetActorsAsync), "Web Request", HttpContext);

            if (actorQueryParameters == null)
            {
                throw new ArgumentNullException(nameof(actorQueryParameters));
            }

            List <Middleware.Validation.ValidationError> list = actorQueryParameters.Validate();

            if (list.Count > 0)
            {
                Logger.LogWarning(new EventId((int)HttpStatusCode.BadRequest, HttpStatusCode.BadRequest.ToString()), nameof(GetActorsAsync), "Invalid query string", HttpContext);

                return(ResultHandler.CreateResult(list, Request.Path.ToString() + (Request.QueryString.HasValue ? Request.QueryString.Value : string.Empty)));
            }

            return(await DataService.Read <List <Actor> >(Request).ConfigureAwait(false));
        }
Ejemplo n.º 16
0
        public async Task <IActionResult> GetActorByIdAsync([FromRoute] string actorId)
        {
            Logger.LogInformation(nameof(GetActorByIdAsync), "Web Request", HttpContext);

            if (string.IsNullOrWhiteSpace(actorId))
            {
                throw new ArgumentNullException(nameof(actorId));
            }

            List <Middleware.Validation.ValidationError> list = ActorQueryParameters.ValidateActorId(actorId);

            if (list.Count > 0)
            {
                Logger.LogWarning(new EventId((int)HttpStatusCode.BadRequest, HttpStatusCode.BadRequest.ToString()), nameof(GetActorByIdAsync), "Invalid Actor Id", HttpContext);

                return(ResultHandler.CreateResult(list, Request.Path.ToString() + (Request.QueryString.HasValue ? Request.QueryString.Value : string.Empty)));
            }

            // return result
            return(await DataService.Read <Actor>(Request).ConfigureAwait(false));
        }
Ejemplo n.º 17
0
        /// <summary>
        /// Get actor IDs by search criteria
        /// </summary>
        /// <param name="actorQueryParameters">search criteria</param>
        /// <returns>Cosmos select statement</returns>
        public string GetActorIds(ActorQueryParameters actorQueryParameters)
        {
            List <Actor> list;

            if (actorQueryParameters == null)
            {
                list = GetActors(string.Empty, 0, 100);
            }
            else
            {
                list = GetActors(actorQueryParameters.Q, actorQueryParameters.GetOffset(), actorQueryParameters.PageSize);
            }

            string ids = string.Empty;

            if (list != null && list.Count > 0)
            {
                foreach (Actor a in list)
                {
                    ids += $"'{a.ActorId}',";
                }

                ids = ActorsSQL.Replace("{0}", ids[0..^ 1], StringComparison.Ordinal);
Ejemplo n.º 18
0
        public void GivenActorParameter_ValidateString_ReturnsValidMethodName(string queryProperty, string queryValue, ActorQueryParameters parameterObject)
        {
            // Arrange
            var logger   = new Mock <ILogger <ActorsController> >();
            var mockIDAL = new Mock <IDAL>();

            var controller = new ActorsController(logger.Object, mockIDAL.Object)
            {
                ControllerContext = new ControllerContext()
            };

            var request = new Dictionary <string, StringValues>
            {
                { queryProperty, queryValue }
            };

            var queryCollection = new QueryCollection(request);
            var query           = new QueryFeature(queryCollection);
            var features        = new FeatureCollection();

            features.Set <IQueryFeature>(query);

            controller.ControllerContext.HttpContext = new DefaultHttpContext(features);

            // Act
            var expectedResult = $"GetActors:{queryProperty}:{queryValue}";
            var actualResult   = parameterObject.GetMethodText(controller.HttpContext);

            // Assert
            Assert.Equal(expectedResult, actualResult);
        }