app.nim 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import os, strtabs, strutils, math, algorithm
  2. import nawak_mongrel, jdump
  3. import model, fortunes_tmpl
  4. when not defined(postgre_model) xor defined(redis_model):
  5. {.error: "please pass either -d:postgre_model or -d:redis_model to the compiler".}
  6. when defined(postgre_model):
  7. import model_postgre
  8. when defined(redis_model):
  9. import model_redis
  10. get "/json":
  11. var j: THello
  12. j.message = "Hello, World!"
  13. # jdump serialize the tuples of the model as json
  14. return response(jdump(j), "application/json")
  15. get "/plaintext":
  16. return response("Hello, World!", "text/plain")
  17. get "/db":
  18. let w = getWorld(random(10_000)+1)
  19. return response(jdump(w), "application/json")
  20. get "/fortunes":
  21. var fortunes = getAllFortunes()
  22. let new_fortune: TFortune =
  23. (id: 0,
  24. message: "Additional fortune added at request time.")
  25. fortunes.add new_fortune
  26. sort(fortunes, proc(x, y: TFortune): int =
  27. return cmp(x.message, y.message))
  28. return response(fortunes_tmpl(fortunes), "text/html; charset=utf-8")
  29. proc limit_queries(query_params: PStringTable): int =
  30. result = 1
  31. if query_params.hasKey("queries"):
  32. try:
  33. result = parseInt(query_params["queries"])
  34. except EInvalidValue: discard
  35. # clamp the number of queries
  36. if result < 1: result = 1
  37. elif result > 500: result = 500
  38. get "/queries":
  39. let queries = limit_queries(request.query)
  40. var world: seq[TWorld]
  41. world.newSeq(queries)
  42. for i in 0.. <queries:
  43. world[i] = getWorld random(10_000) + 1
  44. return response(jdump(world), "application/json")
  45. get "/updates":
  46. let queries = limit_queries(request.query)
  47. var world: seq[TWorld]
  48. world.newSeq(queries)
  49. for i in 0.. <queries:
  50. world[i] = getWorld(random(10_000) + 1)
  51. world[i].randomNumber = random(10_000) + 1
  52. updateWorld world[i]
  53. return response(jdump(world), "application/json")
  54. custom_page 404:
  55. # customize the content of the 404 page
  56. return response(404, """Nah, I've got nothing.<br>
  57. Here's a <b>404 Page Not Found</b> error for you.""")
  58. var nb_workers = 32
  59. if paramCount() > 0:
  60. try:
  61. nb_workers = paramStr(1).parseInt
  62. except ValueError:
  63. echo "Usage: app [number of workers]"
  64. echo " Will start with 32 workers by default"
  65. echo "Starting with " & $nb_workers & " workers"
  66. run(init=init_db, nb_threads=nb_workers)