public async Task <HttpResponseMessage> FullCached([FromUri] PagingQueryInfo pagingInfo, string name = null, string code = null) { if (pagingInfo == null) { pagingInfo = new PagingQueryInfo(); } //prevent large data sets if (pagingInfo.Take > 50) { pagingInfo.Take = 50; } var now = DateTime.Now; var midnightToday = new DateTime(now.Year, now.Month, now.Day, 23, 59, 59, 999, DateTimeKind.Local); var secondsUntilMidnight = (int)Math.Round((midnightToday - DateTime.Now).TotalSeconds); //fetch data from PBZ api or from cache if exists var data = await InMemoryCache.GetOrSet("PbzRates", async() => await _pbzRepository.FetchAsync(), secondsUntilMidnight); //apply filters if set if (!string.IsNullOrEmpty(name)) { data = data.Where(m => m.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase)); } if (!string.IsNullOrEmpty(code)) { data = data.Where(m => m.CurrencyCode.Equals(code, StringComparison.CurrentCultureIgnoreCase)); } //provide data to helper class, to page it and create link information about previous and next page var paginator = new Paginator <Currency>(data, pagingInfo.Page, pagingInfo.Take); //paged data data = paginator.List; var response = Request.CreateResponse(HttpStatusCode.OK, new RatesModel { Links = paginator.GetPaginationLinks(Request.RequestUri.GetLeftPart(UriPartial.Path)), Data = data.ToList() }); response.Headers.Add("Cache-Control", string.Format("max-age={0}", secondsUntilMidnight)); return(response); }
public async Task <HttpResponseMessage> Get([FromUri] PagingQueryInfo pagingInfo, string name = null, string code = null) { if (pagingInfo == null) { pagingInfo = new PagingQueryInfo(); } //prevent large data sets if (pagingInfo.Take > 50) { pagingInfo.Take = 50; } //fetch data from PBZ api var data = await _pbzRepository.FetchAsync(); //apply filters if set if (!string.IsNullOrEmpty(name)) { data = data.Where(m => m.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase)); } if (!string.IsNullOrEmpty(code)) { data = data.Where(m => m.CurrencyCode.Equals(code, StringComparison.CurrentCultureIgnoreCase)); } //provide data to helper class, to page it and create link information about previous and next page var paginator = new Paginator <Currency>(data, pagingInfo.Page, pagingInfo.Take); //paged data data = paginator.List; return(Request.CreateResponse(HttpStatusCode.OK, new RatesModel { Links = paginator.GetPaginationLinks(Request.RequestUri.GetLeftPart(UriPartial.Path)), Data = data.ToList() })); }