Changeset View
Changeset View
Standalone View
Standalone View
swh/web/save_origin_webhooks/github.py
- This file was added.
# Copyright (C) 2022 The Software Heritage developers | |||||
# See the AUTHORS file at the top-level directory of this distribution | |||||
# License: GNU Affero General Public License version 3, or any later version | |||||
# See top-level LICENSE file for more information | |||||
from typing import Tuple | |||||
from rest_framework.request import Request | |||||
from swh.web.api.apidoc import api_doc, format_docstring, set_docstring | |||||
from swh.web.api.apiurls import api_route | |||||
from swh.web.save_origin_webhooks.generic_receiver import origin_save_webhook_receiver | |||||
FORGE_TYPE = "GitHub" | |||||
def is_github_request(request: Request) -> bool: | |||||
return ( | |||||
request.headers.get("User-Agent", "").startswith(f"{FORGE_TYPE}-Hookshot/") | |||||
and f"X-{FORGE_TYPE}-Event" in request.headers | |||||
) | |||||
def is_github_push_event(request: Request) -> bool: | |||||
return request.headers[f"X-{FORGE_TYPE}-Event"] == "push" | |||||
def extract_github_repo_url(request: Request) -> Tuple[str, str]: | |||||
return request.data.get("repository", {}).get("html_url", ""), "git" | |||||
@api_route( | |||||
f"/origin/save/webhook/{FORGE_TYPE.lower()}/", | |||||
f"api-1-origin-save-webhook-{FORGE_TYPE.lower()}", | |||||
methods=["POST"], | |||||
) | |||||
@api_doc(f"/origin/save/webhook/{FORGE_TYPE.lower()}/", category="Request archival") | |||||
@format_docstring( | |||||
forge_type_lower=FORGE_TYPE.lower(), | |||||
forge_type=FORGE_TYPE, | |||||
repo_types="git", | |||||
webhook_guide_url=( | |||||
"https://docs.github.com/en/developers/webhooks-and-events/" | |||||
"webhooks/creating-webhooks#setting-up-a-webhook" | |||||
), | |||||
) | |||||
@set_docstring(origin_save_webhook_receiver.__doc__) | |||||
def api_origin_save_webhook_github(request: Request): | |||||
return origin_save_webhook_receiver( | |||||
request, | |||||
forge_type=FORGE_TYPE, | |||||
is_forge_request=is_github_request, | |||||
is_push_event=is_github_push_event, | |||||
extract_repo_url_and_visit_type=extract_github_repo_url, | |||||
) |