From 1838cce8c72a5330b67f0002b6e0cc646c4ade66 Mon Sep 17 00:00:00 2001 From: Adnan Maolood Date: Mon, 4 Apr 2022 15:46:02 -0400 Subject: [PATCH] gitsrht/blueprints/api: Fix canonical_name Fix canonical_name, which was wrongly named canonicalName, in user resources returned by the legacy API. Also take the opportunity to refactor the GraphQL queries such that each query retrieves only the data it needs. --- gitsrht/blueprints/api/info.py | 49 ++++++++++++++++++-- gitsrht/blueprints/manage.py | 61 ++++++++++++++++++++++--- gitsrht/repos.py | 81 ---------------------------------- 3 files changed, 100 insertions(+), 91 deletions(-) diff --git a/gitsrht/blueprints/api/info.py b/gitsrht/blueprints/api/info.py index c7c09ff..86c7b42 100644 --- a/gitsrht/blueprints/api/info.py +++ b/gitsrht/blueprints/api/info.py @@ -35,11 +35,48 @@ def repos_by_user_GET(username): @info.route("/api/repos", methods=["POST"]) @oauth("info:write") def repos_POST(): - valid = Validation(request) user = current_token.user - resp = repos.create_repo(valid, user) + valid = Validation(request) + name = valid.require("name", friendly_name="Name") + description = valid.optional("description") + visibility = valid.optional("visibility") if not valid.ok: return valid.response + + # Visibility must be uppercase + if visibility is not None: + visibility = visibility.upper() + + resp = exec_gql(current_app.site, """ + mutation CreateRepository( + $name: String!, + $visibility: Visibility = PUBLIC, + $description: String) { + createRepository( + name: $name, + visibility: $visibility, + description: $description) { + id + created + updated + name + owner { + canonical_name: canonicalName + ... on User { + name: username + } + } + description + visibility + } + } + """, valid=valid, user=user, name=name, + description=description, visibility=visibility) + + if not valid.ok: + return valid.response + + resp = resp["createRepository"] # Convert visibility back to lowercase resp["visibility"] = resp["visibility"].lower() return resp, 201 @@ -78,7 +115,7 @@ def repos_by_name_PUT(reponame): updated name owner { - canonicalName + canonical_name: canonicalName ... on User { name: username } @@ -103,7 +140,11 @@ def repos_by_name_DELETE(reponame): user = current_token.user repo = get_repo(user, reponame, needs=UserAccess.manage) repo_id = repo.id - repos.delete_repo(repo, user) + exec_gql(current_app.site, """ + mutation DeleteRepository($id: Int!) { + deleteRepository(id: $id) { id } + } + """, user=user, id=repo.id) return {}, 204 @info.route("/api/repos//readme", defaults={"username": None}) diff --git a/gitsrht/blueprints/manage.py b/gitsrht/blueprints/manage.py index 628f8fc..855601a 100644 --- a/gitsrht/blueprints/manage.py +++ b/gitsrht/blueprints/manage.py @@ -6,7 +6,7 @@ from gitsrht.git import Repository as GitRepository from srht.config import cfg from srht.database import db from srht.flask import session -from srht.graphql import exec_gql, GraphQLError +from srht.graphql import exec_gql from srht.oauth import current_user, loginrequired, UserType from srht.validation import Validation from gitsrht.access import check_access, UserAccess, AccessMode @@ -27,10 +27,31 @@ def create_GET(): @loginrequired def create_POST(): valid = Validation(request) - resp = repos.create_repo(valid) + name = valid.require("name", friendly_name="Name") + description = valid.optional("description") + visibility = valid.require("visibility") + if not valid.ok: + return render_template("create.html", **valid.kwargs) + + resp = exec_gql(current_app.site, """ + mutation CreateRepository( + $name: String!, + $visibility: Visibility!, + $description: String) { + createRepository( + name: $name, + visibility: $visibility, + description: $description) { + name + } + } + """, valid=valid, name=name, description=description, visibility=visibility) + if not valid.ok: return render_template("create.html", **valid.kwargs) + resp = resp["createRepository"] + another = valid.optional("another") if another == "on": return redirect("/create?another") @@ -48,9 +69,33 @@ def clone(): @loginrequired def clone_POST(): valid = Validation(request) - resp = repos.clone_repo(valid) + cloneUrl = valid.require("cloneUrl", friendly_name="Clone URL") + name = valid.require("name", friendly_name="Name") + description = valid.optional("description") + visibility = valid.require("visibility") if not valid.ok: return render_template("clone.html", **valid.kwargs) + + resp = exec_gql(current_app.site, """ + mutation CloneRepository( + $name: String!, + $visibility: Visibility!, + $description: String, + $cloneUrl: String!) { + createRepository(name: $name, + visibility: $visibility, + description: $description, + cloneUrl: $cloneUrl) { + name + } + } + """, valid=valid, name=name, visibility=visibility, + description=description, cloneUrl=cloneUrl) + + if not valid.ok: + return render_template("clone.html", **valid.kwargs) + + resp = resp["createRepository"] return redirect(url_for("repo.summary", owner=current_user.canonical_name, repo=resp["name"])) @@ -79,7 +124,7 @@ def settings_info_POST(owner_name, repo_name): ] if valid.source.get(key) is not None } - resp = exec_gql("git.sr.ht", """ + resp = exec_gql(current_app.site, """ mutation UpdateRepository($id: Int!, $input: RepoInput!) { updateRepository(id: $id, input: $input) { id } } @@ -113,7 +158,7 @@ def settings_rename_POST(owner_name, repo_name): return render_template("settings_rename.html", owner=owner, repo=repo, **valid.kwargs) - resp = exec_gql("git.sr.ht", """ + resp = exec_gql(current_app.site, """ mutation RenameRepository($id: Int!, $name: String!) { updateRepository(id: $id, input: {name: $name}) { name @@ -213,7 +258,11 @@ def settings_delete_POST(owner_name, repo_name): # Normally we'd redirect but we don't want to fuck up some other repo abort(404) repo_id = repo.id - repos.delete_repo(repo) + exec_gql(current_app.site, """ + mutation DeleteRepository($id: Int!) { + deleteRepository(id: $id) { id } + } + """, id=repo.id) session["notice"] = "{}/{} was deleted.".format( owner.canonical_name, repo.name) return redirect("/" + owner.canonical_name) diff --git a/gitsrht/repos.py b/gitsrht/repos.py index bb52b7c..e07ae64 100644 --- a/gitsrht/repos.py +++ b/gitsrht/repos.py @@ -8,7 +8,6 @@ from gitsrht.types import Artifact, Repository, Redirect from minio import Minio from srht.config import cfg from srht.database import db -from srht.graphql import exec_gql, GraphQLError from werkzeug.utils import secure_filename repos_path = cfg("git.sr.ht", "repos") @@ -76,83 +75,3 @@ def upload_artifact(valid, repo, commit, f, filename): artifact.size = size db.session.add(artifact) return artifact - -def get_repo_path(owner, repo_name): - return os.path.join(repos_path, "~" + owner.username, repo_name) - -def create_repo(valid, user=None): - repo_name = valid.require("name", friendly_name="Name") - description = valid.optional("description") - visibility = valid.optional("visibility") - if not valid.ok: - return None - - # Convert the visibility to uppercase. This is needed for the REST API - # TODO: Remove this when the REST API is phased out - if visibility is not None: - visibility = visibility.upper() - - resp = exec_gql("git.sr.ht", """ - mutation CreateRepository( - $name: String!, - $visibility: Visibility = PUBLIC, - $description: String) { - createRepository( - name: $name, - visibility: $visibility, - description: $description) { - id - created - updated - name - owner { - canonicalName - ... on User { - name: username - } - } - description - visibility - } - } - """, valid=valid, user=user, name=repo_name, - description=description, visibility=visibility) - - if not valid.ok: - return None - return resp["createRepository"] - -def clone_repo(valid): - cloneUrl = valid.require("cloneUrl", friendly_name="Clone URL") - name = valid.require("name", friendly_name="Name") - description = valid.optional("description") - visibility = valid.optional("visibility") - if not valid.ok: - return None - - resp = exec_gql("git.sr.ht", """ - mutation CreateRepository( - $name: String!, - $visibility: Visibility = UNLISTED, - $description: String, - $cloneUrl: String) { - createRepository(name: $name, - visibility: $visibility, - description: $description, - cloneUrl: $cloneUrl) { - name - } - } - """, valid=valid, name=name, visibility=visibility, - description=description, cloneUrl=cloneUrl) - - if not valid.ok: - return None - return resp["createRepository"] - -def delete_repo(repo, user=None): - exec_gql("git.sr.ht", """ - mutation DeleteRepository($id: Int!) { - deleteRepository(id: $id) { id } - } - """, user=user, id=repo.id) -- 2.38.4