router_utils.nim 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # SPDX-License-Identifier: AGPL-3.0-only
  2. import strutils, sequtils, uri, tables, json
  3. from jester import Request, cookies
  4. import ../views/general
  5. import ".."/[utils, prefs, types]
  6. export utils, prefs, types, uri, json
  7. template savePref*(pref, value: string; req: Request; expire=false) =
  8. if not expire or pref in cookies(req):
  9. let sameSite = if cfg.useHttps: None else: Lax
  10. setCookie(pref, value, daysForward(when expire: -10 else: 360),
  11. httpOnly=true, secure=cfg.useHttps, sameSite=sameSite, path="/")
  12. template requestPrefs*(): untyped {.dirty.} =
  13. getPrefs(cookies(request), params(request))
  14. template showError*(error: string; cfg: Config): string =
  15. renderMain(renderError(error), request, cfg, requestPrefs(), "Error")
  16. template getPath*(): untyped {.dirty.} =
  17. $(parseUri(request.path) ? filterParams(request.params))
  18. template refPath*(): untyped {.dirty.} =
  19. if @"referer".len > 0: @"referer" else: "/"
  20. template getCursor*(): string =
  21. let cursor = @"cursor"
  22. decodeUrl(if cursor.len > 0: cursor else: @"max_position", false)
  23. template getCursor*(req: Request): string =
  24. let cursor = req.params.getOrDefault("cursor")
  25. decodeUrl(if cursor.len > 0: cursor
  26. else: req.params.getOrDefault("max_position"), false)
  27. proc getNames*(name: string): seq[string] =
  28. name.strip(chars={'/'}).split(",").filterIt(it.len > 0)
  29. template applyUrlPrefs*() {.dirty.} =
  30. if @"prefs".len > 0:
  31. var prefParams = initTable[string, string]()
  32. for pair in @"prefs".split(','):
  33. let kv = pair.split('=', maxsplit=1)
  34. if kv.len == 2:
  35. prefParams[kv[0]] = kv[1]
  36. elif kv.len == 1 and kv[0].len > 0:
  37. prefParams[kv[0]] = ""
  38. genApplyPrefs(prefParams, request)
  39. # Rebuild URL without prefs param
  40. var params: seq[(string, string)]
  41. for k, v in request.params:
  42. if k != "prefs":
  43. params.add (k, v)
  44. if params.len > 0:
  45. let cleanUrl = request.getNativeReq.url ? params
  46. redirect($cleanUrl)
  47. else:
  48. redirect(request.path)
  49. template respJson*(node: JsonNode) =
  50. resp $node, "application/json"