FortuneHandler.cs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System.Web;
  2. using Benchmarks.Model;
  3. using Cottle;
  4. using GenHTTP.Api.Content;
  5. using GenHTTP.Api.Protocol;
  6. using GenHTTP.Modules.IO;
  7. using GenHTTP.Modules.Pages;
  8. using GenHTTP.Modules.Pages.Rendering;
  9. using Microsoft.EntityFrameworkCore;
  10. namespace Benchmarks.Tests;
  11. public class FortuneHandler : IHandler
  12. {
  13. #region Get-/Setters
  14. private TemplateRenderer Template { get; }
  15. #endregion
  16. #region Initialization
  17. public FortuneHandler()
  18. {
  19. var resource = Resource.FromAssembly("Template.html").Build();
  20. Template = Renderer.From(resource);
  21. }
  22. #endregion
  23. #region Functionality
  24. public ValueTask PrepareAsync() => new();
  25. public async ValueTask<IResponse> HandleAsync(IRequest request)
  26. {
  27. var data = new Dictionary<Value, Value>
  28. {
  29. ["cookies"] = Value.FromEnumerable(await GetFortunes())
  30. };
  31. return request.GetPage(await Template.RenderAsync(data)).Build();
  32. }
  33. private static async ValueTask<List<Value>> GetFortunes()
  34. {
  35. await using var context = DatabaseContext.CreateNoTracking();
  36. var fortunes = await context.Fortune.ToListAsync().ConfigureAwait(false);
  37. var result = new List<Value>(fortunes.Count + 1);
  38. foreach (var fortune in fortunes)
  39. {
  40. result.Add(Value.FromDictionary(new Dictionary<Value, Value>()
  41. {
  42. ["id"] = fortune.Id,
  43. ["message"] = HttpUtility.HtmlEncode(fortune.Message)
  44. }));
  45. }
  46. result.Add(Value.FromDictionary(new Dictionary<Value, Value>()
  47. {
  48. ["id"] = 0,
  49. ["message"] = "Additional fortune added at request time."
  50. }));
  51. result.Sort((one, two) =>
  52. {
  53. var firstMessage = one.Fields["message"].AsString;
  54. var secondMessage = two.Fields["message"].AsString;
  55. return string.Compare(firstMessage, secondMessage, StringComparison.Ordinal);
  56. });
  57. return result;
  58. }
  59. #endregion
  60. }