FortuneHandler.cs 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. var context = Database.NoTrackingPool.Rent();
  36. try
  37. {
  38. var fortunes = await context.Fortune.ToListAsync().ConfigureAwait(false);
  39. var result = new List<Value>(fortunes.Count + 1);
  40. foreach (var fortune in fortunes)
  41. {
  42. result.Add(Value.FromDictionary(new Dictionary<Value, Value>()
  43. {
  44. ["id"] = fortune.Id,
  45. ["message"] = HttpUtility.HtmlEncode(fortune.Message)
  46. }));
  47. }
  48. result.Add(Value.FromDictionary(new Dictionary<Value, Value>()
  49. {
  50. ["id"] = 0,
  51. ["message"] = "Additional fortune added at request time."
  52. }));
  53. result.Sort((one, two) =>
  54. {
  55. var firstMessage = one.Fields["message"].AsString;
  56. var secondMessage = two.Fields["message"].AsString;
  57. return string.Compare(firstMessage, secondMessage, StringComparison.Ordinal);
  58. });
  59. return result;
  60. }
  61. finally
  62. {
  63. Database.NoTrackingPool.Return(context);
  64. }
  65. }
  66. #endregion
  67. }