public SampleBrowserViewModel( [ImportMany] IEnumerable<Lazy<SampleBase, ISampleMetadata>> samples, [ImportMany] IEnumerable<Lazy<TechDemoViewModel, ITechDemoMetadata>> techDemos) { DisplayName = "Sample Browser"; _categories = new[] { new SampleCategoryViewModel("Samples", samples.OrderBy(x => x.Metadata.SortOrder).Select(x => new SampleViewModel(x.Value))), new SampleCategoryViewModel("Tech Demos", techDemos.OrderBy(x => x.Metadata.SortOrder).Select(x => x.Value)) }; _selectedCategory = _categories[0]; }
public static async Task <HttpResponseMessage> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "samples")] HttpRequestMessage req, [Table(Constants.SamplesTableName)] CloudTable table, TraceWriter log, CancellationToken ct) { var categoriesQuery = table .CreateQuery <SampleCategory>() .Where(cat => cat.PartitionKey.Equals(nameof(SampleCategory)) && !cat.RowKey.Equals(Constants.DefaultCategoryIdForSaving)) .AsTableQuery() .SelectColumn(nameof(SampleCategory.Title)); var categories = (await table.ExecuteQuery(categoriesQuery, ct)) .OrderBy(cat => cat.ListingOrder) .ThenBy(cat => cat.Title) .ThenBy(cat => cat.Id) .ToArray(); var result = new List <SampleCategoryViewModel>(categories.Length); var etagSb = new StringBuilder(); etagSb.Append('"'); foreach (var category in categories) { var samplesQuery = table .CreateQuery <Sample>() .Where(smpl => smpl.PartitionKey.Equals(nameof(Sample)) && smpl.Category.Equals(category.Id)) .AsTableQuery() .SelectColumn(nameof(Sample.Category)) .SelectColumn(nameof(Sample.Title)) .SelectColumn(nameof(Sample.Description)) .SelectColumn(nameof(Sample.Keywords)); var samples = (await table.ExecuteQuery(samplesQuery, ct)) .OrderBy(cat => cat.ListingOrder) .ThenBy(cat => cat.Title) .ThenBy(cat => cat.Id) .ToArray(); var categoryVm = new SampleCategoryViewModel(category, samples); result.Add(categoryVm); etagSb.Append(categoryVm.SamplesHash.ToString("X")); } etagSb.Append('"'); var etag = etagSb.ToString(); if (req.Headers.IfMatch.Any(im => im.Tag.Equals(etag, StringComparison.OrdinalIgnoreCase))) { return(req.CreateResponse(HttpStatusCode.NotModified)); } var response = req.CreateResponse(HttpStatusCode.OK, result.ToArray()); response.Headers.CacheControl = new CacheControlHeaderValue { NoCache = false, Private = false, MaxAge = TimeSpan.FromHours(0.5), MustRevalidate = false, NoStore = false, NoTransform = true, MaxStale = true }; response.Headers.ETag = new EntityTagHeaderValue(etag, false); return(response); }