app.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. import contextlib
  2. import os
  3. import flask
  4. import pystache
  5. import sys
  6. import lc.config as c
  7. import lc.error as e
  8. import lc.model as m
  9. import lc.request as r
  10. app = flask.Flask(__name__)
  11. loader = pystache.loader.Loader(extension="mustache", search_dirs=["templates"])
  12. def render(name, **kwargs):
  13. """Load and use a Mustache template from the project root"""
  14. template = loader.load_name(name)
  15. renderer = pystache.Renderer(missing_tags="strict", search_dirs=["templates"])
  16. return renderer.render(template, kwargs)
  17. class Endpoint:
  18. def api_post(self, *args, **kwargs) -> dict:
  19. raise NotImplemented
  20. def public(self, *args, **kwargs):
  21. raise NotImplemented
  22. def private(self, user, *args, **kwargs):
  23. return flask.redirect("/")
  24. def route(self, *args, **kwargs):
  25. if flask.request.method == "POST":
  26. try:
  27. return self.api_post(*args, **kwargs)
  28. except e.LCException as exn:
  29. return ({"status": exn.http_code(), "error": str(exn)}, exn.http_code())
  30. try:
  31. return self.public(*args, **kwargs)
  32. except e.LCException as exn:
  33. page = render(
  34. "main", title="error", content=f"shit's fucked yo: {exn}", user=None,
  35. )
  36. return (page, exn.http_code())
  37. def endpoint(cls):
  38. def func(*args, **kwargs):
  39. return cls().route(*args, **kwargs)
  40. func.__name__ = cls.__name__
  41. return func
  42. @app.route("/")
  43. @endpoint
  44. class Index(Endpoint):
  45. def public(self):
  46. return render("main", title="main", content="whoo", user=None)
  47. @app.route("/auth")
  48. @endpoint
  49. class Auth(Endpoint):
  50. def api_post(self):
  51. u = m.User.login(r.User.from_json(flask.request.data))
  52. return flask.redirect(u.base_url())
  53. @app.route("/u")
  54. def create_user():
  55. print(flask.request.data)
  56. u = m.User.from_request(r.User.from_json(flask.request.data))
  57. return flask.redirect(u.base_url())
  58. @app.route("/u/<string:user>")
  59. def get_user(user: str):
  60. u = m.User.by_slug(user)
  61. pg = int(flask.request.args.get("page", 0))
  62. links = u.get_links(page=pg)
  63. return render(
  64. "main", title=f"user {u.name}", content=render("linklist", links=links), user=u,
  65. )
  66. @app.route("/u/<string:user>/l")
  67. def create_link(user: str):
  68. pass
  69. @app.route("/u/<string:user>/l/<string:link>")
  70. def link(user: str, link: str):
  71. pass
  72. @app.route("/u/<string:user>/t/<path:tag>")
  73. def get_tagged_links(user: str, tag: str):
  74. u = m.User.by_slug(user)
  75. pg = int(flask.request.args.get("page", 0))
  76. t = u.get_tag(tag)
  77. links = t.get_links(page=pg)
  78. return render(
  79. "main", title=f"tag {tag}", content=render("linklist", links=links), user=u,
  80. )