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