Flesh out webhooks a bit more

This commit is contained in:
Drew DeVault 2020-03-31 16:09:33 -04:00
parent 88af4176a7
commit a005c28fdf
3 changed files with 30 additions and 15 deletions

View File

@ -11,7 +11,6 @@ from srht.oauth import current_user, loginrequired
from srht.validation import Validation
projects = Blueprint("projects", __name__)
origin = get_origin("hub.sr.ht")
@projects.route("/<owner>/<project_name>")
def summary_GET(owner, project_name):
@ -162,11 +161,8 @@ def sources_git_new_POST(owner, project_name):
event.user_id = project.owner_id
db.session.add(event)
# TODO: repo webhooks for rigging up commit events
git.ensure_user_webhooks(owner, {
origin + url_for("webhooks.git_repo_update"):
["repo:update", "repo:delete"],
})
git.ensure_user_webhooks(owner)
git.ensure_repo_webhooks(owner, repo.name)
db.session.commit()
@ -258,11 +254,7 @@ def mailing_lists_new_POST(owner, project_name):
event.user_id = project.owner_id
db.session.add(event)
# TODO: lists webhooks for rigging up new mail events
lists.ensure_mailing_list_webhooks(owner, ml.name, {
origin + url_for("webhooks.mailing_list_update"):
["list:update", "list:delete"],
})
lists.ensure_mailing_list_webhooks(owner, ml.name)
db.session.commit()

View File

@ -8,7 +8,7 @@ webhooks = Blueprint("webhooks", __name__)
@csrf_bypass
@webhooks.route("/webhooks/git-repo", methods=["POST"])
def git_repo_update():
def git_repo():
event = request.headers.get("X-Webhook-Event")
payload = json.loads(request.data.decode("utf-8"))
if event == "repo:update":
@ -24,10 +24,12 @@ def git_repo_update():
return f"Updated local:{repo.id}/remote:{repo.remote_id}. Thanks!", 200
elif event == "repo:delete":
raise NotImplementedError()
elif event == "repo:post-update":
raise NotImplementedError()
@csrf_bypass
@webhooks.route("/webhooks/mailing-list", methods=["POST"])
def mailing_list_update():
def mailing_list():
event = request.headers.get("X-Webhook-Event")
payload = json.loads(request.data.decode("utf-8"))
if event == "list:update":
@ -42,3 +44,7 @@ def mailing_list_update():
return f"Updated local:{ml.id}/remote:{ml.remote_id}. Thanks!", 200
elif event == "list:delete":
raise NotImplementedError()
elif event == "post:received":
raise NotImplementedError()
elif event == "patchset:received":
raise NotImplementedError()

View File

@ -1,10 +1,12 @@
import requests
from abc import ABC
from flask import url_for
from srht.api import ensure_webhooks, get_authorization, get_results
from srht.config import get_origin
_gitsrht = get_origin("git.sr.ht", external=True, default=None)
_listsrht = get_origin("lists.sr.ht", external=True, default=None)
origin = get_origin("hub.sr.ht")
class SrhtService(ABC):
def __init__(self):
@ -58,9 +60,20 @@ class GitService(SrhtService):
"visibility": "public", # TODO: Should this be different?
})
def ensure_user_webhooks(self, user, config):
def ensure_user_webhooks(self, user):
config = {
origin + url_for("webhooks.git_repo"):
["repo:update", "repo:delete"],
}
ensure_webhooks(user, f"{_gitsrht}/api/user/webhooks", config)
def ensure_repo_webhooks(self, user, repo_name):
config = {
origin + url_for("webhooks.git_repo"): ["repo:post-update"],
}
url = f"{_gitsrht}/api/{user.canonical_name}/repos/{repo_name}/webhooks"
ensure_webhooks(user, url, config)
class ListService(SrhtService):
def get_lists(self, user):
return get_results(f"{_listsrht}/api/lists", user)
@ -72,7 +85,11 @@ class ListService(SrhtService):
raise Exception(r.json())
return r.json()
def ensure_mailing_list_webhooks(self, user, list_name, config):
def ensure_mailing_list_webhooks(self, user, list_name):
config = {
origin + url_for("webhooks.mailing_list"):
["list:update", "list:delete", "post:received", "patchset:received"],
}
url = f"{_listsrht}/api/user/{user.canonical_name}/lists/{list_name}/webhooks"
ensure_webhooks(user, url, config)