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

This commit is contained in:
upstream-mirror
2026-09-15 15:05:30 +05:00
commit 64898b2c79
8999 changed files with 1757358 additions and 0 deletions

View File

View File

View 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!}
![](/static/images/integrations/airbrake/001.png)
### Related documentation
{!webhooks-url-specification.md!}

View 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"
}

View 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)

View 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)

View File

View 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!}
![](/static/images/integrations/airbyte/001.png)
### Related documentation
{!webhooks-url-specification.md!}

View File

@@ -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
}
}

View File

@@ -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
}
}

View File

@@ -0,0 +1,3 @@
{
"text": "Hello World! This is a test from Airbyte to try slack notification settings for sync failures."
}

View File

@@ -0,0 +1,4 @@
{
"text": "Hello World! This is a test from Airbyte to try slack notification settings for sync successes."
}

View 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",
)

View 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)

View File

View 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!}
![](/static/images/integrations/alertmanager/001.png)
### 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!}

View 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"
}
]
}

View 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"
}
]
}

View File

@@ -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"
}
]
}

View 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",
)

View 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)

View File

View 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!}
![](/static/images/integrations/ansibletower/001.png)
### Related documentation
{!webhooks-url-specification.md!}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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
}
}
}

View 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"
}

View File

@@ -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"
}

View 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"
}

View File

@@ -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"
}

View File

@@ -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
}

View File

@@ -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
}

View 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
}

View File

@@ -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
}

View 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)

View 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

View File

View 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!}
![](/static/images/integrations/appfollow/001.png)
### Related documentation
{!webhooks-url-specification.md!}

View 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)"
}

View File

@@ -0,0 +1,3 @@
{
"text":"Webhook integration was successful.\nTest User \/ Acme (Google Play)"
}

View 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~~")

View 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

View File

View 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!}
![](/static/images/integrations/appveyor/001.png)
### Related documentation
{!webhooks-url-specification.md!}

View File

@@ -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"
}
]
}
]
}
}

View File

@@ -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"
}
]
}
]
}
}

View 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)

View 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)

View File

View 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!}
![](/static/images/integrations/azuredevops/001.png)
{!event-filtering-additional-feature.md!}
### Related documentation
{!webhooks-url-specification.md!}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View 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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View File

@@ -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"
}

View 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)

View 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)

View File

View 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!}
![](/static/images/integrations/basecamp/001.png)
{!event-filtering-additional-feature.md!}
### Related documentation
{!webhooks-url-specification.md!}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View File

@@ -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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View File

@@ -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"
}
}
}

View File

@@ -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"
}
}
}

View File

@@ -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"
}
}
}

View File

@@ -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"
}
}
}

View File

@@ -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"
}
}
}

View File

@@ -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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View 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"
}
}
}

View File

@@ -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"
}
}
}

View File

@@ -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"
}
}
}

View 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"
}
}
}

View 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