FortuneHandler.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using GenHTTP.Api.Content;
  4. using GenHTTP.Api.Content.Templating;
  5. using GenHTTP.Api.Protocol;
  6. using GenHTTP.Modules.IO;
  7. using GenHTTP.Modules.Scriban;
  8. using Benchmarks.Model;
  9. namespace Benchmarks.Tests
  10. {
  11. #region Factory
  12. public class FortuneHandlerBuilder : IHandlerBuilder
  13. {
  14. public IHandler Build(IHandler parent)
  15. {
  16. return new FortuneHandler(parent);
  17. }
  18. }
  19. #endregion
  20. public class FortuneHandler : IHandler, IPageRenderer
  21. {
  22. #region Get-/Setters
  23. public IHandler Parent { get; }
  24. private IHandler Page { get; }
  25. private IRenderer<TemplateModel> Template { get; }
  26. #endregion
  27. #region Supporting data structures
  28. public class FortuneModel : PageModel
  29. {
  30. public List<Fortune> Cookies { get; }
  31. public FortuneModel(IRequest request, IHandler handler, List<Fortune> cookies) : base(request, handler)
  32. {
  33. Cookies = cookies;
  34. }
  35. }
  36. #endregion
  37. #region Initialization
  38. public FortuneHandler(IHandler parent)
  39. {
  40. Parent = parent;
  41. Page = ModScriban.Page(Data.FromResource("Fortunes.html"), (r, h) => GetFortunes(r, h))
  42. .Title("Fortunes")
  43. .Build(this);
  44. Template = ModScriban.Template<TemplateModel>(Data.FromResource("Template.html")).Build();
  45. }
  46. #endregion
  47. #region Functionality
  48. public IResponse Handle(IRequest request) => Page.Handle(request);
  49. public IEnumerable<ContentElement> GetContent(IRequest request) => Enumerable.Empty<ContentElement>();
  50. public IResponseBuilder Render(TemplateModel model)
  51. {
  52. return model.Request.Respond()
  53. .Content(Template.Render(model))
  54. .Header("Content-Type", "text/html; charset=utf-8");
  55. }
  56. private FortuneModel GetFortunes(IRequest request, IHandler handler)
  57. {
  58. using var context = DatabaseContext.Create();
  59. var fortunes = context.Fortune.ToList();
  60. fortunes.Add(new Fortune() { Message = "Additional fortune added at request time." });
  61. fortunes.Sort();
  62. return new FortuneModel(request, handler, fortunes);
  63. }
  64. #endregion
  65. }
  66. }