Browse Source

Start handling route dispatch a bit better

Getty Ritter 4 years ago
parent
commit
fa51c7983a
1 changed files with 44 additions and 37 deletions
  1. 44 37
      lc/app.py

+ 44 - 37
lc/app.py

@@ -20,81 +20,88 @@ def render(name, **kwargs):
     return renderer.render(template, kwargs)
 
 
-def handle_errors(func):
-    def __wrapped__(*args, **kwargs):
+class Endpoint:
+    def api_post(self, *args, **kwargs) -> dict:
+        raise NotImplemented
+
+    def public(self, *args, **kwargs):
+        raise NotImplemented
+
+    def private(self, user, *args, **kwargs):
+        return flask.redirect("/")
+
+    def route(self, *args, **kwargs):
+        if flask.request.method == "POST":
+            try:
+                return self.api_post(*args, **kwargs)
+            except e.LCException as exn:
+                return ({"status": exn.http_code(), "error": str(exn)}, exn.http_code())
+
         try:
-            return func(*args, **kwargs)
+            return self.public(*args, **kwargs)
         except e.LCException as exn:
-            return (
-                render("main",
-                       title="error",
-                       content=f"shit's fucked yo: {exn}",
-                       user=None
-                ),
-                e.http_code(),
+            page = render(
+                "main", title="error", content=f"shit's fucked yo: {exn}", user=None,
             )
+            return (page, exn.http_code())
 
-    __wrapped__.__name__ = func.__name__
-    return __wrapped__
+
+def endpoint(cls):
+    def func(*args, **kwargs):
+        return cls().route(*args, **kwargs)
+
+    func.__name__ = cls.__name__
+    return func
 
 
 @app.route("/")
-@handle_errors
-def index():
-    return render("main", title="main", content="whoo", u=None)
+@endpoint
+class Index(Endpoint):
+    def public(self):
+        return render("main", title="main", content="whoo", user=None)
 
 
-@app.route("/auth", methods=["POST"])
-@handle_errors
-def auth():
-    u = m.User.login(r.User.from_json(flask.request.data))
-    return flask.redirect(u.base_url())
+@app.route("/auth")
+@endpoint
+class Auth(Endpoint):
+    def api_post(self):
+        u = m.User.login(r.User.from_json(flask.request.data))
+        return flask.redirect(u.base_url())
 
 
-@app.route("/u", methods=["POST"])
-@handle_errors
+@app.route("/u")
 def create_user():
     print(flask.request.data)
     u = m.User.from_request(r.User.from_json(flask.request.data))
     return flask.redirect(u.base_url())
 
 
-@app.route("/u/<string:user>", methods=["GET", "POST"])
-@handle_errors
+@app.route("/u/<string:user>")
 def get_user(user: str):
     u = m.User.by_slug(user)
     pg = int(flask.request.args.get("page", 0))
     links = u.get_links(page=pg)
     return render(
-        "main",
-        title=f"user {u.name}",
-        content=render("linklist", links=links),
-        user=u,
+        "main", title=f"user {u.name}", content=render("linklist", links=links), user=u,
     )
 
 
-@app.route("/u/<string:user>/l", methods=["POST"])
-@handle_errors
+@app.route("/u/<string:user>/l")
 def create_link(user: str):
     pass
 
 
-@app.route("/u/<string:user>/l/<string:link>", methods=["GET", "POST"])
-@handle_errors
+@app.route("/u/<string:user>/l/<string:link>")
 def link(user: str, link: str):
     pass
 
 
 @app.route("/u/<string:user>/t/<path:tag>")
-@handle_errors
 def get_tagged_links(user: str, tag: str):
     u = m.User.by_slug(user)
     pg = int(flask.request.args.get("page", 0))
     t = u.get_tag(tag)
     links = t.get_links(page=pg)
     return render(
-        "main",
-        title=f"tag {tag}",
-        content=render("linklist", links=links),
-        user=u,
+        "main", title=f"tag {tag}", content=render("linklist", links=links), user=u,
     )