From 25406aa635961546808cff887e8f15b4ab803182 Mon Sep 17 00:00:00 2001 From: Drew DeVault Date: Fri, 14 Feb 2020 17:18:58 -0500 Subject: [PATCH] API: add route for uploading artifacts --- gitsrht/blueprints/api.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/gitsrht/blueprints/api.py b/gitsrht/blueprints/api.py index f85b8e4..d533840 100644 --- a/gitsrht/blueprints/api.py +++ b/gitsrht/blueprints/api.py @@ -7,12 +7,14 @@ from gitsrht.blueprints.repo import lookup_ref, collect_refs from gitsrht.types import Artifact from gitsrht.git import Repository as GitRepository, commit_time, annotate_tree from gitsrht.git import get_log +from gitsrht.repos import upload_artifact from gitsrht.webhooks import RepoWebhook from io import BytesIO from itertools import groupby from scmsrht.access import UserAccess from scmsrht.blueprints.api import get_user, get_repo from srht.api import paginated_response +from srht.database import db from srht.oauth import current_token, oauth from srht.redis import redis from srht.validation import Validation @@ -92,6 +94,35 @@ def repo_refs_GET(username, reponame): "results_per_page": len(refs), } +@data.route("/api/repos//artifacts/", defaults={"username": None}, methods=["POST"]) +@data.route("/api//repos//artifacts/", methods=["POST"]) +@oauth("data:write") +def repo_refs_by_name_POST(username, reponame, refname): + user = get_user(username) + repo = get_repo(user, reponame, needs=UserAccess.manage) + + with GitRepository(repo.path) as git_repo: + try: + tag = git_repo.revparse_single(refname) + except KeyError: + abort(404) + except ValueError: + abort(404) + if isinstance(tag, pygit2.Commit): + target = tag.oid.hex + else: + target = tag.target.hex + valid = Validation(request) + f = request.files.get("file") + valid.expect(f, "File is required", field="file") + if not valid.ok: + return valid.response + artifact = upload_artifact(valid, repo, target, f, f.filename) + if not valid.ok: + return valid.response + db.session.commit() + return artifact.to_dict() + # dear god, this routing @data.route("/api/repos//log", defaults={"username": None, "ref": None, "path": ""}) -- 2.38.4