using System.Collections.Generic; using System.Threading.Tasks; using System.Linq; using System.Web; using GenHTTP.Api.Content; using GenHTTP.Api.Content.Templating; using GenHTTP.Api.Protocol; using GenHTTP.Modules.IO; using GenHTTP.Modules.Razor; using Benchmarks.Model; namespace Benchmarks.Tests { #region Factory public class FortuneHandlerBuilder : IHandlerBuilder { public IHandler Build(IHandler parent) { return new FortuneHandler(parent); } } #endregion #region Supporting data structures public sealed class FortuneModel : PageModel { public List Cookies { get; } public FortuneModel(IRequest request, IHandler handler, List cookies) : base(request, handler) { Cookies = cookies; } } #endregion public class FortuneHandler : IHandler, IPageRenderer { #region Get-/Setters public IHandler Parent { get; } private IHandler Page { get; } private IRenderer Template { get; } #endregion #region Initialization public FortuneHandler(IHandler parent) { Parent = parent; Page = ModRazor.Page(Resource.FromAssembly("Fortunes.html"), (r, h) => GetFortunes(r, h)) .Title("Fortunes") .AddAssemblyReference() .AddUsing("System.Web") .Build(this); Template = ModRazor.Template(Resource.FromAssembly("Template.html")).Build(); } #endregion #region Functionality public ValueTask HandleAsync(IRequest request) => Page.HandleAsync(request); public IEnumerable GetContent(IRequest request) => Enumerable.Empty(); public async ValueTask RenderAsync(TemplateModel model) { return model.Request.Respond() .Content(await Template.RenderAsync(model)) .Header("Content-Type", "text/html; charset=utf-8"); } private FortuneModel GetFortunes(IRequest request, IHandler handler) { using var context = DatabaseContext.CreateNoTracking(); var fortunes = context.Fortune.ToList(); fortunes.Add(new Fortune() { Message = "Additional fortune added at request time." }); fortunes.Sort(); return new FortuneModel(request, handler, fortunes); } #endregion } }