snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
This commit is contained in:
0
zerver/webhooks/__init__.py
Normal file
0
zerver/webhooks/__init__.py
Normal file
0
zerver/webhooks/airbrake/__init__.py
Normal file
0
zerver/webhooks/airbrake/__init__.py
Normal file
25
zerver/webhooks/airbrake/doc.md
Normal file
25
zerver/webhooks/airbrake/doc.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Zulip Airbrake integration
|
||||
|
||||
Get Zulip notifications for your Airbrake bug tracker!
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. Go to your project's settings on the Airbrake site. Click on the
|
||||
**Integration** section, and select **Webhook**.
|
||||
|
||||
1. Enter the URL you generated, and check **Enabled**.
|
||||
Click **Save**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
25
zerver/webhooks/airbrake/fixtures/error_message.json
Normal file
25
zerver/webhooks/airbrake/fixtures/error_message.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"error": {
|
||||
"id": "1705190192091077626",
|
||||
"error_message": "Error message from logger",
|
||||
"error_class": "ZeroDivisionError",
|
||||
"file": "file.py",
|
||||
"line_number": 2,
|
||||
"project": {
|
||||
"id": 125209,
|
||||
"name": "ZulipIntegrationTest"
|
||||
},
|
||||
"last_notice": {
|
||||
"id": "1705189516072954676",
|
||||
"request_url": null,
|
||||
"backtrace": [
|
||||
"file.py:2:in \u003cmodule\u003e"
|
||||
]
|
||||
},
|
||||
"environment": "dev",
|
||||
"first_occurred_at": "2016-06-10T17:07:10.760639Z",
|
||||
"last_occurred_at": "2016-06-10T17:07:10.76Z",
|
||||
"times_occurred": 1
|
||||
},
|
||||
"airbrake_error_url": "https:\/\/zulip.airbrake.io\/projects\/125209\/groups\/1705190192091077626"
|
||||
}
|
||||
8
zerver/webhooks/airbrake/tests.py
Normal file
8
zerver/webhooks/airbrake/tests.py
Normal file
@@ -0,0 +1,8 @@
|
||||
from zerver.lib.test_classes import WebhookTestCase
|
||||
|
||||
|
||||
class AirbrakeHookTests(WebhookTestCase):
|
||||
def test_airbrake_error_message(self) -> None:
|
||||
expected_topic_name = "ZulipIntegrationTest"
|
||||
expected_message = '[ZeroDivisionError](https://zulip.airbrake.io/projects/125209/groups/1705190192091077626): "Error message from logger" occurred.'
|
||||
self.check_webhook("error_message", expected_topic_name, expected_message)
|
||||
41
zerver/webhooks/airbrake/view.py
Normal file
41
zerver/webhooks/airbrake/view.py
Normal file
@@ -0,0 +1,41 @@
|
||||
# Webhooks for external integrations.
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.models import UserProfile
|
||||
|
||||
AIRBRAKE_TOPIC_TEMPLATE = "{project_name}"
|
||||
AIRBRAKE_MESSAGE_TEMPLATE = '[{error_class}]({error_url}): "{error_message}" occurred.'
|
||||
|
||||
|
||||
@webhook_view("Airbrake")
|
||||
@typed_endpoint
|
||||
def api_airbrake_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
) -> HttpResponse:
|
||||
topic_name = get_topic(payload)
|
||||
body = get_body(payload)
|
||||
check_send_webhook_message(request, user_profile, topic_name, body)
|
||||
return json_success(request)
|
||||
|
||||
|
||||
def get_topic(payload: WildValue) -> str:
|
||||
return AIRBRAKE_TOPIC_TEMPLATE.format(
|
||||
project_name=payload["error"]["project"]["name"].tame(check_string)
|
||||
)
|
||||
|
||||
|
||||
def get_body(payload: WildValue) -> str:
|
||||
data = {
|
||||
"error_url": payload["airbrake_error_url"].tame(check_string),
|
||||
"error_class": payload["error"]["error_class"].tame(check_string),
|
||||
"error_message": payload["error"]["error_message"].tame(check_string),
|
||||
}
|
||||
return AIRBRAKE_MESSAGE_TEMPLATE.format(**data)
|
||||
0
zerver/webhooks/airbyte/__init__.py
Normal file
0
zerver/webhooks/airbyte/__init__.py
Normal file
26
zerver/webhooks/airbyte/doc.md
Normal file
26
zerver/webhooks/airbyte/doc.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# Zulip Airbyte integration
|
||||
|
||||
Get Zulip notifications from Airbyte.
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. In Airbyte, go to your project settings. Click **Notifications**,
|
||||
and toggle the **Webhook** button for the notifications you'd like
|
||||
to receive.
|
||||
|
||||
1. Enter the URL generated above in the **Webhook URL** field. Click the
|
||||
**Save changes** button at the bottom of the page.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"text": "Your connection Google Sheets → Postgres from Google Sheets to Postgres failed\nThis happened with Checking source connection failed - please review this connection's configuration to prevent future syncs from failing\n\nYou can access its logs here: https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720\n\nJob ID: 20441143",
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "Sync completed: <https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720|Google Sheets \u2192 Postgres>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"fields": [
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Source:*"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "<https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/source/363c0ea3-e989-4051-9f54-d41b794d6621|Google Sheets>"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Destination:*"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "<https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/destination/b3a05072-e3c8-435a-8e6e-4a5c601039c6|Postgres>"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Duration:*"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "1 min 23 sec"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "*Sync Summary:*\n1400 record(s) extracted / 1400 record(s) loaded\n281 kB extracted / 281 kB loaded\n"
|
||||
}
|
||||
}
|
||||
],
|
||||
"data": {
|
||||
"workspace": {
|
||||
"id": "84d2dd6e-82aa-406e-91f3-bf8dbf176e69",
|
||||
"name": "Zulip Airbyte Integration",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69"
|
||||
},
|
||||
"connection": {
|
||||
"id": "aa941643-07ea-48a2-9035-024575491720",
|
||||
"name": "Google Sheets → Postgres",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720"
|
||||
},
|
||||
"source": {
|
||||
"id": "363c0ea3-e989-4051-9f54-d41b794d6621",
|
||||
"name": "Google Sheets",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/source/363c0ea3-e989-4051-9f54-d41b794d6621"
|
||||
},
|
||||
"destination": {
|
||||
"id": "b3a05072-e3c8-435a-8e6e-4a5c601039c6",
|
||||
"name": "Postgres",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/destination/b3a05072-e3c8-435a-8e6e-4a5c601039c6"
|
||||
},
|
||||
"jobId": 20441143,
|
||||
"startedAt": "2024-10-22T20:27:59Z",
|
||||
"finishedAt": "2024-10-22T20:29:22Z",
|
||||
"bytesEmitted": 0,
|
||||
"bytesCommitted": 0,
|
||||
"recordsEmitted": 0,
|
||||
"recordsCommitted": 0,
|
||||
"errorMessage": "Checking source connection failed - please review this connection's configuration to prevent future syncs from failing",
|
||||
"durationFormatted": "28 sec",
|
||||
"bytesEmittedFormatted": "0 B",
|
||||
"bytesCommittedFormatted": "0 B",
|
||||
"success": false,
|
||||
"durationInSeconds": 28
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
"text": "Your connection Google Sheets → Postgres from Google Sheets to Postgres succeeded\nThis was for null\n\nYou can access its logs here: https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720\n\nJob ID: 20441143",
|
||||
"blocks": [
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "Sync completed: <https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720|Google Sheets \u2192 Postgres>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"fields": [
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Source:*"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "<https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/source/363c0ea3-e989-4051-9f54-d41b794d6621|Google Sheets>"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Destination:*"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "<https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/destination/b3a05072-e3c8-435a-8e6e-4a5c601039c6|Postgres>"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "*Duration:*"
|
||||
},
|
||||
{
|
||||
"type": "mrkdwn",
|
||||
"text": "1 min 23 sec"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "section",
|
||||
"text": {
|
||||
"type": "mrkdwn",
|
||||
"text": "*Sync Summary:*\n1400 record(s) extracted / 1400 record(s) loaded\n281 kB extracted / 281 kB loaded\n"
|
||||
}
|
||||
}
|
||||
],
|
||||
"data": {
|
||||
"workspace": {
|
||||
"id": "84d2dd6e-82aa-406e-91f3-bf8dbf176e69",
|
||||
"name": "Zulip Airbyte Integration",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69"
|
||||
},
|
||||
"connection": {
|
||||
"id": "aa941643-07ea-48a2-9035-024575491720",
|
||||
"name": "Google Sheets → Postgres",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720"
|
||||
},
|
||||
"source": {
|
||||
"id": "363c0ea3-e989-4051-9f54-d41b794d6621",
|
||||
"name": "Google Sheets",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/source/363c0ea3-e989-4051-9f54-d41b794d6621"
|
||||
},
|
||||
"destination": {
|
||||
"id": "b3a05072-e3c8-435a-8e6e-4a5c601039c6",
|
||||
"name": "Postgres",
|
||||
"url": "https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/destination/b3a05072-e3c8-435a-8e6e-4a5c601039c6"
|
||||
},
|
||||
"jobId": 20441143,
|
||||
"startedAt": "2024-10-22T20:27:59Z",
|
||||
"finishedAt": "2024-10-22T20:29:22Z",
|
||||
"bytesEmitted": 288179,
|
||||
"bytesCommitted": 288179,
|
||||
"recordsEmitted": 1400,
|
||||
"recordsCommitted": 1400,
|
||||
"errorMessage": null,
|
||||
"durationFormatted": "1 min 23 sec",
|
||||
"bytesEmittedFormatted": "281 kB",
|
||||
"bytesCommittedFormatted": "281 kB",
|
||||
"success": true,
|
||||
"durationInSeconds": 83
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"text": "Hello World! This is a test from Airbyte to try slack notification settings for sync failures."
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"text": "Hello World! This is a test from Airbyte to try slack notification settings for sync successes."
|
||||
}
|
||||
|
||||
64
zerver/webhooks/airbyte/tests.py
Normal file
64
zerver/webhooks/airbyte/tests.py
Normal file
@@ -0,0 +1,64 @@
|
||||
from zerver.lib.test_classes import WebhookTestCase
|
||||
|
||||
|
||||
class AirbyteHookTests(WebhookTestCase):
|
||||
def test_airbyte_job_success(self) -> None:
|
||||
expected_topic = "Zulip Airbyte Integration - Google Sheets → Postgres"
|
||||
|
||||
expected_message = """:green_circle: Airbyte sync **succeeded** for [Google Sheets → Postgres](https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720).
|
||||
|
||||
|
||||
* **Source:** [Google Sheets](https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/source/363c0ea3-e989-4051-9f54-d41b794d6621)
|
||||
* **Destination:** [Postgres](https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/destination/b3a05072-e3c8-435a-8e6e-4a5c601039c6)
|
||||
* **Records:** 1400 emitted, 1400 committed
|
||||
* **Bytes:** 281 kB emitted, 281 kB committed
|
||||
* **Duration:** 1 min 23 sec"""
|
||||
|
||||
self.check_webhook(
|
||||
"airbyte_job_payload_success",
|
||||
expected_topic,
|
||||
expected_message,
|
||||
content_type="application/json",
|
||||
)
|
||||
|
||||
def test_airbyte_job_failure(self) -> None:
|
||||
expected_topic = "Zulip Airbyte Integration - Google Sheets → Postgres"
|
||||
expected_message = """:red_circle: Airbyte sync **failed** for [Google Sheets → Postgres](https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/connections/aa941643-07ea-48a2-9035-024575491720).
|
||||
|
||||
|
||||
* **Source:** [Google Sheets](https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/source/363c0ea3-e989-4051-9f54-d41b794d6621)
|
||||
* **Destination:** [Postgres](https://cloud.airbyte.com/workspaces/84d2dd6e-82aa-406e-91f3-bf8dbf176e69/destination/b3a05072-e3c8-435a-8e6e-4a5c601039c6)
|
||||
* **Records:** 0 emitted, 0 committed
|
||||
* **Bytes:** 0 B emitted, 0 B committed
|
||||
* **Duration:** 28 sec
|
||||
|
||||
**Error message:** Checking source connection failed - please review this connection's configuration to prevent future syncs from failing"""
|
||||
|
||||
self.check_webhook(
|
||||
"airbyte_job_payload_failure",
|
||||
expected_topic,
|
||||
expected_message,
|
||||
content_type="application/json",
|
||||
)
|
||||
|
||||
def test_airbyte_job_hello_world_success(self) -> None:
|
||||
expected_topic = "Airbyte notification"
|
||||
expected_message = """Hello World! This is a test from Airbyte to try slack notification settings for sync successes."""
|
||||
|
||||
self.check_webhook(
|
||||
"test_airbyte_job_hello_world_success",
|
||||
expected_topic,
|
||||
expected_message,
|
||||
content_type="application/json",
|
||||
)
|
||||
|
||||
def test_airbyte_job_hello_world_failure(self) -> None:
|
||||
expected_topic = "Airbyte notification"
|
||||
expected_message = """Hello World! This is a test from Airbyte to try slack notification settings for sync failures."""
|
||||
|
||||
self.check_webhook(
|
||||
"test_airbyte_job_hello_world_failure",
|
||||
expected_topic,
|
||||
expected_message,
|
||||
content_type="application/json",
|
||||
)
|
||||
97
zerver/webhooks/airbyte/view.py
Normal file
97
zerver/webhooks/airbyte/view.py
Normal file
@@ -0,0 +1,97 @@
|
||||
# Webhooks for external integrations.
|
||||
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_bool, check_int, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.models import UserProfile
|
||||
|
||||
AIRBYTE_TOPIC_TEMPLATE = "{workspace} - {connection}"
|
||||
|
||||
AIRBYTE_MESSAGE_TEMPLATE = """\
|
||||
{sync_status_emoji} Airbyte sync **{status}** for [{connection_name}]({connection_url}).
|
||||
|
||||
|
||||
* **Source:** [{source_name}]({source_url})
|
||||
* **Destination:** [{destination_name}]({destination_url})
|
||||
* **Records:** {records_emitted} emitted, {records_committed} committed
|
||||
* **Bytes:** {bytes_emitted} emitted, {bytes_committed} committed
|
||||
* **Duration:** {duration}
|
||||
"""
|
||||
|
||||
|
||||
def extract_data_from_payload(payload_data: WildValue) -> dict[str, str | int | bool]:
|
||||
data: dict[str, str | int | bool] = {
|
||||
"workspace_name": payload_data["workspace"]["name"].tame(check_string),
|
||||
"connection_name": payload_data["connection"]["name"].tame(check_string),
|
||||
"source_name": payload_data["source"]["name"].tame(check_string),
|
||||
"destination_name": payload_data["destination"]["name"].tame(check_string),
|
||||
"connection_url": payload_data["connection"]["url"].tame(check_string),
|
||||
"source_url": payload_data["source"]["url"].tame(check_string),
|
||||
"destination_url": payload_data["destination"]["url"].tame(check_string),
|
||||
"successful_sync": payload_data["success"].tame(check_bool),
|
||||
"duration_formatted": payload_data["durationFormatted"].tame(check_string),
|
||||
"records_emitted": payload_data["recordsEmitted"].tame(check_int),
|
||||
"records_committed": payload_data["recordsCommitted"].tame(check_int),
|
||||
"bytes_emitted_formatted": payload_data["bytesEmittedFormatted"].tame(check_string),
|
||||
"bytes_committed_formatted": payload_data["bytesCommittedFormatted"].tame(check_string),
|
||||
}
|
||||
|
||||
if not data["successful_sync"]:
|
||||
data["error_message"] = payload_data["errorMessage"].tame(check_string)
|
||||
|
||||
return data
|
||||
|
||||
|
||||
def format_message_from_data(data: dict[str, str | int | bool]) -> str:
|
||||
content = AIRBYTE_MESSAGE_TEMPLATE.format(
|
||||
sync_status_emoji=":green_circle:" if data["successful_sync"] else ":red_circle:",
|
||||
status="succeeded" if data["successful_sync"] else "failed",
|
||||
connection_name=data["connection_name"],
|
||||
connection_url=data["connection_url"],
|
||||
source_name=data["source_name"],
|
||||
source_url=data["source_url"],
|
||||
destination_name=data["destination_name"],
|
||||
destination_url=data["destination_url"],
|
||||
duration=data["duration_formatted"],
|
||||
records_emitted=data["records_emitted"],
|
||||
records_committed=data["records_committed"],
|
||||
bytes_emitted=data["bytes_emitted_formatted"],
|
||||
bytes_committed=data["bytes_committed_formatted"],
|
||||
)
|
||||
|
||||
if not data["successful_sync"]:
|
||||
error_message = data["error_message"]
|
||||
content += f"\n**Error message:** {error_message}"
|
||||
|
||||
return content
|
||||
|
||||
|
||||
def create_topic_from_data(data: dict[str, str | int | bool]) -> str:
|
||||
return AIRBYTE_TOPIC_TEMPLATE.format(
|
||||
workspace=data["workspace_name"],
|
||||
connection=data["connection_name"],
|
||||
)
|
||||
|
||||
|
||||
@webhook_view("Airbyte")
|
||||
@typed_endpoint
|
||||
def api_airbyte_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
) -> HttpResponse:
|
||||
if "data" in payload:
|
||||
data = extract_data_from_payload(payload["data"])
|
||||
content = format_message_from_data(data)
|
||||
topic = create_topic_from_data(data)
|
||||
else:
|
||||
# Test Airbyte notification payloads only contain this field.
|
||||
content = payload["text"].tame(check_string)
|
||||
topic = "Airbyte notification"
|
||||
check_send_webhook_message(request, user_profile, topic, content)
|
||||
return json_success(request)
|
||||
0
zerver/webhooks/alertmanager/__init__.py
Normal file
0
zerver/webhooks/alertmanager/__init__.py
Normal file
41
zerver/webhooks/alertmanager/doc.md
Normal file
41
zerver/webhooks/alertmanager/doc.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Zulip Prometheus Alertmanager integration
|
||||
|
||||
Get Zulip notifications from Prometheus Alertmanager!
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. In your Alertmanager config, set up a new webhook receiver, like so:
|
||||
|
||||
```
|
||||
- name: ops-zulip
|
||||
webhook_configs:
|
||||
- url: "<the URL generated above>"
|
||||
```
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
### Configuration options
|
||||
|
||||
- You can specify a field defined in your alerting rules (for labels
|
||||
and/or annotations) that will be used to group alerts with the same
|
||||
status into a single alert message in Zulip by appending a `name`
|
||||
parameter to the generated URL, e.g., `&name=severity`. The default
|
||||
`name` value used in the integration is `instance`.
|
||||
|
||||
- You can specify a field defined in your alerting rules (for labels
|
||||
and/or annotations) that will be used in the alert message text in
|
||||
Zulip by appending a `desc` parameter to the generated URL, e.g.,
|
||||
`&desc=description`. The default `desc` value used in the
|
||||
integration is `alertname`.
|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
51
zerver/webhooks/alertmanager/fixtures/alert.json
Normal file
51
zerver/webhooks/alertmanager/fixtures/alert.json
Normal file
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"receiver": "ops-zulip",
|
||||
"status": "firing",
|
||||
"groupLabels": {},
|
||||
"commonLabels": {
|
||||
"alertname": "High CPU Temperature",
|
||||
"severity": "critical"
|
||||
},
|
||||
"commonAnnotations": {
|
||||
"summary": "High CPU core temperature"
|
||||
},
|
||||
"externalURL": "http://ops1:9093",
|
||||
"version": "4",
|
||||
"groupKey": "{}/{}:{}",
|
||||
"alerts": [
|
||||
{
|
||||
"status": "firing",
|
||||
"labels": {
|
||||
"alertname": "High CPU Temperature",
|
||||
"host": "andromeda",
|
||||
"severity": "critical"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "CPU core temperature is 34.75C",
|
||||
"topic": "andromeda",
|
||||
"summary": "High CPU core temperature"
|
||||
},
|
||||
"startsAt": "2020-02-06T00:17:58.432911368Z",
|
||||
"endsAt": "0001-01-01T00:00:00Z",
|
||||
"generatorURL": "http://cobalt:9090/graph?g0.expr=avg+by%28host%29+%28sensors_temp_input%7Bfeature%3D~%22core_%5B0-9%5D%2B%22%7D%29+%3E+15&g0.tab=1",
|
||||
"fingerprint": "a1bc48475b20e73d"
|
||||
},
|
||||
{
|
||||
"status": "firing",
|
||||
"labels": {
|
||||
"alertname": "High CPU Temperature",
|
||||
"host": "andromeda",
|
||||
"severity": "critical"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "CPU core temperature is 17.625C",
|
||||
"topic": "andromeda",
|
||||
"summary": "High CPU core temperature"
|
||||
},
|
||||
"startsAt": "2020-02-06T00:17:58.432911368Z",
|
||||
"endsAt": "0001-01-01T00:00:00Z",
|
||||
"generatorURL": "http://cobalt:9090/graph?g0.expr=avg+by%28host%29+%28sensors_temp_input%7Bfeature%3D~%22core_%5B0-9%5D%2B%22%7D%29+%3E+15&g0.tab=1",
|
||||
"fingerprint": "c2ea85182f28cbd9"
|
||||
}
|
||||
]
|
||||
}
|
||||
34
zerver/webhooks/alertmanager/fixtures/single_alert.json
Normal file
34
zerver/webhooks/alertmanager/fixtures/single_alert.json
Normal file
@@ -0,0 +1,34 @@
|
||||
{
|
||||
"receiver": "ops-zulip",
|
||||
"status": "resolved",
|
||||
"groupLabels": {},
|
||||
"commonLabels": {
|
||||
"alertname": "High CPU Temperature",
|
||||
"severity": "critical"
|
||||
},
|
||||
"commonAnnotations": {
|
||||
"summary": "High CPU core temperature"
|
||||
},
|
||||
"externalURL": "http://ops1:9093",
|
||||
"version": "4",
|
||||
"groupKey": "{}/{}:{}",
|
||||
"alerts": [
|
||||
{
|
||||
"status": "resolved",
|
||||
"labels": {
|
||||
"alertname": "High CPU Temperature",
|
||||
"host": "andromeda",
|
||||
"severity": "critical"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "CPU core temperature is 34.75C",
|
||||
"topic": "andromeda",
|
||||
"summary": "High CPU core temperature"
|
||||
},
|
||||
"startsAt": "2020-02-06T00:17:58.432911368Z",
|
||||
"endsAt": "0001-01-01T00:00:00Z",
|
||||
"generatorURL": "http://cobalt:9090/graph?g0.expr=avg+by%28host%29+%28sensors_temp_input%7Bfeature%3D~%22core_%5B0-9%5D%2B%22%7D%29+%3E+15&g0.tab=1",
|
||||
"fingerprint": "a1bc48475b20e73d"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"receiver": "ops-zulip",
|
||||
"status": "firing",
|
||||
"groupLabels": {},
|
||||
"commonLabels": {
|
||||
"alertname": "High CPU Temperature",
|
||||
"severity": "critical"
|
||||
},
|
||||
"commonAnnotations": {
|
||||
"summary": "High CPU core temperature"
|
||||
},
|
||||
"externalURL": "http://ops1:9093",
|
||||
"version": "4",
|
||||
"groupKey": "{}/{}:{}",
|
||||
"alerts": [
|
||||
{
|
||||
"status": "firing",
|
||||
"labels": {
|
||||
"alertname": "High CPU Temperature",
|
||||
"host": "andromeda",
|
||||
"severity": "critical"
|
||||
},
|
||||
"annotations": {
|
||||
"description": "CPU core temperature is 34.75C",
|
||||
"topic": "andromeda",
|
||||
"summary": "High CPU core temperature"
|
||||
},
|
||||
"startsAt": "2020-02-06T00:17:58.432911368Z",
|
||||
"endsAt": "0001-01-01T00:00:00Z",
|
||||
"fingerprint": "a1bc48475b20e73d"
|
||||
}
|
||||
]
|
||||
}
|
||||
44
zerver/webhooks/alertmanager/tests.py
Normal file
44
zerver/webhooks/alertmanager/tests.py
Normal file
@@ -0,0 +1,44 @@
|
||||
from zerver.lib.test_classes import WebhookTestCase
|
||||
|
||||
|
||||
class AlertmanagerHookTests(WebhookTestCase):
|
||||
URL_TEMPLATE = "/api/v1/external/alertmanager?&api_key={api_key}&stream={stream}&name=topic&desc=description"
|
||||
|
||||
def test_error_issue_message(self) -> None:
|
||||
expected_topic_name = "andromeda"
|
||||
expected_message = """
|
||||
:alert: **FIRING**
|
||||
* CPU core temperature is 34.75C ([source](http://cobalt:9090/graph?g0.expr=avg+by%28host%29+%28sensors_temp_input%7Bfeature%3D~%22core_%5B0-9%5D%2B%22%7D%29+%3E+15&g0.tab=0))
|
||||
* CPU core temperature is 17.625C ([source](http://cobalt:9090/graph?g0.expr=avg+by%28host%29+%28sensors_temp_input%7Bfeature%3D~%22core_%5B0-9%5D%2B%22%7D%29+%3E+15&g0.tab=0))
|
||||
""".strip()
|
||||
|
||||
self.check_webhook(
|
||||
"alert",
|
||||
expected_topic_name,
|
||||
expected_message,
|
||||
"application/json",
|
||||
)
|
||||
|
||||
def test_single_error_issue_message(self) -> None:
|
||||
expected_topic_name = "andromeda"
|
||||
expected_message = """
|
||||
:squared_ok: **Resolved** CPU core temperature is 34.75C ([source](http://cobalt:9090/graph?g0.expr=avg+by%28host%29+%28sensors_temp_input%7Bfeature%3D~%22core_%5B0-9%5D%2B%22%7D%29+%3E+15&g0.tab=0))
|
||||
""".strip()
|
||||
|
||||
self.check_webhook(
|
||||
"single_alert",
|
||||
expected_topic_name,
|
||||
expected_message,
|
||||
"application/json",
|
||||
)
|
||||
|
||||
def test_single_alert_no_generator_url(self) -> None:
|
||||
expected_topic_name = "andromeda"
|
||||
expected_message = ":alert: **FIRING** CPU core temperature is 34.75C"
|
||||
|
||||
self.check_webhook(
|
||||
"single_alert_no_url",
|
||||
expected_topic_name,
|
||||
expected_message,
|
||||
"application/json",
|
||||
)
|
||||
65
zerver/webhooks/alertmanager/view.py
Normal file
65
zerver/webhooks/alertmanager/view.py
Normal file
@@ -0,0 +1,65 @@
|
||||
# Webhooks for external integrations.
|
||||
|
||||
from typing import Annotated
|
||||
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.typed_endpoint import ApiParamConfig, JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.models import UserProfile
|
||||
|
||||
|
||||
@webhook_view("Alertmanager")
|
||||
@typed_endpoint
|
||||
def api_alertmanager_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
name_field: Annotated[str, ApiParamConfig("name")] = "instance",
|
||||
desc_field: Annotated[str, ApiParamConfig("desc")] = "alertname",
|
||||
) -> HttpResponse:
|
||||
topics: dict[str, dict[str, list[str]]] = {}
|
||||
|
||||
for alert in payload["alerts"]:
|
||||
labels = alert.get("labels", {})
|
||||
annotations = alert.get("annotations", {})
|
||||
|
||||
name = labels.get(name_field, annotations.get(name_field, "(unknown)")).tame(check_string)
|
||||
desc = labels.get(
|
||||
desc_field, annotations.get(desc_field, f"<missing field: {desc_field}>")
|
||||
).tame(check_string)
|
||||
|
||||
if "generatorURL" in alert:
|
||||
url = alert["generatorURL"].tame(check_string).replace("tab=1", "tab=0")
|
||||
body = f"{desc} ([source]({url}))"
|
||||
else:
|
||||
body = desc
|
||||
if name not in topics:
|
||||
topics[name] = {"firing": [], "resolved": []}
|
||||
topics[name][alert["status"].tame(check_string)].append(body)
|
||||
|
||||
for topic_name, statuses in topics.items():
|
||||
for status, messages in statuses.items():
|
||||
if len(messages) == 0:
|
||||
continue
|
||||
|
||||
if status == "firing":
|
||||
icon = ":alert:"
|
||||
title = "FIRING"
|
||||
else:
|
||||
title = "Resolved"
|
||||
icon = ":squared_ok:"
|
||||
|
||||
if len(messages) == 1:
|
||||
body = f"{icon} **{title}** {messages[0]}"
|
||||
else:
|
||||
message_list = "\n".join(f"* {m}" for m in messages)
|
||||
body = f"{icon} **{title}**\n{message_list}"
|
||||
|
||||
check_send_webhook_message(request, user_profile, topic_name, body)
|
||||
|
||||
return json_success(request)
|
||||
0
zerver/webhooks/ansibletower/__init__.py
Normal file
0
zerver/webhooks/ansibletower/__init__.py
Normal file
34
zerver/webhooks/ansibletower/doc.md
Normal file
34
zerver/webhooks/ansibletower/doc.md
Normal file
@@ -0,0 +1,34 @@
|
||||
# Zulip Ansible Tower integration
|
||||
|
||||
Get Ansible Tower notifications in Zulip!
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. Go to **Notifications** in your Ansible Tower or AWX Admin Portal,
|
||||
and select **Add**.
|
||||
|
||||
1. Set **Name** to a name of your choice, such as `Zulip`. Select the
|
||||
organization you'd like to be notified about, and set **Type** to
|
||||
**Webhook**. Set **Target URL** to the URL generated above, and
|
||||
click **Save**.
|
||||
|
||||
1. Go to **Organizations**, and find the organization you selected
|
||||
when adding the webhook notification. Click the pencil icon to edit
|
||||
the organization.
|
||||
|
||||
1. Select **Notifications**, and then select the events you would like
|
||||
to be notified about, and click **Save**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"name": "shell: uname -r",
|
||||
"started": "2018-09-13T19:58:18.972357+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "AdHoc Command",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/command/2726",
|
||||
"finished": "2018-09-13T19:58:32.465169+00:00",
|
||||
"id": 2726
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "successful",
|
||||
"name": "shell: uname -r",
|
||||
"started": "2018-09-13T19:58:18.972357+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "AdHoc Command",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/command/2726",
|
||||
"finished": "2018-09-13T19:58:32.465169+00:00",
|
||||
"id": 2726
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"name": "AWX - Inventory Update",
|
||||
"started": "2018-09-13T19:49:13.628571+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "Inventory Update",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/inventory/2724",
|
||||
"finished": "2018-09-13T19:49:18.236014+00:00",
|
||||
"id": 2724
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "successful",
|
||||
"name": "AWX - Inventory Update",
|
||||
"started": "2018-09-13T19:49:13.628571+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "Inventory Update",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/inventory/2724",
|
||||
"finished": "2018-09-13T19:49:18.236014+00:00",
|
||||
"id": 2724
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Demo Job Template",
|
||||
"url": "https://towerhost/#/jobs/playbook/1",
|
||||
"created_by": "admin",
|
||||
"started": "2020-01-23T09:15:45.741213+00:00",
|
||||
"finished": "2020-01-23T09:15:49.729882+00:00",
|
||||
"status": "successful",
|
||||
"traceback": "",
|
||||
"inventory": "Demo Inventory",
|
||||
"project": "Demo Project",
|
||||
"playbook": "hello_world.yml",
|
||||
"credential": "Demo Credential",
|
||||
"limit": "",
|
||||
"extra_vars": "{}",
|
||||
"hosts": {
|
||||
"localhost": {
|
||||
"failed": false,
|
||||
"changed": 0,
|
||||
"dark": 0,
|
||||
"failures": 0,
|
||||
"ok": 2,
|
||||
"processed": 1,
|
||||
"skipped": 0,
|
||||
"rescued": 0,
|
||||
"ignored": 0
|
||||
}
|
||||
}
|
||||
}
|
||||
28
zerver/webhooks/ansibletower/fixtures/job_failed.json
Normal file
28
zerver/webhooks/ansibletower/fixtures/job_failed.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"credential": null,
|
||||
"name": "System - Updates - Ubuntu",
|
||||
"started": "2018-09-13T19:05:18.276217+00:00",
|
||||
"extra_vars": "{}",
|
||||
"traceback": "",
|
||||
"friendly_name": "Job",
|
||||
"created_by": "admin",
|
||||
"project": "AWX - Ansible Playbooks",
|
||||
"url": "http://awx.example.co.uk/#/jobs/playbook/2722",
|
||||
"finished": "2018-09-13T19:05:29.927509+00:00",
|
||||
"hosts": {
|
||||
"chat.example.co.uk": {
|
||||
"skipped": 0,
|
||||
"ok": 0,
|
||||
"changed": 0,
|
||||
"dark": 1,
|
||||
"failed": true,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
}
|
||||
},
|
||||
"playbook": "system-updates/run-apt-updates.yml",
|
||||
"limit": "os-ubuntu",
|
||||
"id": 2722,
|
||||
"inventory": "Production Servers"
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"credential": null,
|
||||
"name": "System - Updates - Ubuntu",
|
||||
"started": "2018-09-13T19:05:18.276217+00:00",
|
||||
"extra_vars": "{}",
|
||||
"traceback": "",
|
||||
"friendly_name": "Job",
|
||||
"created_by": "admin",
|
||||
"project": "AWX - Ansible Playbooks",
|
||||
"url": "http://awx.example.co.uk/#/jobs/playbook/2722",
|
||||
"finished": "2018-09-13T19:05:29.927509+00:00",
|
||||
"hosts": {
|
||||
"chat.example.co.uk": {
|
||||
"skipped": 0,
|
||||
"ok": 0,
|
||||
"changed": 0,
|
||||
"dark": 1,
|
||||
"failed": true,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"ipa.example.co.uk": {
|
||||
"skipped": 0,
|
||||
"ok": 0,
|
||||
"changed": 0,
|
||||
"dark": 1,
|
||||
"failed": true,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"mail.example.co.uk": {
|
||||
"skipped": 0,
|
||||
"ok": 0,
|
||||
"changed": 0,
|
||||
"dark": 1,
|
||||
"failed": true,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"devops.example.co.uk": {
|
||||
"skipped": 0,
|
||||
"ok": 0,
|
||||
"changed": 0,
|
||||
"dark": 1,
|
||||
"failed": true,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"gitlab.example.co.uk": {
|
||||
"skipped": 0,
|
||||
"ok": 0,
|
||||
"changed": 0,
|
||||
"dark": 1,
|
||||
"failed": true,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
}
|
||||
},
|
||||
"playbook": "system-updates/run-apt-updates.yml",
|
||||
"limit": "os-ubuntu",
|
||||
"id": 2722,
|
||||
"inventory": "Production Servers"
|
||||
}
|
||||
28
zerver/webhooks/ansibletower/fixtures/job_successful.json
Normal file
28
zerver/webhooks/ansibletower/fixtures/job_successful.json
Normal file
@@ -0,0 +1,28 @@
|
||||
{
|
||||
"status": "successful",
|
||||
"credential": "AWX - SSH",
|
||||
"name": "System - Deploy - Zabbix Agent",
|
||||
"started": "2018-09-11T19:19:10.153888+00:00",
|
||||
"extra_vars": "{}",
|
||||
"traceback": "",
|
||||
"friendly_name": "Job",
|
||||
"created_by": "None",
|
||||
"project": "AWX - Ansible Playbooks",
|
||||
"url": "http://awx.example.co.uk/#/jobs/playbook/2674",
|
||||
"finished": "2018-09-11T19:21:41.187605+00:00",
|
||||
"hosts": {
|
||||
"chat.example.co.uk": {
|
||||
"skipped": 28,
|
||||
"ok": 16,
|
||||
"changed": 0,
|
||||
"dark": 0,
|
||||
"failed": false,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
}
|
||||
},
|
||||
"playbook": "system-zabbix-agent/deploy-zabbix-agent.yml",
|
||||
"limit": "!system-awx",
|
||||
"id": 2674,
|
||||
"inventory": "Production Servers"
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
{
|
||||
"status": "successful",
|
||||
"credential": "AWX - SSH",
|
||||
"name": "System - Deploy - Zabbix Agent",
|
||||
"started": "2018-09-11T19:19:10.153888+00:00",
|
||||
"extra_vars": "{}",
|
||||
"traceback": "",
|
||||
"friendly_name": "Job",
|
||||
"created_by": "None",
|
||||
"project": "AWX - Ansible Playbooks",
|
||||
"url": "http://awx.example.co.uk/#/jobs/playbook/2674",
|
||||
"finished": "2018-09-11T19:21:41.187605+00:00",
|
||||
"hosts": {
|
||||
"gitlab.example.co.uk": {
|
||||
"skipped": 29,
|
||||
"ok": 15,
|
||||
"changed": 0,
|
||||
"dark": 0,
|
||||
"failed": false,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"chat.example.co.uk": {
|
||||
"skipped": 28,
|
||||
"ok": 16,
|
||||
"changed": 0,
|
||||
"dark": 0,
|
||||
"failed": false,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"devops.example.co.uk": {
|
||||
"skipped": 31,
|
||||
"ok": 13,
|
||||
"changed": 0,
|
||||
"dark": 0,
|
||||
"failed": false,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"ipa.example.co.uk": {
|
||||
"skipped": 31,
|
||||
"ok": 13,
|
||||
"changed": 0,
|
||||
"dark": 0,
|
||||
"failed": false,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
},
|
||||
"mail.example.co.uk": {
|
||||
"skipped": 31,
|
||||
"ok": 13,
|
||||
"changed": 0,
|
||||
"dark": 0,
|
||||
"failed": false,
|
||||
"processed": 1,
|
||||
"failures": 0
|
||||
}
|
||||
},
|
||||
"playbook": "system-zabbix-agent/deploy-zabbix-agent.yml",
|
||||
"limit": "!system-awx",
|
||||
"id": 2674,
|
||||
"inventory": "Production Servers"
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"name": "AWX - Project Update",
|
||||
"started": "2018-09-11T19:26:52.035205+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "Project Update",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/project/2678",
|
||||
"finished": "2018-09-11T19:26:56.193385+00:00",
|
||||
"id": 2678
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "successful",
|
||||
"name": "AWX - Project Update",
|
||||
"started": "2018-09-11T19:26:43.861738+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "Project Update",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/project/2677",
|
||||
"finished": "2018-09-11T19:26:50.966798+00:00",
|
||||
"id": 2677
|
||||
}
|
||||
11
zerver/webhooks/ansibletower/fixtures/system_job_failed.json
Normal file
11
zerver/webhooks/ansibletower/fixtures/system_job_failed.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "failed",
|
||||
"name": "Cleanup Job Details",
|
||||
"started": "2018-09-13T18:57:15.891742+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "System Job",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/system/2721",
|
||||
"finished": "2018-09-13T19:00:39.919286+00:00",
|
||||
"id": 2721
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"status": "successful",
|
||||
"name": "Cleanup Job Details",
|
||||
"started": "2018-09-13T18:57:15.891742+00:00",
|
||||
"traceback": "",
|
||||
"friendly_name": "System Job",
|
||||
"created_by": "admin",
|
||||
"url": "http://awx.example.co.uk/#/jobs/system/2721",
|
||||
"finished": "2018-09-13T19:00:39.919286+00:00",
|
||||
"id": 2721
|
||||
}
|
||||
170
zerver/webhooks/ansibletower/tests.py
Normal file
170
zerver/webhooks/ansibletower/tests.py
Normal file
@@ -0,0 +1,170 @@
|
||||
from zerver.lib.test_classes import WebhookTestCase
|
||||
|
||||
|
||||
class AnsibletowerHookTests(WebhookTestCase):
|
||||
def test_ansibletower_project_update_successful_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower project update successful notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "AWX - Project Update"
|
||||
expected_message = (
|
||||
"Project Update: [#2677 AWX - Project Update]"
|
||||
"(http://awx.example.co.uk/#/jobs/project/2677) was successful."
|
||||
)
|
||||
|
||||
self.check_webhook("project_update_successful", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_project_update_failed_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower project update failed notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "AWX - Project Update"
|
||||
expected_message = (
|
||||
"Project Update: [#2678 AWX - Project Update]"
|
||||
"(http://awx.example.co.uk/#/jobs/project/2678) failed."
|
||||
)
|
||||
|
||||
self.check_webhook("project_update_failed", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_job_successful_multiple_hosts_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower job successful multiple hosts notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "System - Deploy - Zabbix Agent"
|
||||
expected_message = """
|
||||
Job: [#2674 System - Deploy - Zabbix Agent](http://awx.example.co.uk/#/jobs/playbook/2674) was successful:
|
||||
* chat.example.co.uk: Success
|
||||
* devops.example.co.uk: Success
|
||||
* gitlab.example.co.uk: Success
|
||||
* ipa.example.co.uk: Success
|
||||
* mail.example.co.uk: Success
|
||||
""".strip()
|
||||
|
||||
self.check_webhook("job_successful_multiple_hosts", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_job_successful_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower job successful notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "System - Deploy - Zabbix Agent"
|
||||
expected_message = """
|
||||
Job: [#2674 System - Deploy - Zabbix Agent](http://awx.example.co.uk/#/jobs/playbook/2674) was successful:
|
||||
* chat.example.co.uk: Success
|
||||
""".strip()
|
||||
|
||||
self.check_webhook("job_successful", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_nine_job_successful_message(self) -> None:
|
||||
"""
|
||||
Test to see if awx/ansibletower 9.x.x job successful notifications are
|
||||
handled just as successfully as prior to 9.x.x.
|
||||
"""
|
||||
expected_topic_name = "Demo Job Template"
|
||||
expected_message = """
|
||||
Job: [#1 Demo Job Template](https://towerhost/#/jobs/playbook/1) was successful:
|
||||
* localhost: Success
|
||||
""".strip()
|
||||
|
||||
self.check_webhook(
|
||||
"job_complete_successful_awx_9.1.1", expected_topic_name, expected_message
|
||||
)
|
||||
|
||||
def test_ansibletower_job_failed_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower job failed notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "System - Updates - Ubuntu"
|
||||
expected_message = """
|
||||
Job: [#2722 System - Updates - Ubuntu](http://awx.example.co.uk/#/jobs/playbook/2722) failed:
|
||||
* chat.example.co.uk: Failed
|
||||
""".strip()
|
||||
|
||||
self.check_webhook("job_failed", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_job_failed_multiple_hosts_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower job failed notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "System - Updates - Ubuntu"
|
||||
expected_message = """
|
||||
Job: [#2722 System - Updates - Ubuntu](http://awx.example.co.uk/#/jobs/playbook/2722) failed:
|
||||
* chat.example.co.uk: Failed
|
||||
* devops.example.co.uk: Failed
|
||||
* gitlab.example.co.uk: Failed
|
||||
* ipa.example.co.uk: Failed
|
||||
* mail.example.co.uk: Failed
|
||||
""".strip()
|
||||
|
||||
self.check_webhook("job_failed_multiple_hosts", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_inventory_update_successful_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower inventory update successful notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "AWX - Inventory Update"
|
||||
expected_message = (
|
||||
"Inventory Update: [#2724 AWX - Inventory Update]"
|
||||
"(http://awx.example.co.uk/#/jobs/inventory/2724) was successful."
|
||||
)
|
||||
|
||||
self.check_webhook("inventory_update_successful", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_inventory_update_failed_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower inventory update failed notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "AWX - Inventory Update"
|
||||
expected_message = (
|
||||
"Inventory Update: [#2724 AWX - Inventory Update]"
|
||||
"(http://awx.example.co.uk/#/jobs/inventory/2724) failed."
|
||||
)
|
||||
|
||||
self.check_webhook("inventory_update_failed", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_adhoc_command_successful_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower adhoc command successful notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "shell: uname -r"
|
||||
expected_message = (
|
||||
"AdHoc Command: [#2726 shell: uname -r]"
|
||||
"(http://awx.example.co.uk/#/jobs/command/2726) was successful."
|
||||
)
|
||||
|
||||
self.check_webhook("adhoc_command_successful", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_adhoc_command_failed_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower adhoc command failed notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "shell: uname -r"
|
||||
expected_message = (
|
||||
"AdHoc Command: [#2726 shell: uname -r]"
|
||||
"(http://awx.example.co.uk/#/jobs/command/2726) failed."
|
||||
)
|
||||
|
||||
self.check_webhook("adhoc_command_failed", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_system_job_successful_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower system job successful notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "Cleanup Job Details"
|
||||
expected_message = (
|
||||
"System Job: [#2721 Cleanup Job Details]"
|
||||
"(http://awx.example.co.uk/#/jobs/system/2721) was successful."
|
||||
)
|
||||
|
||||
self.check_webhook("system_job_successful", expected_topic_name, expected_message)
|
||||
|
||||
def test_ansibletower_system_job_failed_message(self) -> None:
|
||||
"""
|
||||
Tests if ansibletower system job failed notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "Cleanup Job Details"
|
||||
expected_message = (
|
||||
"System Job: [#2721 Cleanup Job Details]"
|
||||
"(http://awx.example.co.uk/#/jobs/system/2721) failed."
|
||||
)
|
||||
|
||||
self.check_webhook("system_job_failed", expected_topic_name, expected_message)
|
||||
104
zerver/webhooks/ansibletower/view.py
Normal file
104
zerver/webhooks/ansibletower/view.py
Normal file
@@ -0,0 +1,104 @@
|
||||
import operator
|
||||
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_bool, check_int, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.models import UserProfile
|
||||
|
||||
ANSIBLETOWER_DEFAULT_MESSAGE_TEMPLATE = "{friendly_name}: [#{id} {name}]({url}) {status}."
|
||||
|
||||
|
||||
ANSIBLETOWER_JOB_MESSAGE_TEMPLATE = """
|
||||
{friendly_name}: [#{id} {name}]({url}) {status}:
|
||||
{hosts_final_data}
|
||||
""".strip()
|
||||
|
||||
ANSIBLETOWER_JOB_HOST_ROW_TEMPLATE = "* {hostname}: {status}\n"
|
||||
|
||||
|
||||
@webhook_view("AnsibleTower")
|
||||
@typed_endpoint
|
||||
def api_ansibletower_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
) -> HttpResponse:
|
||||
body = get_body(payload)
|
||||
topic_name = payload["name"].tame(check_string)
|
||||
|
||||
check_send_webhook_message(request, user_profile, topic_name, body)
|
||||
return json_success(request)
|
||||
|
||||
|
||||
def extract_friendly_name(payload: WildValue) -> str:
|
||||
tentative_job_name = payload.get("friendly_name", "").tame(check_string)
|
||||
if not tentative_job_name:
|
||||
url = payload["url"].tame(check_string)
|
||||
segments = url.split("/")
|
||||
tentative_job_name = segments[-3]
|
||||
if tentative_job_name == "jobs":
|
||||
tentative_job_name = "Job"
|
||||
return tentative_job_name
|
||||
|
||||
|
||||
def get_body(payload: WildValue) -> str:
|
||||
friendly_name = extract_friendly_name(payload)
|
||||
if friendly_name == "Job":
|
||||
hosts_data = []
|
||||
for host, host_data in payload["hosts"].items():
|
||||
if host_data["failed"].tame(check_bool):
|
||||
hoststatus = "Failed"
|
||||
else:
|
||||
hoststatus = "Success"
|
||||
hosts_data.append(
|
||||
{
|
||||
"hostname": host,
|
||||
"status": hoststatus,
|
||||
}
|
||||
)
|
||||
|
||||
if payload["status"].tame(check_string) == "successful":
|
||||
status = "was successful"
|
||||
else:
|
||||
status = "failed"
|
||||
|
||||
return ANSIBLETOWER_JOB_MESSAGE_TEMPLATE.format(
|
||||
name=payload["name"].tame(check_string),
|
||||
friendly_name=friendly_name,
|
||||
id=payload["id"].tame(check_int),
|
||||
url=payload["url"].tame(check_string),
|
||||
status=status,
|
||||
hosts_final_data=get_hosts_content(hosts_data),
|
||||
)
|
||||
|
||||
else:
|
||||
if payload["status"].tame(check_string) == "successful":
|
||||
status = "was successful"
|
||||
else:
|
||||
status = "failed"
|
||||
|
||||
data = {
|
||||
"name": payload["name"].tame(check_string),
|
||||
"friendly_name": friendly_name,
|
||||
"id": payload["id"].tame(check_int),
|
||||
"url": payload["url"].tame(check_string),
|
||||
"status": status,
|
||||
}
|
||||
|
||||
return ANSIBLETOWER_DEFAULT_MESSAGE_TEMPLATE.format(**data)
|
||||
|
||||
|
||||
def get_hosts_content(hosts_data: list[dict[str, str]]) -> str:
|
||||
hosts_data = sorted(hosts_data, key=operator.itemgetter("hostname"))
|
||||
hosts_content = ""
|
||||
for host in hosts_data:
|
||||
hosts_content += ANSIBLETOWER_JOB_HOST_ROW_TEMPLATE.format(
|
||||
hostname=host["hostname"],
|
||||
status=host["status"],
|
||||
)
|
||||
return hosts_content
|
||||
0
zerver/webhooks/appfollow/__init__.py
Normal file
0
zerver/webhooks/appfollow/__init__.py
Normal file
27
zerver/webhooks/appfollow/doc.md
Normal file
27
zerver/webhooks/appfollow/doc.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Zulip AppFollow integration
|
||||
|
||||
Receive user reviews from your tracked apps on AppFollow!
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. In AppFollow, go to **Integrations**, and select **Add new
|
||||
integration**. Select your app under **Tracked apps**.
|
||||
|
||||
1. Search for **WebHook URL**, and click **Add integration**.
|
||||
|
||||
1. Set **WebHook URL** to the URL generated above, and fill out the rest
|
||||
of the form. Click **Add integration**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
3
zerver/webhooks/appfollow/fixtures/review.json
Normal file
3
zerver/webhooks/appfollow/fixtures/review.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"text":"Acme - Group chat\nApp Store, Acme Technologies, Inc.\n★★★★★ United States\n*Great for Information Management*\nAcme enables me to manage the flow of information quite well. I only wish I could create and edit my Acme Post files in the iOS app.\n_by_ *Mr RESOLUTIONARY* _for v3.9_\n[Permalink](http:\/\/appfollow.io\/permalink) · [Add tag](http:\/\/watch.appfollow.io\/add_tag)"
|
||||
}
|
||||
3
zerver/webhooks/appfollow/fixtures/sample.json
Normal file
3
zerver/webhooks/appfollow/fixtures/sample.json
Normal file
@@ -0,0 +1,3 @@
|
||||
{
|
||||
"text":"Webhook integration was successful.\nTest User \/ Acme (Google Play)"
|
||||
}
|
||||
60
zerver/webhooks/appfollow/tests.py
Normal file
60
zerver/webhooks/appfollow/tests.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from zerver.lib.test_classes import WebhookTestCase, ZulipTestCase
|
||||
from zerver.webhooks.appfollow.view import convert_markdown
|
||||
|
||||
|
||||
class AppFollowHookTests(WebhookTestCase):
|
||||
def test_sample(self) -> None:
|
||||
expected_topic_name = "Webhook integration was successful."
|
||||
expected_message = """Webhook integration was successful.
|
||||
Test User / Acme (Google Play)"""
|
||||
self.check_webhook(
|
||||
"sample",
|
||||
expected_topic_name,
|
||||
expected_message,
|
||||
content_type="application/x-www-form-urlencoded",
|
||||
)
|
||||
|
||||
def test_reviews(self) -> None:
|
||||
expected_topic_name = "Acme - Group chat"
|
||||
expected_message = """Acme - Group chat
|
||||
App Store, Acme Technologies, Inc.
|
||||
★★★★★ United States
|
||||
**Great for Information Management**
|
||||
Acme enables me to manage the flow of information quite well. I only wish I could create and edit my Acme Post files in the iOS app.
|
||||
*by* **Mr RESOLUTIONARY** *for v3.9*
|
||||
[Permalink](http://appfollow.io/permalink) · [Add tag](http://watch.appfollow.io/add_tag)"""
|
||||
self.check_webhook(
|
||||
"review",
|
||||
expected_topic_name,
|
||||
expected_message,
|
||||
content_type="application/x-www-form-urlencoded",
|
||||
)
|
||||
|
||||
def test_reviews_with_topic(self) -> None:
|
||||
self.url = self.build_webhook_url() + "&topic=foo"
|
||||
expected_topic_name = "foo"
|
||||
expected_message = """Acme - Group chat
|
||||
App Store, Acme Technologies, Inc.
|
||||
★★★★★ United States
|
||||
**Great for Information Management**
|
||||
Acme enables me to manage the flow of information quite well. I only wish I could create and edit my Acme Post files in the iOS app.
|
||||
*by* **Mr RESOLUTIONARY** *for v3.9*
|
||||
[Permalink](http://appfollow.io/permalink) · [Add tag](http://watch.appfollow.io/add_tag)"""
|
||||
self.check_webhook(
|
||||
"review",
|
||||
expected_topic_name,
|
||||
expected_message,
|
||||
content_type="application/x-www-form-urlencoded",
|
||||
)
|
||||
|
||||
|
||||
class ConvertMarkdownTest(ZulipTestCase):
|
||||
def test_convert_bold(self) -> None:
|
||||
self.assertEqual(convert_markdown("*test message*"), "**test message**")
|
||||
|
||||
def test_convert_italics(self) -> None:
|
||||
self.assertEqual(convert_markdown("_test message_"), "*test message*")
|
||||
self.assertEqual(convert_markdown("_ spaced message _"), " *spaced message* ")
|
||||
|
||||
def test_convert_strikethrough(self) -> None:
|
||||
self.assertEqual(convert_markdown("~test message~"), "~~test message~~")
|
||||
43
zerver/webhooks/appfollow/view.py
Normal file
43
zerver/webhooks/appfollow/view.py
Normal file
@@ -0,0 +1,43 @@
|
||||
# Webhooks for external integrations.
|
||||
import re
|
||||
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.models import UserProfile
|
||||
|
||||
|
||||
@webhook_view("AppFollow")
|
||||
@typed_endpoint
|
||||
def api_appfollow_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
) -> HttpResponse:
|
||||
message = payload["text"].tame(check_string)
|
||||
app_name_search = re.search(r"\A(.+)", message)
|
||||
assert app_name_search is not None
|
||||
app_name = app_name_search.group(0)
|
||||
topic_name = app_name
|
||||
|
||||
check_send_webhook_message(request, user_profile, topic_name, body=convert_markdown(message))
|
||||
return json_success(request)
|
||||
|
||||
|
||||
def convert_markdown(text: str) -> str:
|
||||
# Converts Slack-style Markdown to Zulip format
|
||||
# Implemented mainly for AppFollow messages
|
||||
# Not ready for general use as some edge-cases not handled
|
||||
# Convert bold
|
||||
text = re.sub(r"(?:(?<=\s)|(?<=^))\*(.+?\S)\*(?=\s|$)", r"**\1**", text)
|
||||
# Convert italics
|
||||
text = re.sub(r"\b_(\s*)(.+?)(\s*)_\b", r"\1*\2*\3", text)
|
||||
# Convert strikethrough
|
||||
text = re.sub(r"(?:(?<=\s)|(?<=^))~(.+?\S)~(?=\s|$)", r"~~\1~~", text)
|
||||
|
||||
return text
|
||||
0
zerver/webhooks/appveyor/__init__.py
Normal file
0
zerver/webhooks/appveyor/__init__.py
Normal file
25
zerver/webhooks/appveyor/doc.md
Normal file
25
zerver/webhooks/appveyor/doc.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Zulip AppVeyor integration
|
||||
|
||||
Receive AppVeyor notifications in Zulip!
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. Go to your AppVeyor Project Settings, and select **Notifications**.
|
||||
Click on **Add notification**, and then select **Webhook**.
|
||||
|
||||
1. Set **Webhook URL** to the URL generated above. Select the events
|
||||
you'd like to be notified about, and click **Save**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"eventName": "build_failure",
|
||||
"eventData": {
|
||||
"passed": false,
|
||||
"failed": true,
|
||||
"status": "failed",
|
||||
"started": "9/9/2018 7:04 PM",
|
||||
"finished": "9/9/2018 7:06 PM",
|
||||
"duration": "00:02:54.1586505",
|
||||
"projectId": 456857,
|
||||
"projectName": "Hubot-DSC-Resource",
|
||||
"buildId": 18638796,
|
||||
"buildNumber": 59,
|
||||
"buildVersion": "2.0.59",
|
||||
"repositoryProvider": "gitHub",
|
||||
"repositoryScm": "git",
|
||||
"repositoryName": "joebloggs/Hubot-DSC-Resource",
|
||||
"branch": "master",
|
||||
"commitId": "c06e208b47",
|
||||
"commitAuthor": "Joe Bloggs",
|
||||
"commitAuthorEmail": "joe.bloggs@example.com",
|
||||
"commitAuthorUsername": "joebloggs",
|
||||
"commitDate": "6/12/2018 6:22 PM",
|
||||
"commitMessage": "Increment version number.",
|
||||
"commitMessageExtended": "Signed-off-by: Joe Bloggs <joe.bloggs@example.com>",
|
||||
"committerName": "Joe Bloggs",
|
||||
"committerEmail": "joe.bloggs@example.com",
|
||||
"buildUrl": "https://ci.appveyor.com/project/joebloggs/hubot-dsc-resource/build/2.0.59",
|
||||
"commitUrl": "https://github.com/joebloggs/Hubot-DSC-Resource/commit/c06e208b47",
|
||||
"notificationSettingsUrl": "https://ci.appveyor.com/notifications",
|
||||
"isPullRequest": false,
|
||||
"messages": [],
|
||||
"jobs": [
|
||||
{
|
||||
"id": "flhhi1o73j0tbbt8",
|
||||
"name": "",
|
||||
"passed": false,
|
||||
"failed": true,
|
||||
"status": "Failed",
|
||||
"started": "9/9/2018 7:04 PM",
|
||||
"finished": "9/9/2018 7:06 PM",
|
||||
"duration": "00:02:54.1117792",
|
||||
"messages": [],
|
||||
"messagesTotal": 0,
|
||||
"messagesError": 0,
|
||||
"compilationMessages": [],
|
||||
"artifacts": [
|
||||
{
|
||||
"permalink": "https://ci.appveyor.com/api/buildjobs/flhhi1o73j0tbbts8/artifacts/InstallHubot-2.0.59.zip",
|
||||
"fileName": "InstallHubot-2.0.59.zip",
|
||||
"type": "Zip",
|
||||
"size": 41423,
|
||||
"url": "https://storage.googleapis.com/appveyor-artifacts/joebloggs-98248/hubot-dsc-resource/2-0-59/flhhi1o73j0tbbt8/InstallHubot-2.0.59.zip?GoogleAccessId=646512516365-bidt3t59mctt8vti6cffe2sbq65pnmb1@developer.gserviceaccount.com&Expires=1536523617&Signature=GDTsHhyTif5UZv6qDOa87DVYD5ubBmUPDk%2bppImEmp9KO%2bFHqt%2b9brLqN7k4wmz7EqIAG9skvNTfIRiOfIBTKvFyhsWaYGswnx6eUIbGdlloHTON%2fJpzsffQqXnA7eOznqizphrcpph0YAql1%2fmLgCk21dL31HB0RhJ5Qiah%2bQhVTyBlu8W7fzvOEJSaDCwqS6GRUYd3DoaUpjvGa9QaGGzBCLVkLLZIizz2xbvtxJfZVUB1EO3Uk6W17Rz4rxE4EFYFyZZsOIv%2bQcizEdmjcyapwJFBST7kpaN%2fK0Kw5LikFIMjyl0sgZa0ycf3V3a35mmdcfvAox5jN%2fLFgWwctg%3d%3d",
|
||||
"created": "0001-01-01T00:00:00+00:00"
|
||||
},
|
||||
{
|
||||
"permalink": "https://ci.appveyor.com/api/buildjobs/flhhi1o73j0tbbts8/artifacts/InstallHubot.zip",
|
||||
"fileName": "InstallHubot.zip",
|
||||
"type": "Zip",
|
||||
"size": 7335,
|
||||
"url": "https://storage.googleapis.com/appveyor-artifacts/joebloggs-98248/hubot-dsc-resource/2-0-59/flhhi1o73j0tbbt8/InstallHubot.zip?GoogleAccessId=646512516365-bidt3t59mctt8vti6cffe2sbq65pnmb1@developer.gserviceaccount.com&Expires=1536523617&Signature=P9SKuynprwgTm1%2f9PrQtivza39bq%2bA7FyPfN%2fk2DWrXTDoYLJqrePHPQC2fX4FAYhDPBk8YpwsEA8psn%2fI86Ye5fbkN%2f5AEUrdt%2b2jUAcAaysChnX2CGbHWCKl65Tiks8eG2ZuDnKpwLsB0X%2bUGP8q54pO1VuUqK8x5l%2fDV79pHY1p6wH8bF5bX%2bSDOYPmBX6mcpEDbou9NDGDqzox08OYyb76wWnDf0Uqzwzz5sB845TipoKMP4idtT3ODHCIkcojzBGl%2bl9avv6vWzTusZHARvbBm%2bQGdStmzvwaBhtvKOrFMJMS%2bau5YKiKVCDh9z480ok17OyCRIbVHLXSQ5Ew%3d%3d",
|
||||
"created": "0001-01-01T00:00:00+00:00"
|
||||
},
|
||||
{
|
||||
"permalink": "https://ci.appveyor.com/api/buildjobs/flhhi1o73j0tbbts8/artifacts/InstallHubot.2.0.59.nupkg",
|
||||
"fileName": "InstallHubot.2.0.59.nupkg",
|
||||
"type": "NuGetPackage",
|
||||
"size": 8663,
|
||||
"url": "https://storage.googleapis.com/appveyor-artifacts/joebloggs-98248/hubot-dsc-resource/2-0-59/flhhi1o73j0tbbt8/InstallHubot.2.0.59.nupkg?GoogleAccessId=646512516365-bidt3t59mctt8vti6cffe2sbq65pnmb1@developer.gserviceaccount.com&Expires=1536523617&Signature=B7HYnZRjKkplSCI9rIsY%2bVlp9Fnukinraj4utPNbopzyvKCNtgJ1RVPqr6h1%2bVRZQ2VXPQW6kpNj4PBpG%2bc24hOciFKFy0hkGvAddEKv4Q%2bP18MAS3cx%2bXnQBxPolFJtgq%2bfzA7XeTl6mzDT727WpjAnaByZuWVcLhf%2bXeuNHI2h121Vl8Ppdcd52y2dhhrBI5JPqspMOZ8d346ZQhWqbnfwZfBRuTO2CfG7MNy4pF4cKyMY5fLU2wlnm4VwJnd7xJqwt9qmx7x7vbFcyVdS404uD0Rd5PhPiBuUNVrDGcywL0TcwxMF9%2bd45UKyKBr5%2f31DqIdmUa0DCwaDZV2rYQ%3d%3d",
|
||||
"created": "0001-01-01T00:00:00+00:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
{
|
||||
"eventName": "build_success",
|
||||
"eventData": {
|
||||
"passed": true,
|
||||
"failed": false,
|
||||
"status": "completed",
|
||||
"started": "9/9/2018 7:04 PM",
|
||||
"finished": "9/9/2018 7:06 PM",
|
||||
"duration": "00:02:54.1586505",
|
||||
"projectId": 456857,
|
||||
"projectName": "Hubot-DSC-Resource",
|
||||
"buildId": 18638796,
|
||||
"buildNumber": 59,
|
||||
"buildVersion": "2.0.59",
|
||||
"repositoryProvider": "gitHub",
|
||||
"repositoryScm": "git",
|
||||
"repositoryName": "joebloggs/Hubot-DSC-Resource",
|
||||
"branch": "master",
|
||||
"commitId": "c06e208b47",
|
||||
"commitAuthor": "Joe Bloggs",
|
||||
"commitAuthorEmail": "joe.bloggs@example.com",
|
||||
"commitAuthorUsername": "joebloggs",
|
||||
"commitDate": "6/12/2018 6:22 PM",
|
||||
"commitMessage": "Increment version number.",
|
||||
"commitMessageExtended": "Signed-off-by: Joe Bloggs <joe.bloggs@example.com>",
|
||||
"committerName": "Joe Bloggs",
|
||||
"committerEmail": "joe.bloggs@example.com",
|
||||
"buildUrl": "https://ci.appveyor.com/project/joebloggs/hubot-dsc-resource/build/2.0.59",
|
||||
"commitUrl": "https://github.com/joebloggs/Hubot-DSC-Resource/commit/c06e208b47",
|
||||
"notificationSettingsUrl": "https://ci.appveyor.com/notifications",
|
||||
"isPullRequest": false,
|
||||
"messages": [],
|
||||
"jobs": [
|
||||
{
|
||||
"id": "flhhi1o73j0tbbt8",
|
||||
"name": "",
|
||||
"passed": true,
|
||||
"failed": false,
|
||||
"status": "Success",
|
||||
"started": "9/9/2018 7:04 PM",
|
||||
"finished": "9/9/2018 7:06 PM",
|
||||
"duration": "00:02:54.1117792",
|
||||
"messages": [],
|
||||
"messagesTotal": 0,
|
||||
"messagesError": 0,
|
||||
"compilationMessages": [],
|
||||
"artifacts": [
|
||||
{
|
||||
"permalink": "https://ci.appveyor.com/api/buildjobs/flhhi1o73j0tbbts8/artifacts/InstallHubot-2.0.59.zip",
|
||||
"fileName": "InstallHubot-2.0.59.zip",
|
||||
"type": "Zip",
|
||||
"size": 41423,
|
||||
"url": "https://storage.googleapis.com/appveyor-artifacts/joebloggs-98248/hubot-dsc-resource/2-0-59/flhhi1o73j0tbbt8/InstallHubot-2.0.59.zip?GoogleAccessId=646512516365-bidt3t59mctt8vti6cffe2sbq65pnmb1@developer.gserviceaccount.com&Expires=1536523617&Signature=GDTsHhyTif5UZv6qDOa87DVYD5ubBmUPDk%2bppImEmp9KO%2bFHqt%2b9brLqN7k4wmz7EqIAG9skvNTfIRiOfIBTKvFyhsWaYGswnx6eUIbGdlloHTON%2fJpzsffQqXnA7eOznqizphrcpph0YAql1%2fmLgCk21dL31HB0RhJ5Qiah%2bQhVTyBlu8W7fzvOEJSaDCwqS6GRUYd3DoaUpjvGa9QaGGzBCLVkLLZIizz2xbvtxJfZVUB1EO3Uk6W17Rz4rxE4EFYFyZZsOIv%2bQcizEdmjcyapwJFBST7kpaN%2fK0Kw5LikFIMjyl0sgZa0ycf3V3a35mmdcfvAox5jN%2fLFgWwctg%3d%3d",
|
||||
"created": "0001-01-01T00:00:00+00:00"
|
||||
},
|
||||
{
|
||||
"permalink": "https://ci.appveyor.com/api/buildjobs/flhhi1o73j0tbbts8/artifacts/InstallHubot.zip",
|
||||
"fileName": "InstallHubot.zip",
|
||||
"type": "Zip",
|
||||
"size": 7335,
|
||||
"url": "https://storage.googleapis.com/appveyor-artifacts/joebloggs-98248/hubot-dsc-resource/2-0-59/flhhi1o73j0tbbt8/InstallHubot.zip?GoogleAccessId=646512516365-bidt3t59mctt8vti6cffe2sbq65pnmb1@developer.gserviceaccount.com&Expires=1536523617&Signature=P9SKuynprwgTm1%2f9PrQtivza39bq%2bA7FyPfN%2fk2DWrXTDoYLJqrePHPQC2fX4FAYhDPBk8YpwsEA8psn%2fI86Ye5fbkN%2f5AEUrdt%2b2jUAcAaysChnX2CGbHWCKl65Tiks8eG2ZuDnKpwLsB0X%2bUGP8q54pO1VuUqK8x5l%2fDV79pHY1p6wH8bF5bX%2bSDOYPmBX6mcpEDbou9NDGDqzox08OYyb76wWnDf0Uqzwzz5sB845TipoKMP4idtT3ODHCIkcojzBGl%2bl9avv6vWzTusZHARvbBm%2bQGdStmzvwaBhtvKOrFMJMS%2bau5YKiKVCDh9z480ok17OyCRIbVHLXSQ5Ew%3d%3d",
|
||||
"created": "0001-01-01T00:00:00+00:00"
|
||||
},
|
||||
{
|
||||
"permalink": "https://ci.appveyor.com/api/buildjobs/flhhi1o73j0tbbts8/artifacts/InstallHubot.2.0.59.nupkg",
|
||||
"fileName": "InstallHubot.2.0.59.nupkg",
|
||||
"type": "NuGetPackage",
|
||||
"size": 8663,
|
||||
"url": "https://storage.googleapis.com/appveyor-artifacts/joebloggs-98248/hubot-dsc-resource/2-0-59/flhhi1o73j0tbbt8/InstallHubot.2.0.59.nupkg?GoogleAccessId=646512516365-bidt3t59mctt8vti6cffe2sbq65pnmb1@developer.gserviceaccount.com&Expires=1536523617&Signature=B7HYnZRjKkplSCI9rIsY%2bVlp9Fnukinraj4utPNbopzyvKCNtgJ1RVPqr6h1%2bVRZQ2VXPQW6kpNj4PBpG%2bc24hOciFKFy0hkGvAddEKv4Q%2bP18MAS3cx%2bXnQBxPolFJtgq%2bfzA7XeTl6mzDT727WpjAnaByZuWVcLhf%2bXeuNHI2h121Vl8Ppdcd52y2dhhrBI5JPqspMOZ8d346ZQhWqbnfwZfBRuTO2CfG7MNy4pF4cKyMY5fLU2wlnm4VwJnd7xJqwt9qmx7x7vbFcyVdS404uD0Rd5PhPiBuUNVrDGcywL0TcwxMF9%2bd45UKyKBr5%2f31DqIdmUa0DCwaDZV2rYQ%3d%3d",
|
||||
"created": "0001-01-01T00:00:00+00:00"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
31
zerver/webhooks/appveyor/tests.py
Normal file
31
zerver/webhooks/appveyor/tests.py
Normal file
@@ -0,0 +1,31 @@
|
||||
from zerver.lib.test_classes import WebhookTestCase
|
||||
|
||||
|
||||
class AppveyorHookTests(WebhookTestCase):
|
||||
def test_appveyor_build_success_message(self) -> None:
|
||||
"""
|
||||
Tests if appveyor build success notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "Hubot-DSC-Resource"
|
||||
expected_message = """
|
||||
[Build Hubot-DSC-Resource 2.0.59 completed](https://ci.appveyor.com/project/joebloggs/hubot-dsc-resource/build/2.0.59):
|
||||
* **Commit**: [c06e208b47: Increment version number.](https://github.com/joebloggs/Hubot-DSC-Resource/commit/c06e208b47) by Joe Bloggs
|
||||
* **Started**: <time:2018-09-09T19:04:00+00:00>
|
||||
* **Finished**: <time:2018-09-09T19:06:00+00:00>
|
||||
""".strip()
|
||||
|
||||
self.check_webhook("appveyor_build_success", expected_topic_name, expected_message)
|
||||
|
||||
def test_appveyor_build_failure_message(self) -> None:
|
||||
"""
|
||||
Tests if appveyor build failure notification is handled correctly
|
||||
"""
|
||||
expected_topic_name = "Hubot-DSC-Resource"
|
||||
expected_message = """
|
||||
[Build Hubot-DSC-Resource 2.0.59 failed](https://ci.appveyor.com/project/joebloggs/hubot-dsc-resource/build/2.0.59):
|
||||
* **Commit**: [c06e208b47: Increment version number.](https://github.com/joebloggs/Hubot-DSC-Resource/commit/c06e208b47) by Joe Bloggs
|
||||
* **Started**: <time:2018-09-09T19:04:00+00:00>
|
||||
* **Finished**: <time:2018-09-09T19:06:00+00:00>
|
||||
""".strip()
|
||||
|
||||
self.check_webhook("appveyor_build_failure", expected_topic_name, expected_message)
|
||||
69
zerver/webhooks/appveyor/view.py
Normal file
69
zerver/webhooks/appveyor/view.py
Normal file
@@ -0,0 +1,69 @@
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
from pydantic.alias_generators import to_snake
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.timestamp import datetime_to_global_time
|
||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.models import UserProfile
|
||||
|
||||
APPVEYOR_TOPIC_TEMPLATE = "{project_name}"
|
||||
APPVEYOR_MESSAGE_TEMPLATE = """
|
||||
[Build {project_name} {build_version} {status}]({build_url}):
|
||||
* **Commit**: [{commit_id}: {commit_message}]({commit_url}) by {committer_name}
|
||||
* **Started**: {started}
|
||||
* **Finished**: {finished}
|
||||
""".strip()
|
||||
|
||||
|
||||
def get_global_time(dt_str: str) -> str:
|
||||
return datetime_to_global_time(
|
||||
datetime.strptime(dt_str, "%m/%d/%Y %I:%M %p").replace(tzinfo=timezone.utc)
|
||||
)
|
||||
|
||||
|
||||
@webhook_view("Appveyor")
|
||||
@typed_endpoint
|
||||
def api_appveyor_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
) -> HttpResponse:
|
||||
body = get_body(payload)
|
||||
topic_name = get_topic_name(payload)
|
||||
|
||||
check_send_webhook_message(request, user_profile, topic_name, body)
|
||||
return json_success(request)
|
||||
|
||||
|
||||
def get_topic_name(payload: WildValue) -> str:
|
||||
event_data = payload["eventData"]
|
||||
return APPVEYOR_TOPIC_TEMPLATE.format(project_name=event_data["projectName"].tame(check_string))
|
||||
|
||||
|
||||
def get_body(payload: WildValue) -> str:
|
||||
event_data = payload["eventData"]
|
||||
fields = [
|
||||
"projectName",
|
||||
"buildVersion",
|
||||
"status",
|
||||
"buildUrl",
|
||||
"commitUrl",
|
||||
"committerName",
|
||||
"commitDate",
|
||||
"commitMessage",
|
||||
"commitId",
|
||||
"started",
|
||||
"finished",
|
||||
]
|
||||
data = {
|
||||
to_snake(field): get_global_time(value) if field in ["started", "finished"] else value
|
||||
for field, value in ((field, event_data[field].tame(check_string)) for field in fields)
|
||||
}
|
||||
|
||||
return APPVEYOR_MESSAGE_TEMPLATE.format(**data)
|
||||
0
zerver/webhooks/azuredevops/__init__.py
Normal file
0
zerver/webhooks/azuredevops/__init__.py
Normal file
33
zerver/webhooks/azuredevops/doc.md
Normal file
33
zerver/webhooks/azuredevops/doc.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Zulip Azure DevOps integration
|
||||
|
||||
Get Azure DevOps notifications in Zulip!
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-with-branch-filtering.md!}
|
||||
|
||||
1. Go to your project on Azure DevOps, click on the **Project
|
||||
settings** in the bottom left corner and select **Service
|
||||
hooks**. Click on **Create subscription**, select
|
||||
**Web hooks**, and click **Next**.
|
||||
|
||||
1. Select the [events](#filtering-incoming-events) you would like to receive
|
||||
notifications for, and click **Next**.
|
||||
|
||||
1. Set **URL** to the URL you generated. Ensure that **Resource
|
||||
details to send** and **Detailed messages to send** are set to
|
||||
**All**. Click **Finish**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
{!event-filtering-additional-feature.md!}
|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
@@ -0,0 +1,114 @@
|
||||
{
|
||||
"subscriptionId": "4f1eccb6-04ff-45dd-90aa-713078e5c395",
|
||||
"notificationId": 5,
|
||||
"id": "e41a8834-0875-4fa1-ace0-ba656e630af9",
|
||||
"eventType": "git.pullrequest.merged",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Merge attempted for pull request 4 (Add 4th PR) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/",
|
||||
"html": "Merge attempted for <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/4\">pull request 4</a> (Add 4th PR) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>",
|
||||
"markdown": "Merge attempted for [pull request 4](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/4) (Add 4th PR) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Merge attempted for pull request 4 (Add 4th PR) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/",
|
||||
"html": "Merge attempted for <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/4\">pull request 4</a> (Add 4th PR) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>",
|
||||
"markdown": "Merge attempted for [pull request 4](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/4) (Add 4th PR) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)"
|
||||
},
|
||||
"resource": {
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"revision": 11,
|
||||
"visibility": "private",
|
||||
"lastUpdateTime": "2022-07-17T05:01:05.987Z"
|
||||
},
|
||||
"size": 7840,
|
||||
"remoteUrl": "https://ttchong@dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"sshUrl": "git@ssh.dev.azure.com:v3/ttchong/test-zulip/test-zulip",
|
||||
"webUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"isDisabled": false
|
||||
},
|
||||
"pullRequestId": 4,
|
||||
"codeReviewId": 4,
|
||||
"status": "active",
|
||||
"createdBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"creationDate": "2022-07-30T07:47:15.091534Z",
|
||||
"title": "Add 4th PR",
|
||||
"sourceRefName": "refs/heads/preprod",
|
||||
"targetRefName": "refs/heads/main",
|
||||
"mergeStatus": "conflicts",
|
||||
"isDraft": false,
|
||||
"mergeId": "697a791b-ab1a-48bf-910f-df958081a45c",
|
||||
"lastMergeSourceCommit": {
|
||||
"commitId": "885adddfa29eeeb8a0c9448b6744d2cfe02b1ebf",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/885adddfa29eeeb8a0c9448b6744d2cfe02b1ebf"
|
||||
},
|
||||
"lastMergeTargetCommit": {
|
||||
"commitId": "6c86f973c0cd02726af8a5da074795745927e0d2",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/6c86f973c0cd02726af8a5da074795745927e0d2"
|
||||
},
|
||||
"reviewers": [
|
||||
{
|
||||
"reviewerUrl": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/4/reviewers/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"vote": 10,
|
||||
"hasDeclined": false,
|
||||
"isFlagged": false,
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6"
|
||||
}
|
||||
],
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/4",
|
||||
"_links": {
|
||||
"web": {
|
||||
"href": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/4"
|
||||
},
|
||||
"statuses": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/4/statuses"
|
||||
}
|
||||
},
|
||||
"supportsIterations": true,
|
||||
"artifactId": "vstfs:///Git/PullRequestId/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2%2f98f0ce59-a912-43d5-96d2-bc0942a03f7b%2f4"
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-30T07:48:03.2511337Z"
|
||||
}
|
||||
@@ -0,0 +1,135 @@
|
||||
{
|
||||
"subscriptionId": "4f1eccb6-04ff-45dd-90aa-713078e5c395",
|
||||
"notificationId": 8,
|
||||
"id": "d4cbc5f3-be4a-4fa6-80df-bfad83e313c5",
|
||||
"eventType": "git.pullrequest.merged",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Merge attempted for pull request 1 (Add PR request) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/",
|
||||
"html": "Merge attempted for <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1\">pull request 1</a> (Add PR request) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>",
|
||||
"markdown": "Merge attempted for [pull request 1](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1) (Add PR request) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Merge attempted for pull request 1 (Add PR request) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\r\nAdd PR request\r\n",
|
||||
"html": "Merge attempted for <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1\">pull request 1</a> (Add PR request) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a><p>Add PR request</p>",
|
||||
"markdown": "Merge attempted for [pull request 1](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1) (Add PR request) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)\r\nAdd PR request\r\n"
|
||||
},
|
||||
"resource": {
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"revision": 11,
|
||||
"visibility": "private",
|
||||
"lastUpdateTime": "2022-07-17T05:01:05.987Z"
|
||||
},
|
||||
"size": 7840,
|
||||
"remoteUrl": "https://ttchong@dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"sshUrl": "git@ssh.dev.azure.com:v3/ttchong/test-zulip/test-zulip",
|
||||
"webUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"isDisabled": false
|
||||
},
|
||||
"pullRequestId": 1,
|
||||
"codeReviewId": 1,
|
||||
"status": "completed",
|
||||
"createdBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"creationDate": "2022-07-24T08:02:50.160355Z",
|
||||
"closedDate": "2022-07-30T07:55:03.5006647Z",
|
||||
"title": "Add PR request",
|
||||
"description": "Add PR request",
|
||||
"sourceRefName": "refs/heads/dev",
|
||||
"targetRefName": "refs/heads/main",
|
||||
"mergeStatus": "succeeded",
|
||||
"isDraft": false,
|
||||
"mergeId": "3cb082bf-62fd-4ff9-81f2-bea41241eadb",
|
||||
"lastMergeSourceCommit": {
|
||||
"commitId": "179f0b4e4a9318d1907402662b0a416550926ebb",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/179f0b4e4a9318d1907402662b0a416550926ebb"
|
||||
},
|
||||
"lastMergeTargetCommit": {
|
||||
"commitId": "6c86f973c0cd02726af8a5da074795745927e0d2",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/6c86f973c0cd02726af8a5da074795745927e0d2"
|
||||
},
|
||||
"lastMergeCommit": {
|
||||
"commitId": "b2606c193460441311f4d31f4729589c77f5efe0",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-30T07:55:02Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-30T07:55:02Z"
|
||||
},
|
||||
"comment": "Merged PR 1: Add PR request",
|
||||
"commentTruncated": true,
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b2606c193460441311f4d31f4729589c77f5efe0"
|
||||
},
|
||||
"reviewers": [],
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/1",
|
||||
"_links": {
|
||||
"web": {
|
||||
"href": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1"
|
||||
},
|
||||
"statuses": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/1/statuses"
|
||||
}
|
||||
},
|
||||
"completionOptions": {
|
||||
"mergeCommitMessage": "Merged PR 1: Add PR request\n\nAdd PR request",
|
||||
"mergeStrategy": "noFastForward",
|
||||
"transitionWorkItems": true,
|
||||
"autoCompleteIgnoreConfigIds": []
|
||||
},
|
||||
"supportsIterations": true,
|
||||
"completionQueueTime": "2022-07-30T07:55:02.6159917Z",
|
||||
"closedBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"artifactId": "vstfs:///Git/PullRequestId/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2%2f98f0ce59-a912-43d5-96d2-bc0942a03f7b%2f1"
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-30T07:55:09.816217Z"
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
{
|
||||
"subscriptionId": "a0e7f493-8c02-498d-b9ee-86a8612bc74e",
|
||||
"notificationId": 1,
|
||||
"id": "d1e96858-24cd-4064-9e08-0c55db2ff3fa",
|
||||
"eventType": "git.pullrequest.created",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki created pull request 1 (Add PR request) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/",
|
||||
"html": "Yuro Itaki created <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1\">pull request 1</a> (Add PR request) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>",
|
||||
"markdown": "Yuro Itaki created [pull request 1](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1) (Add PR request) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki created pull request 1 (Add PR request) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\r\nAdd PR request\r\n",
|
||||
"html": "Yuro Itaki created <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1\">pull request 1</a> (Add PR request) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a><p>Add PR request</p>",
|
||||
"markdown": "Yuro Itaki created [pull request 1](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1) (Add PR request) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)\r\nAdd PR request\r\n"
|
||||
},
|
||||
"resource": {
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"revision": 11,
|
||||
"visibility": "private",
|
||||
"lastUpdateTime": "2022-07-17T05:01:05.987Z"
|
||||
},
|
||||
"size": 4425,
|
||||
"remoteUrl": "https://ttchong@dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"sshUrl": "git@ssh.dev.azure.com:v3/ttchong/test-zulip/test-zulip",
|
||||
"webUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"isDisabled": false
|
||||
},
|
||||
"pullRequestId": 1,
|
||||
"codeReviewId": 1,
|
||||
"status": "active",
|
||||
"createdBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"creationDate": "2022-07-24T08:02:50.160355Z",
|
||||
"title": "Add PR request",
|
||||
"description": "Add PR request",
|
||||
"sourceRefName": "refs/heads/dev",
|
||||
"targetRefName": "refs/heads/main",
|
||||
"mergeStatus": "succeeded",
|
||||
"isDraft": false,
|
||||
"mergeId": "3cb082bf-62fd-4ff9-81f2-bea41241eadb",
|
||||
"lastMergeSourceCommit": {
|
||||
"commitId": "8b913c8e0d0492952bd215da12df9a422182e9c5",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/8b913c8e0d0492952bd215da12df9a422182e9c5"
|
||||
},
|
||||
"lastMergeTargetCommit": {
|
||||
"commitId": "0929a3404b39f6e39076a640779b2c1c961e19b5",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
},
|
||||
"lastMergeCommit": {
|
||||
"commitId": "4d1292958374b3311a517429d6160f7fc434de86",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-24T08:02:50Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-24T08:02:50Z"
|
||||
},
|
||||
"comment": "Merge pull request 1 from dev into main",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/4d1292958374b3311a517429d6160f7fc434de86"
|
||||
},
|
||||
"reviewers": [],
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/1",
|
||||
"_links": {
|
||||
"web": {
|
||||
"href": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1"
|
||||
},
|
||||
"statuses": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/1/statuses"
|
||||
}
|
||||
},
|
||||
"supportsIterations": true,
|
||||
"artifactId": "vstfs:///Git/PullRequestId/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2%2f98f0ce59-a912-43d5-96d2-bc0942a03f7b%2f1"
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-24T08:02:56.9717413Z"
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
{
|
||||
"subscriptionId": "a0e7f493-8c02-498d-b9ee-86a8612bc74e",
|
||||
"notificationId": 2,
|
||||
"id": "3559461b-0001-422f-8c1c-7946284839ab",
|
||||
"eventType": "git.pullrequest.created",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki created pull request 2 (Raised 2nd PR!) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/",
|
||||
"html": "Yuro Itaki created <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2\">pull request 2</a> (Raised 2nd PR!) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>",
|
||||
"markdown": "Yuro Itaki created [pull request 2](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2) (Raised 2nd PR!) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki created pull request 2 (Raised 2nd PR!) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\r\nRaised 2nd PR!\r\n",
|
||||
"html": "Yuro Itaki created <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2\">pull request 2</a> (Raised 2nd PR!) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a><p>Raised 2nd PR!</p>",
|
||||
"markdown": "Yuro Itaki created [pull request 2](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2) (Raised 2nd PR!) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)\r\nRaised 2nd PR!\r\n"
|
||||
},
|
||||
"resource": {
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"revision": 11,
|
||||
"visibility": "private",
|
||||
"lastUpdateTime": "2022-07-17T05:01:05.987Z"
|
||||
},
|
||||
"size": 4425,
|
||||
"remoteUrl": "https://ttchong@dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"sshUrl": "git@ssh.dev.azure.com:v3/ttchong/test-zulip/test-zulip",
|
||||
"webUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"isDisabled": false
|
||||
},
|
||||
"pullRequestId": 2,
|
||||
"codeReviewId": 2,
|
||||
"status": "active",
|
||||
"createdBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"creationDate": "2022-07-24T08:45:53.9577409Z",
|
||||
"title": "Raised 2nd PR!",
|
||||
"sourceRefName": "refs/heads/stg",
|
||||
"targetRefName": "refs/heads/main",
|
||||
"mergeStatus": "succeeded",
|
||||
"isDraft": false,
|
||||
"mergeId": "675bced4-738a-4f9e-b255-a30dce8b91df",
|
||||
"lastMergeSourceCommit": {
|
||||
"commitId": "fe3b16dd2079fc96f4e31752b0e3e0782389b469",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/fe3b16dd2079fc96f4e31752b0e3e0782389b469"
|
||||
},
|
||||
"lastMergeTargetCommit": {
|
||||
"commitId": "0929a3404b39f6e39076a640779b2c1c961e19b5",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
},
|
||||
"lastMergeCommit": {
|
||||
"commitId": "037561654dedfcc22e96230eee4550916357ec7a",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-24T08:45:54Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-24T08:45:54Z"
|
||||
},
|
||||
"comment": "Merge pull request 2 from stg into main",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/037561654dedfcc22e96230eee4550916357ec7a"
|
||||
},
|
||||
"reviewers": [
|
||||
{
|
||||
"reviewerUrl": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/2/reviewers/ed580ebe-b4a9-485d-bfed-c58ba519d7b6",
|
||||
"vote": 0,
|
||||
"hasDeclined": false,
|
||||
"isFlagged": false,
|
||||
"displayName": "Project Collection Build Service (Pad9e1dcf-6055-4fc7-a146-5511ab5ab1e8)",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/ed580ebe-b4a9-485d-bfed-c58ba519d7b6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/svc.YTU2Y2JhNGEtZGM4MC00ZGQyLTkxZmEtNmZlNzA0N2ZlYTdjOkJ1aWxkOmFkOWUxZGNmLTYwNTUtNGZjNy1hMTQ2LTU1MTFhYjVhYjFlOA"
|
||||
}
|
||||
},
|
||||
"id": "ed580ebe-b4a9-485d-bfed-c58ba519d7b6",
|
||||
"uniqueName": "Build\\ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=ed580ebe-b4a9-485d-bfed-c58ba519d7b6"
|
||||
}
|
||||
],
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/2",
|
||||
"_links": {
|
||||
"web": {
|
||||
"href": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2"
|
||||
},
|
||||
"statuses": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/2/statuses"
|
||||
}
|
||||
},
|
||||
"supportsIterations": true,
|
||||
"artifactId": "vstfs:///Git/PullRequestId/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2%2f98f0ce59-a912-43d5-96d2-bc0942a03f7b%2f2"
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-24T08:46:00.8535001Z"
|
||||
}
|
||||
@@ -0,0 +1,136 @@
|
||||
{
|
||||
"subscriptionId": "d21a27a6-3b89-45fb-9af9-0fe220348c1d",
|
||||
"notificationId": 1,
|
||||
"id": "6544f94b-ce5d-4bc1-b4be-30559b589d15",
|
||||
"eventType": "git.pullrequest.updated",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki updated the source branch of pull request 2 (Raised 2nd PR!) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/",
|
||||
"html": "Yuro Itaki updated the source branch of <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2\">pull request 2</a> (Raised 2nd PR!) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>",
|
||||
"markdown": "Yuro Itaki updated the source branch of [pull request 2](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2) (Raised 2nd PR!) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki updated the source branch of pull request 2 (Raised 2nd PR!) in test-zulip\r\nhttps://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\r\nRaised 2nd PR!\r\n",
|
||||
"html": "Yuro Itaki updated the source branch of <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2\">pull request 2</a> (Raised 2nd PR!) in <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a><p>Raised 2nd PR!</p>",
|
||||
"markdown": "Yuro Itaki updated the source branch of [pull request 2](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2) (Raised 2nd PR!) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)\r\nRaised 2nd PR!\r\n"
|
||||
},
|
||||
"resource": {
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"revision": 11,
|
||||
"visibility": "private",
|
||||
"lastUpdateTime": "2022-07-17T05:01:05.987Z"
|
||||
},
|
||||
"size": 7840,
|
||||
"remoteUrl": "https://ttchong@dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"sshUrl": "git@ssh.dev.azure.com:v3/ttchong/test-zulip/test-zulip",
|
||||
"webUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip",
|
||||
"isDisabled": false
|
||||
},
|
||||
"pullRequestId": 2,
|
||||
"codeReviewId": 2,
|
||||
"status": "active",
|
||||
"createdBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"creationDate": "2022-07-24T08:45:53.9577409Z",
|
||||
"title": "Raised 2nd PR!",
|
||||
"description": "Raised 2nd PR!",
|
||||
"sourceRefName": "refs/heads/stg",
|
||||
"targetRefName": "refs/heads/main",
|
||||
"mergeStatus": "succeeded",
|
||||
"isDraft": false,
|
||||
"mergeId": "675bced4-738a-4f9e-b255-a30dce8b91df",
|
||||
"lastMergeSourceCommit": {
|
||||
"commitId": "aefa35fb7c4505b9b8337aff3c4be96eddbbd861",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/aefa35fb7c4505b9b8337aff3c4be96eddbbd861"
|
||||
},
|
||||
"lastMergeTargetCommit": {
|
||||
"commitId": "b2606c193460441311f4d31f4729589c77f5efe0",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b2606c193460441311f4d31f4729589c77f5efe0"
|
||||
},
|
||||
"lastMergeCommit": {
|
||||
"commitId": "f0fb095f4e89065e2edccaedae4535979e212b78",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-30T08:42:00Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-30T08:42:00Z"
|
||||
},
|
||||
"comment": "Merge pull request 2 from stg into main",
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/f0fb095f4e89065e2edccaedae4535979e212b78"
|
||||
},
|
||||
"reviewers": [
|
||||
{
|
||||
"reviewerUrl": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/2/reviewers/ed580ebe-b4a9-485d-bfed-c58ba519d7b6",
|
||||
"vote": 0,
|
||||
"hasDeclined": false,
|
||||
"isFlagged": false,
|
||||
"displayName": "Project Collection Build Service (Pad9e1dcf-6055-4fc7-a146-5511ab5ab1e8)",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/ed580ebe-b4a9-485d-bfed-c58ba519d7b6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/svc.YTU2Y2JhNGEtZGM4MC00ZGQyLTkxZmEtNmZlNzA0N2ZlYTdjOkJ1aWxkOmFkOWUxZGNmLTYwNTUtNGZjNy1hMTQ2LTU1MTFhYjVhYjFlOA"
|
||||
}
|
||||
},
|
||||
"id": "ed580ebe-b4a9-485d-bfed-c58ba519d7b6",
|
||||
"uniqueName": "Build\\ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=ed580ebe-b4a9-485d-bfed-c58ba519d7b6"
|
||||
}
|
||||
],
|
||||
"url": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/2",
|
||||
"_links": {
|
||||
"web": {
|
||||
"href": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2"
|
||||
},
|
||||
"statuses": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pullRequests/2/statuses"
|
||||
}
|
||||
},
|
||||
"completionOptions": {
|
||||
"mergeCommitMessage": "Merged PR 2: Raised 2nd PR!\n\nRaised 2nd PR!",
|
||||
"mergeStrategy": "noFastForward",
|
||||
"transitionWorkItems": true,
|
||||
"autoCompleteIgnoreConfigIds": []
|
||||
},
|
||||
"supportsIterations": true,
|
||||
"artifactId": "vstfs:///Git/PullRequestId/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2%2f98f0ce59-a912-43d5-96d2-bc0942a03f7b%2f2"
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-30T08:42:07.2382228Z"
|
||||
}
|
||||
107
zerver/webhooks/azuredevops/fixtures/code_push.json
Normal file
107
zerver/webhooks/azuredevops/fixtures/code_push.json
Normal file
@@ -0,0 +1,107 @@
|
||||
{
|
||||
"subscriptionId": "bb3738ff-00ae-472e-b752-d192c676780c",
|
||||
"notificationId": 2,
|
||||
"id": "9c335e3e-e047-405c-a420-d679bd54a299",
|
||||
"eventType": "git.push",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki pushed updates to test-zulip:main\r\n(https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)",
|
||||
"html": "Yuro Itaki pushed updates to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>",
|
||||
"markdown": "Yuro Itaki pushed updates to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki pushed a commit to test-zulip:main\r\n - Modify readme b0ce2f20 (https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369)",
|
||||
"html": "Yuro Itaki pushed a commit to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>\r\n<ul>\r\n<li>Modify readme <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369\">b0ce2f20</a></li>\r\n</ul>",
|
||||
"markdown": "Yuro Itaki pushed a commit to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)\r\n* Modify readme [b0ce2f20](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369)"
|
||||
},
|
||||
"resource": {
|
||||
"commits": [
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
}
|
||||
],
|
||||
"refUpdates": [
|
||||
{
|
||||
"name": "refs/heads/main",
|
||||
"oldObjectId": "51515957669f93c543df09f8f3e7f47c3613c879",
|
||||
"newObjectId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"visibility": "unchanged",
|
||||
"lastUpdateTime": "0001-01-01T00:00:00"
|
||||
},
|
||||
"defaultBranch": "refs/heads/main",
|
||||
"remoteUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip"
|
||||
},
|
||||
"pushedBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"pushId": 2,
|
||||
"date": "2022-07-17T07:14:05.9409049Z",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/2",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/2"
|
||||
},
|
||||
"repository": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b"
|
||||
},
|
||||
"commits": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/2/commits"
|
||||
},
|
||||
"pusher": {
|
||||
"href": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6"
|
||||
},
|
||||
"refs": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/refs/heads/main"
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-17T07:14:12.5477052Z"
|
||||
}
|
||||
@@ -0,0 +1,842 @@
|
||||
{
|
||||
"subscriptionId": "bb3738ff-00ae-472e-b752-d192c676780c",
|
||||
"notificationId": 2,
|
||||
"id": "9c335e3e-e047-405c-a420-d679bd54a299",
|
||||
"eventType": "git.push",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki pushed updates to test-zulip:main\r\n(https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)",
|
||||
"html": "Yuro Itaki pushed updates to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>",
|
||||
"markdown": "Yuro Itaki pushed updates to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki pushed 50 commits to test-zulip:main\r\n - Modify readme b0ce2f20 (https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369)",
|
||||
"html": "Yuro Itaki pushed 50 commits to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>\r\n<ul>\r\n<li>Modify readme <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369\">b0ce2f20</a></li>\r\n</ul>",
|
||||
"markdown": "Yuro Itaki pushed 50 commits to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)\r\n* Modify readme [b0ce2f20](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369)"
|
||||
},
|
||||
"resource": {
|
||||
"commits": [
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
},
|
||||
{
|
||||
"commitId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T07:14:01Z"
|
||||
},
|
||||
"comment": "Modify readme",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
}
|
||||
],
|
||||
"refUpdates": [
|
||||
{
|
||||
"name": "refs/heads/main",
|
||||
"oldObjectId": "51515957669f93c543df09f8f3e7f47c3613c879",
|
||||
"newObjectId": "b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"visibility": "unchanged",
|
||||
"lastUpdateTime": "0001-01-01T00:00:00"
|
||||
},
|
||||
"defaultBranch": "refs/heads/main",
|
||||
"remoteUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip"
|
||||
},
|
||||
"pushedBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"pushId": 2,
|
||||
"date": "2022-07-17T07:14:05.9409049Z",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/2",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/2"
|
||||
},
|
||||
"repository": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b"
|
||||
},
|
||||
"commits": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/2/commits"
|
||||
},
|
||||
"pusher": {
|
||||
"href": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6"
|
||||
},
|
||||
"refs": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/refs/heads/main"
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-17T07:14:12.5477052Z"
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"subscriptionId": "eead0877-fb06-46e2-9ec1-5f852a6d0297",
|
||||
"notificationId": 3,
|
||||
"id": "7687ae00-23fe-44e8-a66b-bb61d279e2e1",
|
||||
"eventType": "git.push",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki pushed updates to test-zulip:dev\r\n(https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev)",
|
||||
"html": "Yuro Itaki pushed updates to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev\">dev</a>",
|
||||
"markdown": "Yuro Itaki pushed updates to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[dev](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki pushed a commit to test-zulip:dev\r\n - Add reply 0929a340 (https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5)",
|
||||
"html": "Yuro Itaki pushed a commit to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev\">dev</a>\r\n<ul>\r\n<li>Add reply <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5\">0929a340</a></li>\r\n</ul>",
|
||||
"markdown": "Yuro Itaki pushed a commit to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[dev](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev)\r\n* Add reply [0929a340](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5)"
|
||||
},
|
||||
"resource": {
|
||||
"refUpdates": [
|
||||
{
|
||||
"name": "refs/heads/dev",
|
||||
"oldObjectId": "0000000000000000000000000000000000000000",
|
||||
"newObjectId": "0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"visibility": "unchanged",
|
||||
"lastUpdateTime": "0001-01-01T00:00:00"
|
||||
},
|
||||
"defaultBranch": "refs/heads/main",
|
||||
"remoteUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip"
|
||||
},
|
||||
"pushedBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"pushId": 5,
|
||||
"date": "2022-07-17T10:18:15.3667447Z",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/5",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/5"
|
||||
},
|
||||
"repository": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b"
|
||||
},
|
||||
"commits": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/5/commits"
|
||||
},
|
||||
"pusher": {
|
||||
"href": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6"
|
||||
},
|
||||
"refs": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/refs/heads/dev"
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-17T10:18:22.69149Z"
|
||||
}
|
||||
@@ -0,0 +1,122 @@
|
||||
{
|
||||
"subscriptionId": "eead0877-fb06-46e2-9ec1-5f852a6d0297",
|
||||
"notificationId": 2,
|
||||
"id": "7afcf4e6-f3d0-47f0-ba5f-395f0776496b",
|
||||
"eventType": "git.push",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki pushed updates to test-zulip:main\r\n(https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)",
|
||||
"html": "Yuro Itaki pushed updates to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>",
|
||||
"markdown": "Yuro Itaki pushed updates to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki pushed 2 commits to test-zulip:main\r\n - Add reply 0929a340 (https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5)\r\n - Add how are you 819ce8de (https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b)",
|
||||
"html": "Yuro Itaki pushed 2 commits to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>\r\n<ul>\r\n<li>Add reply <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5\">0929a340</a></li>\r\n<li>Add how are you <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b\">819ce8de</a></li>\r\n</ul>",
|
||||
"markdown": "Yuro Itaki pushed 2 commits to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)\r\n* Add reply [0929a340](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5)\r\n* Add how are you [819ce8de](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b)"
|
||||
},
|
||||
"resource": {
|
||||
"commits": [
|
||||
{
|
||||
"commitId": "0929a3404b39f6e39076a640779b2c1c961e19b5",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T09:13:02Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T09:13:02Z"
|
||||
},
|
||||
"comment": "Add reply",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
},
|
||||
{
|
||||
"commitId": "819ce8de51bedfc250c202edcaee0ce8dc70bf3b",
|
||||
"author": {
|
||||
"name": "Itachi Sensei",
|
||||
"email": "itachisensei@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Itachi Sensei",
|
||||
"email": "itachisensei@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"comment": "Add how are you",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/819ce8de51bedfc250c202edcaee0ce8dc70bf3b"
|
||||
}
|
||||
],
|
||||
"refUpdates": [
|
||||
{
|
||||
"name": "refs/heads/main",
|
||||
"oldObjectId": "cc21b940719cc372b364d932eb39e528b0ec2a91",
|
||||
"newObjectId": "0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"visibility": "unchanged",
|
||||
"lastUpdateTime": "0001-01-01T00:00:00"
|
||||
},
|
||||
"defaultBranch": "refs/heads/main",
|
||||
"remoteUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip"
|
||||
},
|
||||
"pushedBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"pushId": 4,
|
||||
"date": "2022-07-17T09:13:10.0775053Z",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/4",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/4"
|
||||
},
|
||||
"repository": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b"
|
||||
},
|
||||
"commits": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/4/commits"
|
||||
},
|
||||
"pusher": {
|
||||
"href": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6"
|
||||
},
|
||||
"refs": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/refs/heads/main"
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-17T09:13:17.0920723Z"
|
||||
}
|
||||
@@ -0,0 +1,182 @@
|
||||
{
|
||||
"subscriptionId": "eead0877-fb06-46e2-9ec1-5f852a6d0297",
|
||||
"notificationId": 2,
|
||||
"id": "7afcf4e6-f3d0-47f0-ba5f-395f0776496b",
|
||||
"eventType": "git.push",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki pushed updates to test-zulip:main\r\n(https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)",
|
||||
"html": "Yuro Itaki pushed updates to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>",
|
||||
"markdown": "Yuro Itaki pushed updates to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki pushed 6 commits to test-zulip:main\r\n - Add reply 0929a340 (https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5)\r\n - Add how are you 819ce8de (https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b)",
|
||||
"html": "Yuro Itaki pushed 6 commits to <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain\">main</a>\r\n<ul>\r\n<li>Add reply <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5\">0929a340</a></li>\r\n<li>Add how are you <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b\">819ce8de</a></li>\r\n</ul>",
|
||||
"markdown": "Yuro Itaki pushed 6 commits to [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[main](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBmain)\r\n* Add reply [0929a340](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5)\r\n* Add how are you [819ce8de](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b)"
|
||||
},
|
||||
"resource": {
|
||||
"commits": [
|
||||
{
|
||||
"commitId": "0929a3404b39f6e39076a640779b2c1c961e19b5",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T09:13:02Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T09:13:02Z"
|
||||
},
|
||||
"comment": "Add reply",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
},
|
||||
{
|
||||
"commitId": "819ce8de51bedfc250c202edcaee0ce8dc70bf3b",
|
||||
"author": {
|
||||
"name": "Itachi Sensei",
|
||||
"email": "itachisensei@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Itachi Sensei",
|
||||
"email": "itachisensei@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"comment": "Add how are you",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/819ce8de51bedfc250c202edcaee0ce8dc70bf3b"
|
||||
},
|
||||
{
|
||||
"commitId": "819ce8de51bedfc250c202edcaee0ce8dc70bf3b",
|
||||
"author": {
|
||||
"name": "Itachi Sensei",
|
||||
"email": "itachisensei@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Itachi Sensei",
|
||||
"email": "itachisensei@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"comment": "Add how are you",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/819ce8de51bedfc250c202edcaee0ce8dc70bf3b"
|
||||
},
|
||||
{
|
||||
"commitId": "819ce8de51bedfc250c202edcaee0ce8dc70bf3b",
|
||||
"author": {
|
||||
"name": "Lelouch Strange",
|
||||
"email": "lelouchstrange@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Lelouch Strange",
|
||||
"email": "lelouchstrange@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"comment": "Add how are you",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/819ce8de51bedfc250c202edcaee0ce8dc70bf3b"
|
||||
},
|
||||
{
|
||||
"commitId": "819ce8de51bedfc250c202edcaee0ce8dc70bf3b",
|
||||
"author": {
|
||||
"name": "Jonas Nielsen",
|
||||
"email": "jonasnielsen@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Jonas Nielsen",
|
||||
"email": "jonasnielsen@email.com",
|
||||
"date": "2022-07-17T09:12:35Z"
|
||||
},
|
||||
"comment": "Add how are you",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/819ce8de51bedfc250c202edcaee0ce8dc70bf3b"
|
||||
},
|
||||
{
|
||||
"commitId": "0929a3404b39f6e39076a640779b2c1c961e19b5",
|
||||
"author": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T09:13:02Z"
|
||||
},
|
||||
"committer": {
|
||||
"name": "Yuro Itaki",
|
||||
"email": "yuroitaki@email.com",
|
||||
"date": "2022-07-17T09:13:02Z"
|
||||
},
|
||||
"comment": "Add reply",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/commits/0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
}
|
||||
],
|
||||
"refUpdates": [
|
||||
{
|
||||
"name": "refs/heads/main",
|
||||
"oldObjectId": "cc21b940719cc372b364d932eb39e528b0ec2a91",
|
||||
"newObjectId": "0929a3404b39f6e39076a640779b2c1c961e19b5"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"visibility": "unchanged",
|
||||
"lastUpdateTime": "0001-01-01T00:00:00"
|
||||
},
|
||||
"defaultBranch": "refs/heads/main",
|
||||
"remoteUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip"
|
||||
},
|
||||
"pushedBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"pushId": 4,
|
||||
"date": "2022-07-17T09:13:10.0775053Z",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/4",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/4"
|
||||
},
|
||||
"repository": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b"
|
||||
},
|
||||
"commits": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/4/commits"
|
||||
},
|
||||
"pusher": {
|
||||
"href": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6"
|
||||
},
|
||||
"refs": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/refs/heads/main"
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-17T09:13:17.0920723Z"
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
"subscriptionId": "eead0877-fb06-46e2-9ec1-5f852a6d0297",
|
||||
"notificationId": 4,
|
||||
"id": "91264257-1f51-46d3-bba3-5448d40a724a",
|
||||
"eventType": "git.push",
|
||||
"publisherId": "tfs",
|
||||
"message": {
|
||||
"text": "Yuro Itaki deleted test-zulip:dev\r\n(https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev)",
|
||||
"html": "Yuro Itaki deleted <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:dev",
|
||||
"markdown": "Yuro Itaki deleted [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):dev"
|
||||
},
|
||||
"detailedMessage": {
|
||||
"text": "Yuro Itaki deleted test-zulip:dev",
|
||||
"html": "Yuro Itaki deleted <a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/\">test-zulip</a>:<a href=\"https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev\">dev</a>",
|
||||
"markdown": "Yuro Itaki deleted [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/):[dev](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/#version=GBdev)"
|
||||
},
|
||||
"resource": {
|
||||
"refUpdates": [
|
||||
{
|
||||
"name": "refs/heads/dev",
|
||||
"oldObjectId": "0929a3404b39f6e39076a640779b2c1c961e19b5",
|
||||
"newObjectId": "0000000000000000000000000000000000000000"
|
||||
}
|
||||
],
|
||||
"repository": {
|
||||
"id": "98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b",
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"name": "test-zulip",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/projects/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"state": "wellFormed",
|
||||
"visibility": "unchanged",
|
||||
"lastUpdateTime": "0001-01-01T00:00:00"
|
||||
},
|
||||
"defaultBranch": "refs/heads/main",
|
||||
"remoteUrl": "https://dev.azure.com/ttchong/test-zulip/_git/test-zulip"
|
||||
},
|
||||
"pushedBy": {
|
||||
"displayName": "Yuro Itaki",
|
||||
"url": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"_links": {
|
||||
"avatar": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/GraphProfile/MemberAvatars/msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
}
|
||||
},
|
||||
"id": "107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"uniqueName": "yuroitaki@email.com",
|
||||
"imageUrl": "https://dev.azure.com/ttchong/_api/_common/identityImage?id=107e08c7-2725-675e-a1b0-281729035ea6",
|
||||
"descriptor": "msa.MTA3ZTA4YzctMjcyNS03NzVlLWExYjAtMjgxNzI5MDM1ZWE2"
|
||||
},
|
||||
"pushId": 6,
|
||||
"date": "2022-07-17T11:08:58.0728467Z",
|
||||
"url": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/6",
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/6"
|
||||
},
|
||||
"repository": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b"
|
||||
},
|
||||
"commits": {
|
||||
"href": "https://dev.azure.com/ttchong/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/pushes/6/commits"
|
||||
},
|
||||
"pusher": {
|
||||
"href": "https://spsprodsea2.vssps.visualstudio.com/Aa56cba4a-dc80-4dd2-91fa-6fe7047fea7c/_apis/Identities/107e08c7-2725-675e-a1b0-281729035ea6"
|
||||
},
|
||||
"refs": {
|
||||
"href": "https://dev.azure.com/ttchong/068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2/_apis/git/repositories/98f0ce59-a912-43d5-96d2-bc0942a03f7b/refs/heads/dev"
|
||||
}
|
||||
}
|
||||
},
|
||||
"resourceVersion": "1.0",
|
||||
"resourceContainers": {
|
||||
"collection": {
|
||||
"id": "ad9e1dcf-6055-4fc7-a146-5511ab5ab1e8",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"account": {
|
||||
"id": "a56cba4a-dc80-4dd2-91fa-6fe7047fea7c",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
},
|
||||
"project": {
|
||||
"id": "068d2409-14eb-4d8a-88bf-c8a9e7f5b4e2",
|
||||
"baseUrl": "https://dev.azure.com/ttchong/"
|
||||
}
|
||||
},
|
||||
"createdDate": "2022-07-17T11:09:05.1538362Z"
|
||||
}
|
||||
92
zerver/webhooks/azuredevops/tests.py
Normal file
92
zerver/webhooks/azuredevops/tests.py
Normal file
@@ -0,0 +1,92 @@
|
||||
from unittest.mock import MagicMock, patch
|
||||
|
||||
from zerver.lib.test_classes import WebhookTestCase
|
||||
from zerver.lib.webhooks.git import COMMITS_LIMIT
|
||||
|
||||
|
||||
class AzuredevopsHookTests(WebhookTestCase):
|
||||
def test_push_event_message(self) -> None:
|
||||
expected_topic_name = "test-zulip / main"
|
||||
expected_message = "Yuro Itaki [pushed](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/branchCompare?baseVersion=GC51515957669f93c543df09f8f3e7f47c3613c879&targetVersion=GCb0ce2f2009c3c87dbefadf61d7eb2c0697a6f369&_a=files) 1 commit to branch main.\n\n* Modify readme ([b0ce2f2009c](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369))"
|
||||
self.check_webhook("code_push", expected_topic_name, expected_message)
|
||||
|
||||
def test_push_event_message_filtered_by_branches(self) -> None:
|
||||
self.url = self.build_webhook_url(branches="main,dev")
|
||||
expected_topic_name = "test-zulip / main"
|
||||
expected_message = "Yuro Itaki [pushed](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/branchCompare?baseVersion=GC51515957669f93c543df09f8f3e7f47c3613c879&targetVersion=GCb0ce2f2009c3c87dbefadf61d7eb2c0697a6f369&_a=files) 1 commit to branch main.\n\n* Modify readme ([b0ce2f2009c](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369))"
|
||||
self.check_webhook("code_push", expected_topic_name, expected_message)
|
||||
|
||||
@patch("zerver.lib.webhooks.common.check_send_webhook_message")
|
||||
def test_push_event_message_filtered_by_branches_ignore(
|
||||
self, check_send_webhook_message_mock: MagicMock
|
||||
) -> None:
|
||||
self.url = self.build_webhook_url(branches="development")
|
||||
payload = self.get_body("code_push")
|
||||
result = self.client_post(self.url, payload, content_type="application/json")
|
||||
self.assertFalse(check_send_webhook_message_mock.called)
|
||||
self.assert_json_success(result)
|
||||
|
||||
def test_push_local_branch_without_commits(self) -> None:
|
||||
expected_topic_name = "test-zulip / dev"
|
||||
expected_message = "Yuro Itaki [pushed](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/branchCompare?baseVersion=GC0000000000000000000000000000000000000000&targetVersion=GC0929a3404b39f6e39076a640779b2c1c961e19b5&_a=files) the branch dev."
|
||||
self.check_webhook(
|
||||
"code_push__local_branch_without_commits", expected_topic_name, expected_message
|
||||
)
|
||||
|
||||
def test_push_multiple_committers(self) -> None:
|
||||
expected_topic_name = "test-zulip / main"
|
||||
expected_message = "Yuro Itaki [pushed](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/branchCompare?baseVersion=GCcc21b940719cc372b364d932eb39e528b0ec2a91&targetVersion=GC0929a3404b39f6e39076a640779b2c1c961e19b5&_a=files) 2 commits to branch main. Commits by Itachi Sensei (1) and Yuro Itaki (1).\n\n* Add reply ([0929a3404b3](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5))\n* Add how are you ([819ce8de51b](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b))"
|
||||
self.check_webhook("code_push__multiple_committers", expected_topic_name, expected_message)
|
||||
|
||||
def test_push_multiple_committers_with_others(self) -> None:
|
||||
expected_topic_name = "test-zulip / main"
|
||||
commits_info = "* Add how are you ([819ce8de51b](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/819ce8de51bedfc250c202edcaee0ce8dc70bf3b))\n"
|
||||
expected_message = f"Yuro Itaki [pushed](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/branchCompare?baseVersion=GCcc21b940719cc372b364d932eb39e528b0ec2a91&targetVersion=GC0929a3404b39f6e39076a640779b2c1c961e19b5&_a=files) 6 commits to branch main. Commits by Itachi Sensei (2), Yuro Itaki (2), Jonas Nielsen (1) and others (1).\n\n* Add reply ([0929a3404b3](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5))\n{commits_info * 4}* Add reply ([0929a3404b3](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/0929a3404b39f6e39076a640779b2c1c961e19b5))"
|
||||
self.check_webhook(
|
||||
"code_push__multiple_committers_with_others", expected_topic_name, expected_message
|
||||
)
|
||||
|
||||
def test_push_commits_more_than_limit(self) -> None:
|
||||
expected_topic_name = "test-zulip / main"
|
||||
commits_info = "* Modify readme ([b0ce2f2009c](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/commit/b0ce2f2009c3c87dbefadf61d7eb2c0697a6f369))\n"
|
||||
expected_message = f"Yuro Itaki [pushed](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/branchCompare?baseVersion=GC51515957669f93c543df09f8f3e7f47c3613c879&targetVersion=GCb0ce2f2009c3c87dbefadf61d7eb2c0697a6f369&_a=files) 50 commits to branch main.\n\n{commits_info * COMMITS_LIMIT}[and {50 - COMMITS_LIMIT} more commit(s)]"
|
||||
self.check_webhook(
|
||||
"code_push__commits_more_than_limit", expected_topic_name, expected_message
|
||||
)
|
||||
|
||||
def test_push_remove_branch(self) -> None:
|
||||
expected_topic_name = "test-zulip / dev"
|
||||
expected_message = "Yuro Itaki [pushed](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/branchCompare?baseVersion=GC0929a3404b39f6e39076a640779b2c1c961e19b5&targetVersion=GC0000000000000000000000000000000000000000&_a=files) the branch dev."
|
||||
self.check_webhook("code_push__remove_branch", expected_topic_name, expected_message)
|
||||
|
||||
def test_pull_request_opened(self) -> None:
|
||||
expected_topic_name = "test-zulip / PR #1 Add PR request"
|
||||
expected_message = "Yuro Itaki created [PR #1 Add PR request](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1) from `dev` to `main`:\n\n``` quote\nAdd PR request\n```"
|
||||
self.check_webhook("code_pull_request__opened", expected_topic_name, expected_message)
|
||||
|
||||
def test_pull_request_opened_without_description(self) -> None:
|
||||
expected_topic_name = "test-zulip / PR #2 Raised 2nd PR!"
|
||||
expected_message = "Yuro Itaki created [PR #2 Raised 2nd PR!](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2) from `stg` to `main`."
|
||||
self.check_webhook(
|
||||
"code_pull_request__opened_without_description", expected_topic_name, expected_message
|
||||
)
|
||||
|
||||
def test_pull_request_merged(self) -> None:
|
||||
expected_topic_name = "test-zulip / PR #1 Add PR request"
|
||||
expected_message = "Yuro Itaki merged [PR #1 Add PR request](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/1) from `dev` to `main`."
|
||||
self.check_webhook("code_pull_request__merged", expected_topic_name, expected_message)
|
||||
|
||||
@patch("zerver.lib.webhooks.common.check_send_webhook_message")
|
||||
def test_pull_request_merge_attempted_ignore(
|
||||
self, check_send_webhook_message_mock: MagicMock
|
||||
) -> None:
|
||||
self.url = self.build_webhook_url()
|
||||
payload = self.get_body("code_pull_request__merge_attempted")
|
||||
result = self.client_post(self.url, payload, content_type="application/json")
|
||||
self.assertFalse(check_send_webhook_message_mock.called)
|
||||
self.assert_json_success(result)
|
||||
|
||||
def test_pull_request_updated(self) -> None:
|
||||
expected_topic_name = "test-zulip / PR #2 Raised 2nd PR!"
|
||||
expected_message = "Yuro Itaki updated [PR #2 Raised 2nd PR!](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2)\n\n``` quote\nYuro Itaki updated the source branch of [pull request 2](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/pullrequest/2) (Raised 2nd PR!) in [test-zulip](https://dev.azure.com/ttchong/test-zulip/_git/test-zulip/)\r\nRaised 2nd PR!\r\n\n```"
|
||||
self.check_webhook("code_pull_request__updated", expected_topic_name, expected_message)
|
||||
191
zerver/webhooks/azuredevops/view.py
Normal file
191
zerver/webhooks/azuredevops/view.py
Normal file
@@ -0,0 +1,191 @@
|
||||
from collections.abc import Callable
|
||||
|
||||
from django.http import HttpRequest, HttpResponse
|
||||
|
||||
from zerver.decorator import webhook_view
|
||||
from zerver.lib.exceptions import UnsupportedWebhookEventTypeError
|
||||
from zerver.lib.response import json_success
|
||||
from zerver.lib.typed_endpoint import JsonBodyPayload, typed_endpoint
|
||||
from zerver.lib.validator import WildValue, check_int, check_string
|
||||
from zerver.lib.webhooks.common import check_send_webhook_message
|
||||
from zerver.lib.webhooks.git import (
|
||||
TOPIC_WITH_BRANCH_TEMPLATE,
|
||||
TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE,
|
||||
get_pull_request_event_message,
|
||||
get_push_commits_event_message,
|
||||
is_branch_name_notifiable,
|
||||
)
|
||||
from zerver.models import UserProfile
|
||||
|
||||
|
||||
def get_code_pull_request_updated_body(payload: WildValue) -> str:
|
||||
return get_pull_request_event_message(
|
||||
user_name=get_code_pull_request_user_name(payload),
|
||||
action="updated",
|
||||
url=get_code_pull_request_url(payload),
|
||||
number=get_code_pull_request_id(payload),
|
||||
message=payload["detailedMessage"]["markdown"].tame(check_string),
|
||||
title=get_code_pull_request_title(payload),
|
||||
)
|
||||
|
||||
|
||||
def get_code_pull_request_merged_body(payload: WildValue) -> str:
|
||||
return get_pull_request_event_message(
|
||||
user_name=get_code_pull_request_user_name(payload),
|
||||
action="merged",
|
||||
url=get_code_pull_request_url(payload),
|
||||
number=get_code_pull_request_id(payload),
|
||||
target_branch=payload["resource"]["sourceRefName"]
|
||||
.tame(check_string)
|
||||
.replace("refs/heads/", ""),
|
||||
base_branch=payload["resource"]["targetRefName"]
|
||||
.tame(check_string)
|
||||
.replace("refs/heads/", ""),
|
||||
title=get_code_pull_request_title(payload),
|
||||
)
|
||||
|
||||
|
||||
def get_code_pull_request_opened_body(payload: WildValue) -> str:
|
||||
if payload["resource"].get("description"):
|
||||
description = payload["resource"]["description"].tame(check_string)
|
||||
else:
|
||||
description = None
|
||||
return get_pull_request_event_message(
|
||||
user_name=get_code_pull_request_user_name(payload),
|
||||
action="created",
|
||||
url=get_code_pull_request_url(payload),
|
||||
number=get_code_pull_request_id(payload),
|
||||
target_branch=payload["resource"]["sourceRefName"]
|
||||
.tame(check_string)
|
||||
.replace("refs/heads/", ""),
|
||||
base_branch=payload["resource"]["targetRefName"]
|
||||
.tame(check_string)
|
||||
.replace("refs/heads/", ""),
|
||||
message=description,
|
||||
title=get_code_pull_request_title(payload),
|
||||
)
|
||||
|
||||
|
||||
def get_code_push_commits_body(payload: WildValue) -> str:
|
||||
compare_url = "{}/branchCompare?baseVersion=GC{}&targetVersion=GC{}&_a=files".format(
|
||||
get_code_repository_url(payload),
|
||||
payload["resource"]["refUpdates"][0]["oldObjectId"].tame(check_string),
|
||||
payload["resource"]["refUpdates"][0]["newObjectId"].tame(check_string),
|
||||
)
|
||||
commits_data = [
|
||||
{
|
||||
"name": commit["author"]["name"].tame(check_string),
|
||||
"sha": commit["commitId"].tame(check_string),
|
||||
"url": "{}/commit/{}".format(
|
||||
get_code_repository_url(payload), commit["commitId"].tame(check_string)
|
||||
),
|
||||
"message": commit["comment"].tame(check_string),
|
||||
}
|
||||
for commit in payload["resource"].get("commits", [])
|
||||
]
|
||||
return get_push_commits_event_message(
|
||||
get_code_push_user_name(payload),
|
||||
compare_url,
|
||||
get_code_push_branch_name(payload),
|
||||
commits_data,
|
||||
)
|
||||
|
||||
|
||||
def get_code_push_user_name(payload: WildValue) -> str:
|
||||
return payload["resource"]["pushedBy"]["displayName"].tame(check_string)
|
||||
|
||||
|
||||
def get_code_push_branch_name(payload: WildValue) -> str:
|
||||
return (
|
||||
payload["resource"]["refUpdates"][0]["name"].tame(check_string).replace("refs/heads/", "")
|
||||
)
|
||||
|
||||
|
||||
def get_code_repository_name(payload: WildValue) -> str:
|
||||
return payload["resource"]["repository"]["name"].tame(check_string)
|
||||
|
||||
|
||||
def get_code_repository_url(payload: WildValue) -> str:
|
||||
return payload["resource"]["repository"]["remoteUrl"].tame(check_string)
|
||||
|
||||
|
||||
def get_code_pull_request_id(payload: WildValue) -> int:
|
||||
return payload["resource"]["pullRequestId"].tame(check_int)
|
||||
|
||||
|
||||
def get_code_pull_request_title(payload: WildValue) -> str:
|
||||
return payload["resource"]["title"].tame(check_string)
|
||||
|
||||
|
||||
def get_code_pull_request_url(payload: WildValue) -> str:
|
||||
return payload["resource"]["_links"]["web"]["href"].tame(check_string)
|
||||
|
||||
|
||||
def get_code_pull_request_user_name(payload: WildValue) -> str:
|
||||
return payload["resource"]["createdBy"]["displayName"].tame(check_string)
|
||||
|
||||
|
||||
def get_topic_based_on_event(payload: WildValue, event: str) -> str:
|
||||
if event == "git.push":
|
||||
return TOPIC_WITH_BRANCH_TEMPLATE.format(
|
||||
repo=get_code_repository_name(payload), branch=get_code_push_branch_name(payload)
|
||||
)
|
||||
elif "pullrequest" in event:
|
||||
return TOPIC_WITH_PR_OR_ISSUE_INFO_TEMPLATE.format(
|
||||
repo=get_code_repository_name(payload),
|
||||
type="PR",
|
||||
id=get_code_pull_request_id(payload),
|
||||
title=get_code_pull_request_title(payload),
|
||||
)
|
||||
return get_code_repository_name(payload) # nocoverage
|
||||
|
||||
|
||||
def get_event_name(payload: WildValue, branches: str | None) -> str | None:
|
||||
event_name = payload["eventType"].tame(check_string)
|
||||
if event_name == "git.push" and branches is not None:
|
||||
branch = get_code_push_branch_name(payload)
|
||||
if not is_branch_name_notifiable(branch, branches):
|
||||
return None
|
||||
if event_name == "git.pullrequest.merged":
|
||||
status = payload["resource"]["status"].tame(check_string)
|
||||
merge_status = payload["resource"]["mergeStatus"].tame(check_string)
|
||||
# azure devops sends webhook messages when a merge is attempted, i.e. there is a merge conflict
|
||||
# after a PR is created, or when there is no conflict when PR is updated
|
||||
# we're only interested in the case when the PR is merged successfully
|
||||
if status != "completed" or merge_status != "succeeded":
|
||||
return None
|
||||
if event_name in EVENT_FUNCTION_MAPPER:
|
||||
return event_name
|
||||
raise UnsupportedWebhookEventTypeError(event_name)
|
||||
|
||||
|
||||
EVENT_FUNCTION_MAPPER: dict[str, Callable[[WildValue], str]] = {
|
||||
"git.push": get_code_push_commits_body,
|
||||
"git.pullrequest.created": get_code_pull_request_opened_body,
|
||||
"git.pullrequest.merged": get_code_pull_request_merged_body,
|
||||
"git.pullrequest.updated": get_code_pull_request_updated_body,
|
||||
}
|
||||
|
||||
ALL_EVENT_TYPES = list(EVENT_FUNCTION_MAPPER.keys())
|
||||
|
||||
|
||||
@webhook_view("AzureDevOps", all_event_types=ALL_EVENT_TYPES)
|
||||
@typed_endpoint
|
||||
def api_azuredevops_webhook(
|
||||
request: HttpRequest,
|
||||
user_profile: UserProfile,
|
||||
*,
|
||||
payload: JsonBodyPayload[WildValue],
|
||||
branches: str | None = None,
|
||||
) -> HttpResponse:
|
||||
event = get_event_name(payload, branches)
|
||||
if event is None:
|
||||
return json_success(request)
|
||||
|
||||
topic_name = get_topic_based_on_event(payload, event)
|
||||
|
||||
body_function = EVENT_FUNCTION_MAPPER[event]
|
||||
body = body_function(payload)
|
||||
|
||||
check_send_webhook_message(request, user_profile, topic_name, body)
|
||||
return json_success(request)
|
||||
0
zerver/webhooks/basecamp/__init__.py
Normal file
0
zerver/webhooks/basecamp/__init__.py
Normal file
30
zerver/webhooks/basecamp/doc.md
Normal file
30
zerver/webhooks/basecamp/doc.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Zulip Basecamp integration
|
||||
|
||||
Receive notifications about Basecamp events in Zulip!
|
||||
|
||||
{start_tabs}
|
||||
|
||||
1. {!create-an-incoming-webhook.md!}
|
||||
|
||||
1. {!generate-webhook-url-basic.md!}
|
||||
|
||||
1. Go to your project on Basecamp, and toggle the **Settings** menu in
|
||||
the top right corner. Click on **Set up webhooks**, and then select
|
||||
**Add a new webhook**.
|
||||
|
||||
1. Set **Payload URL** to the URL generated above. Select the
|
||||
[events](#filtering-incoming-events) you'd like to be notified about,
|
||||
and toggle the checkbox under **Enable this webhook**. Finally, click
|
||||
**Add this webhook**.
|
||||
|
||||
{end_tabs}
|
||||
|
||||
{!congrats.md!}
|
||||
|
||||

|
||||
|
||||
{!event-filtering-additional-feature.md!}
|
||||
|
||||
### Related documentation
|
||||
|
||||
{!webhooks-url-specification.md!}
|
||||
69
zerver/webhooks/basecamp/fixtures/comment_created.json
Normal file
69
zerver/webhooks/basecamp/fixtures/comment_created.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 657037928,
|
||||
"kind": "comment_created",
|
||||
"details": {
|
||||
"notified_recipient_ids": []
|
||||
},
|
||||
"created_at": "2017-03-13T08:31:54.661+01:00",
|
||||
"recording": {
|
||||
"id": 427058780,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:31:54.647+01:00",
|
||||
"updated_at": "2017-03-13T08:31:54.647+01:00",
|
||||
"type": "Comment",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/comments/427058780.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todos/427055624#__recording_427058780",
|
||||
"parent": {
|
||||
"id": 427055624,
|
||||
"title": "New task",
|
||||
"type": "Todo",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todos/427055624.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todos/427055624"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Re: New task",
|
||||
"content": "\u003cdiv\u003eComment\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
70
zerver/webhooks/basecamp/fixtures/doc_active.json
Normal file
70
zerver/webhooks/basecamp/fixtures/doc_active.json
Normal file
@@ -0,0 +1,70 @@
|
||||
{
|
||||
"id": 664749146,
|
||||
"kind": "document_active",
|
||||
"details": {
|
||||
"status_was": "drafted",
|
||||
"notified_recipient_ids": []
|
||||
},
|
||||
"created_at": "2017-03-16T07:39:52.731+01:00",
|
||||
"recording": {
|
||||
"id": 432522214,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:39:52.725+01:00",
|
||||
"updated_at": "2017-03-16T07:39:52.727+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/432522214.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/432522214",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Event Planning - Annual Conference",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Sponsorship Package Outline",
|
||||
"content": "\u003cdiv\u003eabc\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/doc_archived.json
Normal file
69
zerver/webhooks/basecamp/fixtures/doc_archived.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 667389851,
|
||||
"kind": "document_archived",
|
||||
"details": {
|
||||
"status_was": "active"
|
||||
},
|
||||
"created_at": "2017-03-17T07:51:26.948+01:00",
|
||||
"recording": {
|
||||
"id": 434455988,
|
||||
"status": "archived",
|
||||
"created_at": "2017-03-17T07:49:41.480+01:00",
|
||||
"updated_at": "2017-03-17T07:51:26.944+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/434455988.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/434455988",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "new doc",
|
||||
"content": "\u003cdiv\u003econtent\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/doc_content_changed.json
Normal file
67
zerver/webhooks/basecamp/fixtures/doc_content_changed.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 664750610,
|
||||
"kind": "document_content_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-16T07:41:19.273+01:00",
|
||||
"recording": {
|
||||
"id": 432522214,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:39:52.725+01:00",
|
||||
"updated_at": "2017-03-16T07:41:19.266+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/432522214.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/432522214",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "New doc edit",
|
||||
"content": "\u003cdiv\u003eabc new\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/doc_created.json
Normal file
69
zerver/webhooks/basecamp/fixtures/doc_created.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 667388601,
|
||||
"kind": "document_created",
|
||||
"details": {
|
||||
"notified_recipient_ids": []
|
||||
},
|
||||
"created_at": "2017-03-17T07:49:41.495+01:00",
|
||||
"recording": {
|
||||
"id": 434455988,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-17T07:49:41.480+01:00",
|
||||
"updated_at": "2017-03-17T07:49:41.486+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/434455988.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/434455988",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "new doc",
|
||||
"content": "\u003cdiv\u003econtent\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/doc_publicized.json
Normal file
67
zerver/webhooks/basecamp/fixtures/doc_publicized.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 667390593,
|
||||
"kind": "document_publicized",
|
||||
"details": {},
|
||||
"created_at": "2017-03-17T07:52:24.586+01:00",
|
||||
"recording": {
|
||||
"id": 434455988,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-17T07:49:41.480+01:00",
|
||||
"updated_at": "2017-03-17T07:52:24.560+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/434455988.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/434455988",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "new doc",
|
||||
"content": "\u003cdiv\u003econtent\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/doc_title_changed.json
Normal file
67
zerver/webhooks/basecamp/fixtures/doc_title_changed.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 664750302,
|
||||
"kind": "document_title_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-16T07:40:40.056+01:00",
|
||||
"recording": {
|
||||
"id": 432522214,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:39:52.725+01:00",
|
||||
"updated_at": "2017-03-16T07:40:40.049+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/432522214.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/432522214",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "New doc edit",
|
||||
"content": "\u003cdiv\u003eabc\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/doc_trashed.json
Normal file
69
zerver/webhooks/basecamp/fixtures/doc_trashed.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 667391344,
|
||||
"kind": "document_trashed",
|
||||
"details": {
|
||||
"status_was": "archived"
|
||||
},
|
||||
"created_at": "2017-03-17T07:53:08.753+01:00",
|
||||
"recording": {
|
||||
"id": 434455988,
|
||||
"status": "trashed",
|
||||
"created_at": "2017-03-17T07:49:41.480+01:00",
|
||||
"updated_at": "2017-03-17T07:53:08.750+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/434455988.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/434455988",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "new doc",
|
||||
"content": "\u003cdiv\u003econtent\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/doc_unarchive.json
Normal file
67
zerver/webhooks/basecamp/fixtures/doc_unarchive.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 667390272,
|
||||
"kind": "document_unarchived",
|
||||
"details": {},
|
||||
"created_at": "2017-03-17T07:52:01.726+01:00",
|
||||
"recording": {
|
||||
"id": 434455988,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-17T07:49:41.480+01:00",
|
||||
"updated_at": "2017-03-17T07:52:01.722+01:00",
|
||||
"type": "Document",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/documents/434455988.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/documents/434455988",
|
||||
"parent": {
|
||||
"id": 419211339,
|
||||
"title": "Docs \u0026 Files",
|
||||
"type": "Vault",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/vaults/419211339.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/vaults/419211339"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "new doc",
|
||||
"content": "\u003cdiv\u003econtent\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/message_archived.json
Normal file
69
zerver/webhooks/basecamp/fixtures/message_archived.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 662187149,
|
||||
"kind": "message_archived",
|
||||
"details": {
|
||||
"status_was": "active"
|
||||
},
|
||||
"created_at": "2017-03-15T06:35:09.047+01:00",
|
||||
"recording": {
|
||||
"id": 430680605,
|
||||
"status": "archived",
|
||||
"created_at": "2017-03-15T06:32:23.357+01:00",
|
||||
"updated_at": "2017-03-15T06:35:09.042+01:00",
|
||||
"type": "Message",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/messages/430680605.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/messages/430680605",
|
||||
"parent": {
|
||||
"id": 419211298,
|
||||
"title": "Message Board",
|
||||
"type": "Message::Board",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/message_boards/419211298.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/message_boards/419211298"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Message Title new",
|
||||
"content": "\u003cdiv\u003emessage content new\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 662185533,
|
||||
"kind": "message_content_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-15T06:33:46.917+01:00",
|
||||
"recording": {
|
||||
"id": 430680605,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-15T06:32:23.357+01:00",
|
||||
"updated_at": "2017-03-15T06:33:46.905+01:00",
|
||||
"type": "Message",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/messages/430680605.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/messages/430680605",
|
||||
"parent": {
|
||||
"id": 419211298,
|
||||
"title": "Message Board",
|
||||
"type": "Message::Board",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/message_boards/419211298.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/message_boards/419211298"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Message Title new",
|
||||
"content": "\u003cdiv\u003emessage content new\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/message_created.json
Normal file
69
zerver/webhooks/basecamp/fixtures/message_created.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 662184942,
|
||||
"kind": "message_created",
|
||||
"details": {
|
||||
"notified_recipient_ids": []
|
||||
},
|
||||
"created_at": "2017-03-15T06:32:23.372+01:00",
|
||||
"recording": {
|
||||
"id": 430680605,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-15T06:32:23.357+01:00",
|
||||
"updated_at": "2017-03-15T06:32:23.363+01:00",
|
||||
"type": "Message",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/messages/430680605.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/messages/430680605",
|
||||
"parent": {
|
||||
"id": 419211298,
|
||||
"title": "Message Board",
|
||||
"type": "Message::Board",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/message_boards/419211298.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/message_boards/419211298"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Message Title",
|
||||
"content": "\u003cdiv\u003emessage content\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/message_title_changed.json
Normal file
67
zerver/webhooks/basecamp/fixtures/message_title_changed.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 662185532,
|
||||
"kind": "message_subject_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-15T06:33:46.912+01:00",
|
||||
"recording": {
|
||||
"id": 430680605,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-15T06:32:23.357+01:00",
|
||||
"updated_at": "2017-03-15T06:33:46.905+01:00",
|
||||
"type": "Message",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/messages/430680605.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/messages/430680605",
|
||||
"parent": {
|
||||
"id": 419211298,
|
||||
"title": "Message Board",
|
||||
"type": "Message::Board",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/message_boards/419211298.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/message_boards/419211298"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Message Title new",
|
||||
"content": "\u003cdiv\u003emessage content new\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/message_trashed.json
Normal file
69
zerver/webhooks/basecamp/fixtures/message_trashed.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 662192755,
|
||||
"kind": "message_trashed",
|
||||
"details": {
|
||||
"status_was": "active"
|
||||
},
|
||||
"created_at": "2017-03-15T06:43:24.578+01:00",
|
||||
"recording": {
|
||||
"id": 430680605,
|
||||
"status": "trashed",
|
||||
"created_at": "2017-03-15T06:32:23.357+01:00",
|
||||
"updated_at": "2017-03-15T06:43:24.574+01:00",
|
||||
"type": "Message",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/messages/430680605.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/messages/430680605",
|
||||
"parent": {
|
||||
"id": 419211298,
|
||||
"title": "Message Board",
|
||||
"type": "Message::Board",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/message_boards/419211298.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/message_boards/419211298"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Message Title new",
|
||||
"content": "\u003cdiv\u003emessage content new\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/message_unarchived.json
Normal file
67
zerver/webhooks/basecamp/fixtures/message_unarchived.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 662187655,
|
||||
"kind": "message_unarchived",
|
||||
"details": {},
|
||||
"created_at": "2017-03-15T06:35:36.450+01:00",
|
||||
"recording": {
|
||||
"id": 430680605,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-15T06:32:23.357+01:00",
|
||||
"updated_at": "2017-03-15T06:35:36.445+01:00",
|
||||
"type": "Message",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/messages/430680605.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/messages/430680605",
|
||||
"parent": {
|
||||
"id": 419211298,
|
||||
"title": "Message Board",
|
||||
"type": "Message::Board",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/message_boards/419211298.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/message_boards/419211298"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Message Title new",
|
||||
"content": "\u003cdiv\u003emessage content new\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/question_archived.json
Normal file
69
zerver/webhooks/basecamp/fixtures/question_archived.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 664770869,
|
||||
"kind": "question_archived",
|
||||
"details": {
|
||||
"status_was": "active"
|
||||
},
|
||||
"created_at": "2017-03-16T08:10:06.297+01:00",
|
||||
"recording": {
|
||||
"id": 432527747,
|
||||
"status": "archived",
|
||||
"created_at": "2017-03-16T07:50:33.085+01:00",
|
||||
"updated_at": "2017-03-16T08:10:06.293+01:00",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747",
|
||||
"parent": {
|
||||
"id": 419211313,
|
||||
"title": "Automatic Check-ins",
|
||||
"type": "Questionnaire",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questionnaires/419211313.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questionnaires/419211313"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Question",
|
||||
"content": null
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/question_created.json
Normal file
67
zerver/webhooks/basecamp/fixtures/question_created.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 664755986,
|
||||
"kind": "question_created",
|
||||
"details": {},
|
||||
"created_at": "2017-03-16T07:50:33.111+01:00",
|
||||
"recording": {
|
||||
"id": 432527747,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:50:33.085+01:00",
|
||||
"updated_at": "2017-03-16T07:50:33.104+01:00",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747",
|
||||
"parent": {
|
||||
"id": 419211313,
|
||||
"title": "Automatic Check-ins",
|
||||
"type": "Questionnaire",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questionnaires/419211313.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questionnaires/419211313"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Question",
|
||||
"content": null
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/question_trashed.json
Normal file
69
zerver/webhooks/basecamp/fixtures/question_trashed.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 664774403,
|
||||
"kind": "question_trashed",
|
||||
"details": {
|
||||
"status_was": "active"
|
||||
},
|
||||
"created_at": "2017-03-16T08:15:36.234+01:00",
|
||||
"recording": {
|
||||
"id": 432527747,
|
||||
"status": "trashed",
|
||||
"created_at": "2017-03-16T07:50:33.085+01:00",
|
||||
"updated_at": "2017-03-16T08:15:36.230+01:00",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747",
|
||||
"parent": {
|
||||
"id": 419211313,
|
||||
"title": "Automatic Check-ins",
|
||||
"type": "Questionnaire",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questionnaires/419211313.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questionnaires/419211313"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Question",
|
||||
"content": null
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
69
zerver/webhooks/basecamp/fixtures/question_unarchived.json
Normal file
69
zerver/webhooks/basecamp/fixtures/question_unarchived.json
Normal file
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 664770869,
|
||||
"kind": "question_unarchived",
|
||||
"details": {
|
||||
"status_was": "archived"
|
||||
},
|
||||
"created_at": "2017-03-16T08:10:06.297+01:00",
|
||||
"recording": {
|
||||
"id": 432527747,
|
||||
"status": "archived",
|
||||
"created_at": "2017-03-16T07:50:33.085+01:00",
|
||||
"updated_at": "2017-03-16T08:10:06.293+01:00",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747",
|
||||
"parent": {
|
||||
"id": 419211313,
|
||||
"title": "Automatic Check-ins",
|
||||
"type": "Questionnaire",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questionnaires/419211313.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questionnaires/419211313"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Question",
|
||||
"content": null
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 664771987,
|
||||
"kind": "question_answer_archived",
|
||||
"details": {},
|
||||
"created_at": "2017-03-16T08:12:12.335+01:00",
|
||||
"recording": {
|
||||
"id": 432529636,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:54:28.393+01:00",
|
||||
"updated_at": "2017-03-16T08:12:12.331+01:00",
|
||||
"type": "Question::Answer",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/question_answers/432529636.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747/answers/2017-03-16#__recording_432529636",
|
||||
"parent": {
|
||||
"id": 432527747,
|
||||
"title": "Question?",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Answer to “Question”",
|
||||
"content": "\u003cdiv\u003eAnswer edited\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 664758729,
|
||||
"kind": "question_answer_content_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-16T07:55:02.936+01:00",
|
||||
"recording": {
|
||||
"id": 432529636,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:54:28.393+01:00",
|
||||
"updated_at": "2017-03-16T07:55:02.926+01:00",
|
||||
"type": "Question::Answer",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/question_answers/432529636.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747/answers/2017-03-16#__recording_432529636",
|
||||
"parent": {
|
||||
"id": 432527747,
|
||||
"title": "Question",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Answer to “Question”",
|
||||
"content": "\u003cdiv\u003eAnswer edited\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 664758443,
|
||||
"kind": "question_answer_created",
|
||||
"details": {
|
||||
"notified_recipient_ids": []
|
||||
},
|
||||
"created_at": "2017-03-16T07:54:28.416+01:00",
|
||||
"recording": {
|
||||
"id": 432529636,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:54:28.393+01:00",
|
||||
"updated_at": "2017-03-16T07:54:28.399+01:00",
|
||||
"type": "Question::Answer",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/question_answers/432529636.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747/answers/2017-03-16#__recording_432529636",
|
||||
"parent": {
|
||||
"id": 432527747,
|
||||
"title": "Question",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Answer to “Question”",
|
||||
"content": "\u003cdiv\u003eAnswer\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
{
|
||||
"id": 664774404,
|
||||
"kind": "question_answer_trashed",
|
||||
"details": {
|
||||
"status_was": "active"
|
||||
},
|
||||
"created_at": "2017-03-16T08:15:36.288+01:00",
|
||||
"recording": {
|
||||
"id": 432529636,
|
||||
"status": "trashed",
|
||||
"created_at": "2017-03-16T07:54:28.393+01:00",
|
||||
"updated_at": "2017-03-16T08:15:36.282+01:00",
|
||||
"type": "Question::Answer",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/question_answers/432529636.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/question_answers/432529636",
|
||||
"parent": {
|
||||
"id": 432527747,
|
||||
"title": "Question",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Answer to “Question”",
|
||||
"content": "\u003cdiv\u003eAnswer edited\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 664771987,
|
||||
"kind": "question_answer_unarchived",
|
||||
"details": {},
|
||||
"created_at": "2017-03-16T08:12:12.335+01:00",
|
||||
"recording": {
|
||||
"id": 432529636,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-16T07:54:28.393+01:00",
|
||||
"updated_at": "2017-03-16T08:12:12.331+01:00",
|
||||
"type": "Question::Answer",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/question_answers/432529636.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747/answers/2017-03-16#__recording_432529636",
|
||||
"parent": {
|
||||
"id": 432527747,
|
||||
"title": "Question",
|
||||
"type": "Question",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/questions/432527747.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/questions/432527747"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "Answer to “Question”",
|
||||
"content": "\u003cdiv\u003eAnswer edited\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
{
|
||||
"id": 657033623,
|
||||
"kind": "todo_assignment_changed",
|
||||
"details": {
|
||||
"added_person_ids": [
|
||||
10695738
|
||||
],
|
||||
"removed_person_ids": []
|
||||
},
|
||||
"created_at": "2017-03-13T08:25:28.451+01:00",
|
||||
"recording": {
|
||||
"id": 427055624,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:25:28.380+01:00",
|
||||
"updated_at": "2017-03-13T08:25:28.458+01:00",
|
||||
"type": "Todo",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todos/427055624.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todos/427055624",
|
||||
"parent": {
|
||||
"id": 427050190,
|
||||
"title": "NEW Name TO DO LIST ",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "New task",
|
||||
"content": "New task"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/todo_completed.json
Normal file
67
zerver/webhooks/basecamp/fixtures/todo_completed.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 657034069,
|
||||
"kind": "todo_completed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-13T08:26:25.057+01:00",
|
||||
"recording": {
|
||||
"id": 427055624,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:25:28.380+01:00",
|
||||
"updated_at": "2017-03-13T08:26:25.046+01:00",
|
||||
"type": "Todo",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todos/427055624.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todos/427055624",
|
||||
"parent": {
|
||||
"id": 427050190,
|
||||
"title": "NEW Name TO DO LIST ",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "New task",
|
||||
"content": "New task"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/todo_created.json
Normal file
67
zerver/webhooks/basecamp/fixtures/todo_created.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 657033622,
|
||||
"kind": "todo_created",
|
||||
"details": {},
|
||||
"created_at": "2017-03-13T08:25:28.399+01:00",
|
||||
"recording": {
|
||||
"id": 427055624,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:25:28.380+01:00",
|
||||
"updated_at": "2017-03-13T08:25:28.386+01:00",
|
||||
"type": "Todo",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todos/427055624.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todos/427055624",
|
||||
"parent": {
|
||||
"id": 427050190,
|
||||
"title": "NEW Name TO DO LIST ",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "New task",
|
||||
"content": "New task"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/todo_due_on_changed.json
Normal file
67
zerver/webhooks/basecamp/fixtures/todo_due_on_changed.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 657034435,
|
||||
"kind": "todo_due_on_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-13T08:27:14.412+01:00",
|
||||
"recording": {
|
||||
"id": 427055624,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:25:28.380+01:00",
|
||||
"updated_at": "2017-03-13T08:27:14.406+01:00",
|
||||
"type": "Todo",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todos/427055624.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todos/427055624",
|
||||
"parent": {
|
||||
"id": 427050190,
|
||||
"title": "NEW Name TO DO LIST ",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "New task",
|
||||
"content": "New task"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/todo_list_created.json
Normal file
67
zerver/webhooks/basecamp/fixtures/todo_list_created.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 657024888,
|
||||
"kind": "todolist_created",
|
||||
"details": {},
|
||||
"created_at": "2017-03-13T08:15:41.930+01:00",
|
||||
"recording": {
|
||||
"id": 427050190,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:15:41.915+01:00",
|
||||
"updated_at": "2017-03-13T08:15:41.921+01:00",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190",
|
||||
"parent": {
|
||||
"id": 419211304,
|
||||
"title": "To-dos",
|
||||
"type": "Todoset",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todosets/419211304.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todosets/419211304"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "NEW TO DO LIST",
|
||||
"content": ""
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 657032933,
|
||||
"kind": "todolist_description_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-13T08:24:23.570+01:00",
|
||||
"recording": {
|
||||
"id": 427050190,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:15:41.915+01:00",
|
||||
"updated_at": "2017-03-13T08:24:23.563+01:00",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190",
|
||||
"parent": {
|
||||
"id": 419211304,
|
||||
"title": "To-dos",
|
||||
"type": "Todoset",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todosets/419211304.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todosets/419211304"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "NEW TO DO LIST",
|
||||
"content": "\u003cdiv\u003eNew description\u003c/div\u003e"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 657032392,
|
||||
"kind": "todolist_name_changed",
|
||||
"details": {},
|
||||
"created_at": "2017-03-13T08:23:21.882+01:00",
|
||||
"recording": {
|
||||
"id": 427050190,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:15:41.915+01:00",
|
||||
"updated_at": "2017-03-13T08:23:21.875+01:00",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190",
|
||||
"parent": {
|
||||
"id": 419211304,
|
||||
"title": "To-dos",
|
||||
"type": "Todoset",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todosets/419211304.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todosets/419211304"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "NEW Name TO DO LIST",
|
||||
"content": ""
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
67
zerver/webhooks/basecamp/fixtures/todo_uncompleted.json
Normal file
67
zerver/webhooks/basecamp/fixtures/todo_uncompleted.json
Normal file
@@ -0,0 +1,67 @@
|
||||
{
|
||||
"id": 657034085,
|
||||
"kind": "todo_uncompleted",
|
||||
"details": {},
|
||||
"created_at": "2017-03-13T08:26:26.812+01:00",
|
||||
"recording": {
|
||||
"id": 427055624,
|
||||
"status": "active",
|
||||
"created_at": "2017-03-13T08:25:28.380+01:00",
|
||||
"updated_at": "2017-03-13T08:26:26.806+01:00",
|
||||
"type": "Todo",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todos/427055624.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todos/427055624",
|
||||
"parent": {
|
||||
"id": 427050190,
|
||||
"title": "NEW Name TO DO LIST ",
|
||||
"type": "Todolist",
|
||||
"url": "https://3.basecampapi.com/3688623/buckets/2957043/todolists/427050190.json",
|
||||
"app_url": "https://3.basecamp.com/3688623/buckets/2957043/todolists/427050190"
|
||||
},
|
||||
"bucket": {
|
||||
"id": 2957043,
|
||||
"name": "Zulip HQ",
|
||||
"type": "Project"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
},
|
||||
"title": "New task",
|
||||
"content": "New task"
|
||||
},
|
||||
"creator": {
|
||||
"id": 10695738,
|
||||
"attachable_sgid": "BAh7CEkiCGdpZAY6BkVUSSIpZ2lkOi8vYmMzL1BlcnNvbi8xMDY5NTczOD9leHBpcmVzX2luBjsAVEkiDHB1cnBvc2UGOwBUSSIPYXR0YWNoYWJsZQY7AFRJIg9leHBpcmVzX2F0BjsAVDA=--eb8f230d022d5e8ab202e2f62a86f767219c1c83",
|
||||
"name": "Tomasz",
|
||||
"email_address": "tomaszkolek0@gmail.com",
|
||||
"personable_type": "User",
|
||||
"title": null,
|
||||
"bio": null,
|
||||
"created_at": "2017-03-07T07:21:08.088+01:00",
|
||||
"updated_at": "2017-03-07T07:21:27.633+01:00",
|
||||
"admin": true,
|
||||
"owner": true,
|
||||
"time_zone": "Europe/Amsterdam",
|
||||
"avatar_url": "https://3.basecamp-static.com/3688623/people/BAhpAzo0ow==--9f2bd7e6c043c8b45d6afb82efc1a897fbbee92c/avatar-64-x4",
|
||||
"company": {
|
||||
"id": 796227,
|
||||
"name": "Zulip"
|
||||
}
|
||||
}
|
||||
}
|
||||
48
zerver/webhooks/basecamp/support_event.py
Normal file
48
zerver/webhooks/basecamp/support_event.py
Normal file
@@ -0,0 +1,48 @@
|
||||
DOC_SUPPORT_EVENTS = [
|
||||
"document_active",
|
||||
"document_created",
|
||||
"document_archived",
|
||||
"document_unarchived",
|
||||
"document_publicized",
|
||||
"document_title_changed",
|
||||
"document_content_changed",
|
||||
"document_trashed",
|
||||
"document_publicized",
|
||||
]
|
||||
|
||||
QUESTION_SUPPORT_EVENTS = [
|
||||
"question_archived",
|
||||
"question_created",
|
||||
"question_trashed",
|
||||
"question_unarchived",
|
||||
"question_answer_archived",
|
||||
"question_answer_content_changed",
|
||||
"question_answer_created",
|
||||
"question_answer_trashed",
|
||||
"question_answer_unarchived",
|
||||
]
|
||||
|
||||
MESSAGE_SUPPORT_EVENTS = [
|
||||
"message_archived",
|
||||
"message_content_changed",
|
||||
"message_created",
|
||||
"message_subject_changed",
|
||||
"message_trashed",
|
||||
"message_unarchived",
|
||||
"comment_created",
|
||||
]
|
||||
|
||||
TODOS_SUPPORT_EVENTS = [
|
||||
"todolist_created",
|
||||
"todolist_description_changed",
|
||||
"todolist_name_changed",
|
||||
"todo_assignment_changed",
|
||||
"todo_completed",
|
||||
"todo_uncompleted",
|
||||
"todo_created",
|
||||
"todo_due_on_changed",
|
||||
]
|
||||
|
||||
SUPPORT_EVENTS = (
|
||||
DOC_SUPPORT_EVENTS + QUESTION_SUPPORT_EVENTS + MESSAGE_SUPPORT_EVENTS + TODOS_SUPPORT_EVENTS
|
||||
)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user