about summary refs log tree commit diff
path: root/wqflask/wqflask/oauth2/routes.py
diff options
context:
space:
mode:
Diffstat (limited to 'wqflask/wqflask/oauth2/routes.py')
-rw-r--r--wqflask/wqflask/oauth2/routes.py74
1 files changed, 68 insertions, 6 deletions
diff --git a/wqflask/wqflask/oauth2/routes.py b/wqflask/wqflask/oauth2/routes.py
index 2f4d4492..33282dc1 100644
--- a/wqflask/wqflask/oauth2/routes.py
+++ b/wqflask/wqflask/oauth2/routes.py
@@ -1,5 +1,6 @@
 """Routes for the OAuth2 auth system in GN3"""
 import requests
+from typing import Optional
 from urllib.parse import urljoin
 
 from pymonad.maybe import Just, Maybe, Nothing
@@ -15,6 +16,9 @@ from .checks import require_oauth2, user_logged_in
 oauth2 = Blueprint("oauth2", __name__)
 SCOPE = "profile group role resource register-client"
 
+def __raise_unimplemented__():
+    raise Exception("NOT IMPLEMENTED")
+
 def get_endpoint(uri_path: str) -> Maybe:
     token = session.get("oauth2_token", False)
     if token and not bool(session.get("user_details", False)):
@@ -36,6 +40,10 @@ def get_endpoint(uri_path: str) -> Maybe:
 
     return Nothing
 
+def __user_details__():
+    return session.get("user_details", False) or get_endpoint(
+        "oauth2/user").maybe(False, __id__)
+
 def oauth2_get(uri_path: str) -> Either:
     token = session.get("oauth2_token")
     config = app.config
@@ -49,6 +57,18 @@ def oauth2_get(uri_path: str) -> Either:
 
     return Left(resp.json())
 
+def oauth2_post(uri_path: str, data: dict) -> Either:
+    token = session.get("oauth2_token")
+    config = app.config
+    client = OAuth2Session(
+        config["OAUTH2_CLIENT_ID"], config["OAUTH2_CLIENT_SECRET"],
+        token=token, scope=SCOPE)
+    resp = client.post(urljoin(config["GN_SERVER_URL"], uri_path), data=data)
+    if resp.status_code == 200:
+        return Right(resp.json())
+
+    return Left(resp.json())
+
 @oauth2.route("/login", methods=["GET", "POST"])
 def login():
     """Route to allow users to sign up."""
@@ -139,8 +159,7 @@ def register_client():
 @require_oauth2
 def user_profile():
     __id__ = lambda the_val: the_val
-    user_details = session.get("user_details", False) or get_endpoint(
-        "oauth2/user").maybe(False, __id__)
+    user_details = __user_details__()
     config = app.config
     client = OAuth2Session(
         config["OAUTH2_CLIENT_ID"], config["OAUTH2_CLIENT_SECRET"],
@@ -148,10 +167,8 @@ def user_profile():
 
     roles = oauth2_get("oauth2/user-roles").either(lambda x: "Error", lambda x: x)
     resources = []
-    groups = [] if user_details.get("group") else oauth2_get("oauth2/groups").either(
-        lambda x: "Error", lambda x: x)
     return render_template(
-        "oauth2/view-user.html", user_details=user_details, groups=groups,
+        "oauth2/view-user.html", user_details=user_details,
         roles=roles, resources=resources)
 
 @oauth2.route("/request-add-to-group", methods=["POST"])
@@ -159,7 +176,52 @@ def user_profile():
 def request_add_to_group():
     return "WOULD SEND MESSAGE TO HAVE YOU ADDED TO GROUP..."
 
+def __handle_error__(redirect_uri: Optional[str] = None, **kwargs):
+    def __handler__(error):
+        print(f"ERROR: {error}")
+        msg = error.get(
+            "error_message", error.get("error_description", "undefined error"))
+        flash(f"{error['error']}: {msg}.",
+              "alert-danger")
+        if "response_handlers" in kwargs:
+            for handler in kwargs["response_handlers"]:
+                handler(response)
+        if redirect:
+            return redirect(url_for(redirect_uri, **kwargs))
+
+    return __handler__
+
+def __handle_success__(
+        success_msg: str, redirect_uri: Optional[str] = None, **kwargs):
+    def __handler__(response):
+        flash(f"Success: {success_msg}.", "alert-success")
+        if "response_handlers" in kwargs:
+            for handler in kwargs["response_handlers"]:
+                handler(response)
+        if redirect:
+            return redirect(url_for(redirect_uri, **kwargs))
+
+    return __handler__
+
 @oauth2.route("/create-group", methods=["POST"])
 @require_oauth2
 def create_group():
-    return "WOULD CREATE A NEW GROUP..."
+    def __setup_group__(response):
+        session["user_details"]["group"] = response
+
+    resp = oauth2_post("oauth2/create-group", data=dict(request.form))
+    return resp.either(
+        __handle_error__("oauth2.group_join_or_create"),
+        __handle_success__(
+            "Created group", "oauth2.user_profile",
+            response_handlers=__setup_group__))
+
+@oauth2.route("/group-join-or-create", methods=["GET"])
+def group_join_or_create():
+    user_details = __user_details__()
+    if bool(user_details["group"]):
+        flash("You are already a member of a group.", "alert info.")
+        return redirect(url_for("oauth2.user_profile"))
+    groups = oauth2_get("oauth2/groups").either(
+        lambda x: __raise_unimplemented__(), lambda x: x)
+    return render_template("oauth2/group_join_or_create.html", groups=groups)