diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 525c94f..621fd4b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,12 +1,14 @@ name: CI on: push: - branches-ignore: - - 'generated' - - 'codegen/**' - - 'integrated/**' - - 'stl-preview-head/**' - - 'stl-preview-base/**' + branches: + - '**' + - '!integrated/**' + - '!stl-preview-head/**' + - '!stl-preview-base/**' + - '!generated' + - '!codegen/**' + - 'codegen/stl/**' pull_request: branches-ignore: - 'stl-preview-head/**' diff --git a/.gitignore b/.gitignore index eb81fc6..f395f7b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ .prism.log +.stdy.log .venv temp/ regress/ diff --git a/.release-please-manifest.json b/.release-please-manifest.json index 3d2ac0b..8e76abb 100644 --- a/.release-please-manifest.json +++ b/.release-please-manifest.json @@ -1,3 +1,3 @@ { - ".": "0.1.0" + ".": "5.0.0" } \ No newline at end of file diff --git a/.stats.yml b/.stats.yml index 2b39be6..2dd3fee 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 23 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-5a8ac7b545c48dc892e5c680303e305254921554dabee848e40a808659dbcf1e.yml -openapi_spec_hash: 0103975601aac1445d3a4ef418c5d17a -config_hash: ca148af6be59ec54295b2c5f852a38d1 +configured_endpoints: 30 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-c08c14bb754b4cb0e02b21fabb680469368286be339dec0aaa8c69d04a1f021a.yml +openapi_spec_hash: a10246aaf7cdc33b682fc245bd5f893b +config_hash: 72f9d43b9b51a5da912e9f3730e53ae2 diff --git a/CHANGELOG.md b/CHANGELOG.md index f7634d8..9869e63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,45 @@ # Changelog +## 5.0.0 (2026-05-07) + +Full Changelog: [v0.1.0...v5.0.0](https://github.com/beeper/desktop-api-sql/compare/v0.1.0...v5.0.0) + +### Features + +* **api:** add network, bridge fields to accounts ([41e2829](https://github.com/beeper/desktop-api-sql/commit/41e28294a7fcad3839ea2d3c5c3b48061774776f)) +* **api:** api update ([21cafde](https://github.com/beeper/desktop-api-sql/commit/21cafde63f92786cb87ff52ed169ab3590dfae1b)) +* **api:** api update ([673f0a1](https://github.com/beeper/desktop-api-sql/commit/673f0a1de2c331b41c8093c7bf7edcd908b3bcb0)) +* support setting headers via env ([d1ebc75](https://github.com/beeper/desktop-api-sql/commit/d1ebc75c6cdaf3421824fc57f4ec85cba613c944)) + + +### Chores + +* **internal:** codegen related update ([43a6ea9](https://github.com/beeper/desktop-api-sql/commit/43a6ea972203ffff707a1e9be275ec61fca3ccd2)) +* **internal:** codegen related update ([836fc21](https://github.com/beeper/desktop-api-sql/commit/836fc2121e4d8bdc5116b39acac969c20a4af775)) +* **internal:** codegen related update ([91994fa](https://github.com/beeper/desktop-api-sql/commit/91994fa8b9e406c674d5245f2da123608e87046b)) +* **internal:** support env vars in `./scripts/repl` ([9183ad1](https://github.com/beeper/desktop-api-sql/commit/9183ad1d77206204a8650471616d1f97b817f024)) +* **internal:** tweak CI branches ([2db5518](https://github.com/beeper/desktop-api-sql/commit/2db5518d6ac525ccd1d753e271f6adcde42398bf)) +* **internal:** update gitignore ([998e1de](https://github.com/beeper/desktop-api-sql/commit/998e1de2a033f9cb44326e681eadc5cbd25d862b)) +* **internal:** update multipart form array serialization ([0af81d8](https://github.com/beeper/desktop-api-sql/commit/0af81d8b40c42ae06bac4d2ee9d9bcf5fb887641)) +* **tests:** bump steady to v0.19.4 ([fe76f5e](https://github.com/beeper/desktop-api-sql/commit/fe76f5e4d60950521215581557cd0453720d7a71)) +* **tests:** bump steady to v0.19.5 ([71cbd2c](https://github.com/beeper/desktop-api-sql/commit/71cbd2c8566c6c466557c8ee7209f6710687cf1a)) +* **tests:** bump steady to v0.19.6 ([827b6a2](https://github.com/beeper/desktop-api-sql/commit/827b6a2c9d2f7db42f469a86f207318e1441a46a)) +* **tests:** bump steady to v0.19.7 ([be70621](https://github.com/beeper/desktop-api-sql/commit/be70621335ade7130eedb59982ff75f36c3ce75a)) +* **tests:** bump steady to v0.20.1 ([1c13343](https://github.com/beeper/desktop-api-sql/commit/1c1334345f7df0ab235018431f6f64026db45332)) +* **tests:** bump steady to v0.20.2 ([60ca024](https://github.com/beeper/desktop-api-sql/commit/60ca0242076c462be6e9da54a39b1138a56b9732)) +* **tests:** bump steady to v0.22.1 ([ad561c9](https://github.com/beeper/desktop-api-sql/commit/ad561c97cdcae8a56ac67bd285e4a4c74f34ac09)) +* update SDK settings ([71dc986](https://github.com/beeper/desktop-api-sql/commit/71dc9866112525943eb11a430cf2505236cc3f46)) + + +### Documentation + +* explain caching ([d84f8a5](https://github.com/beeper/desktop-api-sql/commit/d84f8a50545721a86b7ea48a8af34bd588961c54)) + + +### Refactors + +* **tests:** switch from prism to steady ([ca3c264](https://github.com/beeper/desktop-api-sql/commit/ca3c264cee5d12947269f7fc6f919eb8db071c9b)) + ## 0.1.0 (2026-03-13) Full Changelog: [v0.0.1...v0.1.0](https://github.com/beeper/desktop-api-sql/compare/v0.0.1...v0.1.0) diff --git a/META.json b/META.json index ba92e1b..9311557 100644 --- a/META.json +++ b/META.json @@ -10,7 +10,6 @@ "version": "0.0.1", "release_status": "testing", "maintainer": "Beeper Desktop ", - "generated_by": "Stainless (https://stainless.com)", "license": "mit", "resources": { "homepage": "https://developers.beeper.com/desktop-api/", diff --git a/README.md b/README.md index 0544b3f..e16c3c0 100644 --- a/README.md +++ b/README.md @@ -10,8 +10,6 @@ The Beeper Desktop API PostgreSQL Extension provides convenient access to the [Beeper Desktop REST API](https://developers.beeper.com/desktop-api/) from PostgreSQL. -It is generated with [Stainless](https://www.stainless.com/). - The REST API documentation can be found on [developers.beeper.com](https://developers.beeper.com/desktop-api/). ## Installation @@ -61,7 +59,12 @@ This extension requires: ```sql SELECT * FROM beeper_desktop_api_chats.search( - include_muted := TRUE, "limit" := 3, type := 'single' + account_ids := ARRAY[ + 'matrix', 'discordgo', 'local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc' + ], + include_muted := TRUE, + "limit" := 3, + type := 'single' ); ``` @@ -70,34 +73,46 @@ FROM beeper_desktop_api_chats.search( Configure the client by setting configuration parameters at the database level: ```sql -ALTER DATABASE my_database SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +ALTER DATABASE my_database SET beeper_desktop_api.access_token = 'My Access Token'; ``` > [!NOTE] > > `ALTER DATABASE` persistently alters the database, but doesn't take effect until the next session. To -> ephemerally modify the current session, use `SET beeper_desktop_api.beeper_access_token TO 'My Access Token';`. +> ephemerally modify the current session, use `SET beeper_desktop_api.access_token TO 'My Access Token';`. See this table for the available configuration parameters: -| Parameter | Required | Default value | -| ---------------------------------------- | -------- | -------------------------- | -| `beeper_desktop_api.beeper_access_token` | true | - | -| `beeper_desktop_api.base_url` | false | `'http://localhost:23373'` | +| Parameter | Required | Default value | +| --------------------------------- | -------- | -------------------------- | +| `beeper_desktop_api.access_token` | true | - | +| `beeper_desktop_api.base_url` | false | `'http://localhost:23373'` | ## Requests and responses To send a request to the Beeper Desktop API, call the relevant SQL function with values corresponding to the parameter types and `SELECT` the columns you need from the returned rows. -To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats.create_params_user` may be constructed like so: +To construct [composite type](https://www.postgresql.org/docs/current/rowtypes.html) parameters, use the parameter type's provided `make_*` function. For example, `beeper_desktop_api_chats.update_params_draft` may be constructed like so: ```sql -beeper_desktop_api_chats.make_create_params_user( - id := 'id', - email := 'email', - fullName := 'fullName', - phoneNumber := 'phoneNumber', - username := 'username' +beeper_desktop_api_chats.make_update_params_draft( + text := 'text', + attachments := $$ + { + "foo": { + "uploadID": "uploadID", + "id": "id", + "duration": 0, + "fileName": "fileName", + "mimeType": "mimeType", + "size": { + "height": 0, + "width": 0 + }, + "type": "image" + } + } + $$::JSONB ) ``` @@ -110,9 +125,11 @@ For example, the following query will make the minimum number of requests necess ```sql SELECT * FROM beeper_desktop_api_messages.search( - account_ids := ARRAY['local-telegram_ba_QFrb5lrLPhO3OT5MFBeTWv0x4BI'], + account_ids := ARRAY[ + 'discordgo', 'local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc' + ], "limit" := 10, - query := 'deployment' + query := 'oauth' ) LIMIT 200; ``` @@ -123,6 +140,29 @@ LIMIT 200; > removed, then PostgreSQL may not [push down the condition](https://wiki.postgresql.org/wiki/Inlining_of_SQL_functions), > causing all pages to be requested and buffered. +## Caching + +Sending requests to the Beeper Desktop API for every SQL query can be slow. Combine [materialized views](https://www.postgresql.org/docs/current/rules-materializedviews.html) with [`pg_cron`](https://github.com/citusdata/pg_cron) for scheduled data pulls: + +```sql +CREATE MATERIALIZED VIEW beeper_desktop_api_messages AS +SELECT * +FROM beeper_desktop_api_messages.search( + account_ids := ARRAY[ + 'discordgo', 'local-whatsapp_ba_EvYDBBsZbRQAy3UOSWqG0LuTVkc' + ], + "limit" := 10, + query := 'oauth' +); + +-- Refresh the view every 4 hours. +SELECT cron.schedule( + 'refresh-beeper-desktop-api-messages', + '0 */4 * * *', + 'REFRESH MATERIALIZED VIEW CONCURRENTLY beeper_desktop_api_messages' +); +``` + ## Troubleshooting ### Installation diff --git a/scripts/mock b/scripts/mock index bcf3b39..9c7c439 100755 --- a/scripts/mock +++ b/scripts/mock @@ -19,34 +19,34 @@ fi echo "==> Starting mock server with URL ${URL}" -# Run prism mock on the given spec +# Run steady mock on the given spec if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism --version + npm exec --package=@stdy/cli@0.22.1 -- steady --version - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" &> .prism.log & + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" &> .stdy.log & - # Wait for server to come online (max 30s) + # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" attempts=0 - while ! grep -q "✖ fatal\|Prism is listening" ".prism.log" ; do + while ! curl --silent --fail "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1; do + if ! kill -0 $! 2>/dev/null; then + echo + cat .stdy.log + exit 1 + fi attempts=$((attempts + 1)) if [ "$attempts" -ge 300 ]; then echo - echo "Timed out waiting for Prism server to start" - cat .prism.log + echo "Timed out waiting for Steady server to start" + cat .stdy.log exit 1 fi echo -n "." sleep 0.1 done - if grep -q "✖ fatal" ".prism.log"; then - cat .prism.log - exit 1 - fi - echo else - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" + npm exec --package=@stdy/cli@0.22.1 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets "$URL" fi diff --git a/scripts/repl b/scripts/repl index 21d1eab..30588b5 100755 --- a/scripts/repl +++ b/scripts/repl @@ -1,5 +1,10 @@ #!/usr/bin/env bash +if [ -z "$BEEPER_ACCESS_TOKEN" ]; then + echo 'ERROR: BEEPER_ACCESS_TOKEN environment variable is required but not set' + exit 1 +fi + echo "==> Detecting PostgreSQL Python executable" PYTHON_EXECUTABLE_PATH=$(pg_config --configure | grep -o "PYTHON=[^ ]*" | cut -d= -f2 | tr -d "'") echo "PostgreSQL uses Python $PYTHON_EXECUTABLE_PATH" @@ -29,8 +34,8 @@ if [ "$PG_MAJOR_VERSION" -ge 18 ]; then done POSTGRES_CONFIG=(-c extension_control_path="$(realpath temp/install/share/postgresql)") else - # In PostgreSQL <18 we cannot point `postgres` to our local extensions directory. So we install directly to - # the system. + # In PostgreSQL <18 we cannot point `postgres` to our local extensions directory. So we install + # directly to the system. sudo make install PG_CONFIG="$(command -v pg_config)" fi @@ -61,10 +66,15 @@ done echo "==> Running setup.sql" psql -d postgres -f test/sql/create_extension.sql +psql -d postgres --variable "value='$BEEPER_ACCESS_TOKEN'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.access_token = :value;' +if [ -n "$BEEPER_BASE_URL" ]; then + psql -d postgres --variable "value='$BEEPER_BASE_URL'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.base_url = :value;' +fi + if command -v pgcli &>/dev/null; then echo "==> Starting pgcli REPL" pgcli postgres else echo "==> Starting psql REPL (TIP: Install pgcli for better autocomplete!)" psql -d postgres -fi +fi \ No newline at end of file diff --git a/scripts/test b/scripts/test index 8b23b9c..dc681e7 100755 --- a/scripts/test +++ b/scripts/test @@ -9,8 +9,8 @@ GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # No Color -function prism_is_running() { - curl --silent "http://localhost:4010" >/dev/null 2>&1 +function steady_is_running() { + curl --silent "http://127.0.0.1:4010/_x-steady/health" >/dev/null 2>&1 } kill_server_on_port() { @@ -25,7 +25,7 @@ function is_overriding_api_base_url() { [ -n "$TEST_API_BASE_URL" ] } -if ! is_overriding_api_base_url && ! prism_is_running ; then +if ! is_overriding_api_base_url && ! steady_is_running ; then # When we exit this script, make sure to kill the background mock server process trap 'kill_server_on_port 4010' EXIT @@ -36,19 +36,19 @@ fi if is_overriding_api_base_url ; then echo -e "${GREEN}✔ Running tests against ${TEST_API_BASE_URL}${NC}" echo -elif ! prism_is_running ; then - echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Prism server" +elif ! steady_is_running ; then + echo -e "${RED}ERROR:${NC} The test suite will not run without a mock Steady server" echo -e "running against your OpenAPI spec." echo echo -e "To run the server, pass in the path or url of your OpenAPI" - echo -e "spec to the prism command:" + echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock path/to/your.openapi.yml${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.22.1 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-form-array-format=repeat --validator-query-object-format=brackets --validator-form-object-format=brackets${NC}" echo exit 1 else - echo -e "${GREEN}✔ Mock prism server is running with your OpenAPI spec${NC}" + echo -e "${GREEN}✔ Mock steady server is running with your OpenAPI spec${NC}" echo fi diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index 1e703eb..003866d 100644 --- a/sql/_beeper_desktop_api.sql +++ b/sql/_beeper_desktop_api.sql @@ -72,12 +72,12 @@ AS $$ # This configuration parameter was not set, but it's optional so ignore the exception. pass try: - value = plpy.execute("SELECT current_setting('beeper_desktop_api.beeper_access_token') AS value")[0]['value'] + value = plpy.execute("SELECT current_setting('beeper_desktop_api.access_token') AS value")[0]['value'] client_options["access_token"] = value except Exception: plpy.warning( - "Required DB config parameter 'beeper_desktop_api.beeper_access_token' is not set", - hint="ALTER DATABASE my_database SET beeper_desktop_api.beeper_access_token = ...;" + "Required DB config parameter 'beeper_desktop_api.access_token' is not set", + hint="ALTER DATABASE my_database SET beeper_desktop_api.access_token = ...;" ) def strip_none(value): @@ -107,8 +107,12 @@ CREATE SCHEMA IF NOT EXISTS beeper_desktop_api; CREATE TYPE beeper_desktop_api.attachment AS (); CREATE TYPE beeper_desktop_api.attachment_size AS (); +CREATE TYPE beeper_desktop_api.attachment_transcription AS (); CREATE TYPE beeper_desktop_api.error AS (); CREATE TYPE beeper_desktop_api.message AS (); +CREATE TYPE beeper_desktop_api.message_link AS (); +CREATE TYPE beeper_desktop_api.message_link_img_size AS (); +CREATE TYPE beeper_desktop_api.message_send_status AS (); CREATE TYPE beeper_desktop_api.reaction AS (); CREATE TYPE beeper_desktop_api.user AS (); @@ -122,6 +126,7 @@ CREATE TYPE beeper_desktop_api.client_search_response_result_message AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_accounts; CREATE TYPE beeper_desktop_api_accounts.account AS (); +CREATE TYPE beeper_desktop_api_accounts.account_bridge AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_accounts_contacts; @@ -131,10 +136,66 @@ CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats; CREATE TYPE beeper_desktop_api_chats.chat AS (); CREATE TYPE beeper_desktop_api_chats.chat_participant AS (); +CREATE TYPE beeper_desktop_api_chats.chat_participant_item AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_message_request AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_participant_action AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_state AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_state_avatar AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_state_description AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_state_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_capability_state_title AS (); +CREATE TYPE beeper_desktop_api_chats.chat_draft AS (); +CREATE TYPE beeper_desktop_api_chats.chat_reminder AS (); +CREATE TYPE beeper_desktop_api_chats.chat_snooze AS (); CREATE TYPE beeper_desktop_api_chats.chat_create_response AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_participant AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_participant_item AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_message_request AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_participant_action AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_state AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_state_avatar AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_state_description AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_state_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_capability_state_title AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_draft AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_reminder AS (); +CREATE TYPE beeper_desktop_api_chats.chat_create_response_snooze AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response AS (); CREATE TYPE beeper_desktop_api_chats.chat_list_response_participant AS (); -CREATE TYPE beeper_desktop_api_chats.create_params_user AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_participant_item AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_message_request AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_participant_action AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_state AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_state_avatar AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_state_description AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_state_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_capability_state_title AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_draft AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_reminder AS (); +CREATE TYPE beeper_desktop_api_chats.chat_list_response_snooze AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_participant AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_participant_item AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_message_request AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_participant_action AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_state AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_state_avatar AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_state_description AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_capability_state_title AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_draft AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_reminder AS (); +CREATE TYPE beeper_desktop_api_chats.chat_start_response_snooze AS (); +CREATE TYPE beeper_desktop_api_chats.update_params_draft AS (); +CREATE TYPE beeper_desktop_api_chats.start_params_user AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats_reminders; @@ -148,6 +209,9 @@ CREATE TYPE beeper_desktop_api_chats_messages_reactions.reaction_add_response AS CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_messages; CREATE TYPE beeper_desktop_api_messages.message_update_response AS (); +CREATE TYPE beeper_desktop_api_messages.message_update_response_link AS (); +CREATE TYPE beeper_desktop_api_messages.message_update_response_link_img_size AS (); +CREATE TYPE beeper_desktop_api_messages.message_update_response_send_status AS (); CREATE TYPE beeper_desktop_api_messages.message_send_response AS (); CREATE TYPE beeper_desktop_api_messages.send_params_attachment AS (); CREATE TYPE beeper_desktop_api_messages.send_params_attachment_send_params_size AS (); diff --git a/sql/beeper_desktop_api.sql b/sql/beeper_desktop_api.sql index 8823ed2..0af322b 100644 --- a/sql/beeper_desktop_api.sql +++ b/sql/beeper_desktop_api.sql @@ -10,7 +10,8 @@ ALTER TYPE beeper_desktop_api.attachment ADD ATTRIBUTE mimeType TEXT, ADD ATTRIBUTE posterImg TEXT, ADD ATTRIBUTE size beeper_desktop_api.attachment_size, - ADD ATTRIBUTE srcURL TEXT; + ADD ATTRIBUTE srcURL TEXT, + ADD ATTRIBUTE transcription beeper_desktop_api.attachment_transcription; CREATE OR REPLACE FUNCTION beeper_desktop_api.make_attachment( type TEXT, @@ -24,7 +25,8 @@ CREATE OR REPLACE FUNCTION beeper_desktop_api.make_attachment( mimeType TEXT DEFAULT NULL, posterImg TEXT DEFAULT NULL, size beeper_desktop_api.attachment_size DEFAULT NULL, - srcURL TEXT DEFAULT NULL + srcURL TEXT DEFAULT NULL, + transcription beeper_desktop_api.attachment_transcription DEFAULT NULL ) RETURNS beeper_desktop_api.attachment LANGUAGE SQL @@ -42,7 +44,8 @@ AS $$ mimeType, posterImg, size, - srcURL + srcURL, + transcription )::beeper_desktop_api.attachment; $$; @@ -59,6 +62,23 @@ AS $$ SELECT ROW(height, width)::beeper_desktop_api.attachment_size; $$; +ALTER TYPE beeper_desktop_api.attachment_transcription + ADD ATTRIBUTE engine TEXT, + ADD ATTRIBUTE transcription TEXT, + ADD ATTRIBUTE language TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api.make_attachment_transcription( + engine TEXT, transcription TEXT, language TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api.attachment_transcription +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + engine, transcription, language + )::beeper_desktop_api.attachment_transcription; +$$; + ALTER TYPE beeper_desktop_api.error ADD ATTRIBUTE code TEXT, ADD ATTRIBUTE message TEXT, @@ -82,11 +102,18 @@ ALTER TYPE beeper_desktop_api.message ADD ATTRIBUTE sortKey TEXT, ADD ATTRIBUTE "timestamp" TIMESTAMP, ADD ATTRIBUTE attachments beeper_desktop_api.attachment[], + ADD ATTRIBUTE editedTimestamp TIMESTAMP, + ADD ATTRIBUTE isDeleted BOOLEAN, + ADD ATTRIBUTE isHidden BOOLEAN, ADD ATTRIBUTE isSender BOOLEAN, ADD ATTRIBUTE isUnread BOOLEAN, ADD ATTRIBUTE linkedMessageID TEXT, + ADD ATTRIBUTE links beeper_desktop_api.message_link[], + ADD ATTRIBUTE mentions TEXT[], ADD ATTRIBUTE reactions beeper_desktop_api.reaction[], + ADD ATTRIBUTE seen JSONB, ADD ATTRIBUTE senderName TEXT, + ADD ATTRIBUTE sendStatus beeper_desktop_api.message_send_status, ADD ATTRIBUTE text TEXT, ADD ATTRIBUTE type TEXT; @@ -98,11 +125,18 @@ CREATE OR REPLACE FUNCTION beeper_desktop_api.make_message( sortKey TEXT, "timestamp" TIMESTAMP, attachments beeper_desktop_api.attachment[] DEFAULT NULL, + editedTimestamp TIMESTAMP DEFAULT NULL, + isDeleted BOOLEAN DEFAULT NULL, + isHidden BOOLEAN DEFAULT NULL, isSender BOOLEAN DEFAULT NULL, isUnread BOOLEAN DEFAULT NULL, linkedMessageID TEXT DEFAULT NULL, + links beeper_desktop_api.message_link[] DEFAULT NULL, + mentions TEXT[] DEFAULT NULL, reactions beeper_desktop_api.reaction[] DEFAULT NULL, + seen JSONB DEFAULT NULL, senderName TEXT DEFAULT NULL, + sendStatus beeper_desktop_api.message_send_status DEFAULT NULL, text TEXT DEFAULT NULL, type TEXT DEFAULT NULL ) @@ -118,16 +152,88 @@ AS $$ sortKey, "timestamp", attachments, + editedTimestamp, + isDeleted, + isHidden, isSender, isUnread, linkedMessageID, + links, + mentions, reactions, + seen, senderName, + sendStatus, text, type )::beeper_desktop_api.message; $$; +ALTER TYPE beeper_desktop_api.message_link + ADD ATTRIBUTE title TEXT, + ADD ATTRIBUTE url TEXT, + ADD ATTRIBUTE favicon TEXT, + ADD ATTRIBUTE img TEXT, + ADD ATTRIBUTE imgSize beeper_desktop_api.message_link_img_size, + ADD ATTRIBUTE originalURL TEXT, + ADD ATTRIBUTE summary TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api.make_message_link( + title TEXT, + url TEXT, + favicon TEXT DEFAULT NULL, + img TEXT DEFAULT NULL, + imgSize beeper_desktop_api.message_link_img_size DEFAULT NULL, + originalURL TEXT DEFAULT NULL, + summary TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api.message_link +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + title, url, favicon, img, imgSize, originalURL, summary + )::beeper_desktop_api.message_link; +$$; + +ALTER TYPE beeper_desktop_api.message_link_img_size + ADD ATTRIBUTE height DOUBLE PRECISION, ADD ATTRIBUTE width DOUBLE PRECISION; + +CREATE OR REPLACE FUNCTION beeper_desktop_api.make_message_link_img_size( + height DOUBLE PRECISION DEFAULT NULL, width DOUBLE PRECISION DEFAULT NULL +) +RETURNS beeper_desktop_api.message_link_img_size +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(height, width)::beeper_desktop_api.message_link_img_size; +$$; + +ALTER TYPE beeper_desktop_api.message_send_status + ADD ATTRIBUTE status TEXT, + ADD ATTRIBUTE "timestamp" TIMESTAMP, + ADD ATTRIBUTE deliveredToUsers TEXT[], + ADD ATTRIBUTE internalError TEXT, + ADD ATTRIBUTE message TEXT, + ADD ATTRIBUTE reason TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api.make_message_send_status( + status TEXT, + "timestamp" TIMESTAMP, + deliveredToUsers TEXT[] DEFAULT NULL, + internalError TEXT DEFAULT NULL, + message TEXT DEFAULT NULL, + reason TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api.message_send_status +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + status, "timestamp", deliveredToUsers, internalError, message, reason + )::beeper_desktop_api.message_send_status; +$$; + ALTER TYPE beeper_desktop_api.reaction ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE participantID TEXT, diff --git a/sql/beeper_desktop_api_accounts.sql b/sql/beeper_desktop_api_accounts.sql index 34100ee..5dc05ec 100644 --- a/sql/beeper_desktop_api_accounts.sql +++ b/sql/beeper_desktop_api_accounts.sql @@ -1,14 +1,35 @@ ALTER TYPE beeper_desktop_api_accounts.account - ADD ATTRIBUTE accountID TEXT, ADD ATTRIBUTE "user" beeper_desktop_api.user; + ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE bridge beeper_desktop_api_accounts.account_bridge, + ADD ATTRIBUTE "user" beeper_desktop_api.user, + ADD ATTRIBUTE network TEXT; CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts.make_account( - accountID TEXT, "user" beeper_desktop_api.user + accountID TEXT, + bridge beeper_desktop_api_accounts.account_bridge, + "user" beeper_desktop_api.user, + network TEXT DEFAULT NULL ) RETURNS beeper_desktop_api_accounts.account LANGUAGE SQL IMMUTABLE AS $$ - SELECT ROW(accountID, "user")::beeper_desktop_api_accounts.account; + SELECT ROW( + accountID, bridge, "user", network + )::beeper_desktop_api_accounts.account; +$$; + +ALTER TYPE beeper_desktop_api_accounts.account_bridge + ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE provider TEXT, ADD ATTRIBUTE type TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts.make_account_bridge( + id TEXT, provider TEXT, type TEXT +) +RETURNS beeper_desktop_api_accounts.account_bridge +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(id, provider, type)::beeper_desktop_api_accounts.account_bridge; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts._list() diff --git a/sql/beeper_desktop_api_assets.sql b/sql/beeper_desktop_api_assets.sql index 3e5ed45..8ed4508 100644 --- a/sql/beeper_desktop_api_assets.sql +++ b/sql/beeper_desktop_api_assets.sql @@ -117,23 +117,30 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets._serve(url TEXT) -RETURNS VOID +RETURNS JSONB LANGUAGE plpython3u STABLE AS $$ - GD["__beeper_desktop_api_context__"].client.assets.serve( + response = GD["__beeper_desktop_api_context__"].client.assets.with_raw_response.serve( url=url, ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets.serve(url TEXT) -RETURNS VOID +RETURNS BYTEA LANGUAGE plpgsql STABLE AS $$ BEGIN PERFORM beeper_desktop_api_internal.ensure_context(); - PERFORM beeper_desktop_api_assets._serve(url); + RETURN jsonb_populate_record( + NULL::BYTEA, beeper_desktop_api_assets._serve(url) + ); END; $$; diff --git a/sql/beeper_desktop_api_chats.sql b/sql/beeper_desktop_api_chats.sql index f7e06b8..4a6a8e0 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -1,179 +1,1748 @@ ALTER TYPE beeper_desktop_api_chats.chat ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE network TEXT, ADD ATTRIBUTE participants beeper_desktop_api_chats.chat_participant, ADD ATTRIBUTE title TEXT, ADD ATTRIBUTE type TEXT, ADD ATTRIBUTE unreadCount BIGINT, + ADD ATTRIBUTE capabilities beeper_desktop_api_chats.chat_capability, + ADD ATTRIBUTE description TEXT, + ADD ATTRIBUTE draft beeper_desktop_api_chats.chat_draft, + ADD ATTRIBUTE imgURL TEXT, ADD ATTRIBUTE isArchived BOOLEAN, + ADD ATTRIBUTE isLowPriority BOOLEAN, + ADD ATTRIBUTE isMarkedUnread BOOLEAN, ADD ATTRIBUTE isMuted BOOLEAN, ADD ATTRIBUTE isPinned BOOLEAN, + ADD ATTRIBUTE isReadOnly BOOLEAN, ADD ATTRIBUTE lastActivity TIMESTAMP, ADD ATTRIBUTE lastReadMessageSortKey TEXT, - ADD ATTRIBUTE localChatID TEXT; + ADD ATTRIBUTE localChatID TEXT, + ADD ATTRIBUTE messageExpirySeconds BIGINT, + ADD ATTRIBUTE reminder beeper_desktop_api_chats.chat_reminder, + ADD ATTRIBUTE snooze beeper_desktop_api_chats.chat_snooze, + ADD ATTRIBUTE unreadMentionsCount BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat( + id TEXT, + accountID TEXT, + network TEXT, + participants beeper_desktop_api_chats.chat_participant, + title TEXT, + type TEXT, + unreadCount BIGINT, + capabilities beeper_desktop_api_chats.chat_capability DEFAULT NULL, + description TEXT DEFAULT NULL, + draft beeper_desktop_api_chats.chat_draft DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isArchived BOOLEAN DEFAULT NULL, + isLowPriority BOOLEAN DEFAULT NULL, + isMarkedUnread BOOLEAN DEFAULT NULL, + isMuted BOOLEAN DEFAULT NULL, + isPinned BOOLEAN DEFAULT NULL, + isReadOnly BOOLEAN DEFAULT NULL, + lastActivity TIMESTAMP DEFAULT NULL, + lastReadMessageSortKey TEXT DEFAULT NULL, + localChatID TEXT DEFAULT NULL, + messageExpirySeconds BIGINT DEFAULT NULL, + reminder beeper_desktop_api_chats.chat_reminder DEFAULT NULL, + snooze beeper_desktop_api_chats.chat_snooze DEFAULT NULL, + unreadMentionsCount BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + accountID, + network, + participants, + title, + type, + unreadCount, + capabilities, + description, + draft, + imgURL, + isArchived, + isLowPriority, + isMarkedUnread, + isMuted, + isPinned, + isReadOnly, + lastActivity, + lastReadMessageSortKey, + localChatID, + messageExpirySeconds, + reminder, + snooze, + unreadMentionsCount + )::beeper_desktop_api_chats.chat; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_participant + ADD ATTRIBUTE hasMore BOOLEAN, + ADD ATTRIBUTE items beeper_desktop_api_chats.chat_participant_item[], + ADD ATTRIBUTE total BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_participant( + hasMore BOOLEAN, + items beeper_desktop_api_chats.chat_participant_item[], + total BIGINT +) +RETURNS beeper_desktop_api_chats.chat_participant +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(hasMore, items, total)::beeper_desktop_api_chats.chat_participant; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_participant_item + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE cannotMessage BOOLEAN, + ADD ATTRIBUTE email TEXT, + ADD ATTRIBUTE fullName TEXT, + ADD ATTRIBUTE imgURL TEXT, + ADD ATTRIBUTE isSelf BOOLEAN, + ADD ATTRIBUTE phoneNumber TEXT, + ADD ATTRIBUTE username TEXT, + ADD ATTRIBUTE isAdmin BOOLEAN, + ADD ATTRIBUTE isNetworkBot BOOLEAN, + ADD ATTRIBUTE isPending BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_participant_item( + id TEXT, + cannotMessage BOOLEAN DEFAULT NULL, + email TEXT DEFAULT NULL, + fullName TEXT DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isSelf BOOLEAN DEFAULT NULL, + phoneNumber TEXT DEFAULT NULL, + username TEXT DEFAULT NULL, + isAdmin BOOLEAN DEFAULT NULL, + isNetworkBot BOOLEAN DEFAULT NULL, + isPending BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_participant_item +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + cannotMessage, + email, + fullName, + imgURL, + isSelf, + phoneNumber, + username, + isAdmin, + isNetworkBot, + isPending + )::beeper_desktop_api_chats.chat_participant_item; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability + ADD ATTRIBUTE allowedReactions TEXT[], + ADD ATTRIBUTE archive BOOLEAN, + ADD ATTRIBUTE attachments JSONB, + ADD ATTRIBUTE customEmojiReactions BOOLEAN, + ADD ATTRIBUTE delete BIGINT, + ADD ATTRIBUTE deleteChat BOOLEAN, + ADD ATTRIBUTE deleteChatForEveryone BOOLEAN, + ADD ATTRIBUTE deleteForMe BOOLEAN, + ADD ATTRIBUTE deleteMaxAge BIGINT, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_capability_disappearing_timer, + ADD ATTRIBUTE edit BIGINT, + ADD ATTRIBUTE editMaxAge BIGINT, + ADD ATTRIBUTE editMaxCount BIGINT, + ADD ATTRIBUTE formatting JSONB, + ADD ATTRIBUTE locationMessage BIGINT, + ADD ATTRIBUTE markAsUnread BOOLEAN, + ADD ATTRIBUTE maxTextLength BIGINT, + ADD ATTRIBUTE messageRequest beeper_desktop_api_chats.chat_capability_message_request, + ADD ATTRIBUTE participantActions beeper_desktop_api_chats.chat_capability_participant_action, + ADD ATTRIBUTE poll BIGINT, + ADD ATTRIBUTE reaction BIGINT, + ADD ATTRIBUTE reactionCount BIGINT, + ADD ATTRIBUTE readReceipts BOOLEAN, + ADD ATTRIBUTE reply BIGINT, + ADD ATTRIBUTE state beeper_desktop_api_chats.chat_capability_state, + ADD ATTRIBUTE thread BIGINT, + ADD ATTRIBUTE typingNotifications BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability( + allowedReactions TEXT[] DEFAULT NULL, + archive BOOLEAN DEFAULT NULL, + attachments JSONB DEFAULT NULL, + customEmojiReactions BOOLEAN DEFAULT NULL, + delete BIGINT DEFAULT NULL, + deleteChat BOOLEAN DEFAULT NULL, + deleteChatForEveryone BOOLEAN DEFAULT NULL, + deleteForMe BOOLEAN DEFAULT NULL, + deleteMaxAge BIGINT DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_capability_disappearing_timer DEFAULT NULL, + edit BIGINT DEFAULT NULL, + editMaxAge BIGINT DEFAULT NULL, + editMaxCount BIGINT DEFAULT NULL, + formatting JSONB DEFAULT NULL, + locationMessage BIGINT DEFAULT NULL, + markAsUnread BOOLEAN DEFAULT NULL, + maxTextLength BIGINT DEFAULT NULL, + messageRequest beeper_desktop_api_chats.chat_capability_message_request DEFAULT NULL, + participantActions beeper_desktop_api_chats.chat_capability_participant_action DEFAULT NULL, + poll BIGINT DEFAULT NULL, + reaction BIGINT DEFAULT NULL, + reactionCount BIGINT DEFAULT NULL, + readReceipts BOOLEAN DEFAULT NULL, + reply BIGINT DEFAULT NULL, + state beeper_desktop_api_chats.chat_capability_state DEFAULT NULL, + thread BIGINT DEFAULT NULL, + typingNotifications BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_capability +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + allowedReactions, + archive, + attachments, + customEmojiReactions, + delete, + deleteChat, + deleteChatForEveryone, + deleteForMe, + deleteMaxAge, + disappearingTimer, + edit, + editMaxAge, + editMaxCount, + formatting, + locationMessage, + markAsUnread, + maxTextLength, + messageRequest, + participantActions, + poll, + reaction, + reactionCount, + readReceipts, + reply, + state, + thread, + typingNotifications + )::beeper_desktop_api_chats.chat_capability; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_disappearing_timer + ADD ATTRIBUTE omitEmptyTimer BOOLEAN, + ADD ATTRIBUTE timers BIGINT[], + ADD ATTRIBUTE types TEXT[]; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_disappearing_timer( + omitEmptyTimer BOOLEAN DEFAULT NULL, + timers BIGINT[] DEFAULT NULL, + types TEXT[] DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_capability_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + omitEmptyTimer, timers, types + )::beeper_desktop_api_chats.chat_capability_disappearing_timer; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_message_request + ADD ATTRIBUTE acceptWithButton BIGINT, ADD ATTRIBUTE acceptWithMessage BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_message_request( + acceptWithButton BIGINT DEFAULT NULL, acceptWithMessage BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_capability_message_request +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + acceptWithButton, acceptWithMessage + )::beeper_desktop_api_chats.chat_capability_message_request; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_participant_action + ADD ATTRIBUTE ban BIGINT, + ADD ATTRIBUTE invite BIGINT, + ADD ATTRIBUTE kick BIGINT, + ADD ATTRIBUTE leave BIGINT, + ADD ATTRIBUTE revokeInvite BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_participant_action( + ban BIGINT DEFAULT NULL, + invite BIGINT DEFAULT NULL, + kick BIGINT DEFAULT NULL, + leave BIGINT DEFAULT NULL, + revokeInvite BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_capability_participant_action +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + ban, invite, kick, leave, revokeInvite + )::beeper_desktop_api_chats.chat_capability_participant_action; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_state + ADD ATTRIBUTE avatar beeper_desktop_api_chats.chat_capability_state_avatar, + ADD ATTRIBUTE description beeper_desktop_api_chats.chat_capability_state_description, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_capability_state_disappearing_timer, + ADD ATTRIBUTE title beeper_desktop_api_chats.chat_capability_state_title; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_state( + avatar beeper_desktop_api_chats.chat_capability_state_avatar DEFAULT NULL, + description beeper_desktop_api_chats.chat_capability_state_description DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_capability_state_disappearing_timer DEFAULT NULL, + title beeper_desktop_api_chats.chat_capability_state_title DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_capability_state +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + avatar, description, disappearingTimer, title + )::beeper_desktop_api_chats.chat_capability_state; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_state_avatar + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_state_avatar( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_capability_state_avatar +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(level)::beeper_desktop_api_chats.chat_capability_state_avatar; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_state_description + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_state_description( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_capability_state_description +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(level)::beeper_desktop_api_chats.chat_capability_state_description; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_state_disappearing_timer + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_state_disappearing_timer( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_capability_state_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_capability_state_disappearing_timer; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_capability_state_title + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_capability_state_title( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_capability_state_title +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(level)::beeper_desktop_api_chats.chat_capability_state_title; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_draft + ADD ATTRIBUTE text TEXT, ADD ATTRIBUTE attachments JSONB; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_draft( + text TEXT, attachments JSONB DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_draft +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(text, attachments)::beeper_desktop_api_chats.chat_draft; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_reminder + ADD ATTRIBUTE dismissOnIncomingMessage BOOLEAN, + ADD ATTRIBUTE remindAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_reminder( + dismissOnIncomingMessage BOOLEAN DEFAULT NULL, remindAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_reminder +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + dismissOnIncomingMessage, remindAt + )::beeper_desktop_api_chats.chat_reminder; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_snooze + ADD ATTRIBUTE snoozeUntil TIMESTAMP, ADD ATTRIBUTE userSnoozedAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_snooze( + snoozeUntil TIMESTAMP DEFAULT NULL, userSnoozedAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_snooze +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(snoozeUntil, userSnoozedAt)::beeper_desktop_api_chats.chat_snooze; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE network TEXT, + ADD ATTRIBUTE participants beeper_desktop_api_chats.chat_create_response_participant, + ADD ATTRIBUTE title TEXT, + ADD ATTRIBUTE type TEXT, + ADD ATTRIBUTE unreadCount BIGINT, + ADD ATTRIBUTE chatID TEXT, + ADD ATTRIBUTE capabilities beeper_desktop_api_chats.chat_create_response_capability, + ADD ATTRIBUTE description TEXT, + ADD ATTRIBUTE draft beeper_desktop_api_chats.chat_create_response_draft, + ADD ATTRIBUTE imgURL TEXT, + ADD ATTRIBUTE isArchived BOOLEAN, + ADD ATTRIBUTE isLowPriority BOOLEAN, + ADD ATTRIBUTE isMarkedUnread BOOLEAN, + ADD ATTRIBUTE isMuted BOOLEAN, + ADD ATTRIBUTE isPinned BOOLEAN, + ADD ATTRIBUTE isReadOnly BOOLEAN, + ADD ATTRIBUTE lastActivity TIMESTAMP, + ADD ATTRIBUTE lastReadMessageSortKey TEXT, + ADD ATTRIBUTE localChatID TEXT, + ADD ATTRIBUTE messageExpirySeconds BIGINT, + ADD ATTRIBUTE reminder beeper_desktop_api_chats.chat_create_response_reminder, + ADD ATTRIBUTE snooze beeper_desktop_api_chats.chat_create_response_snooze, + ADD ATTRIBUTE unreadMentionsCount BIGINT, + ADD ATTRIBUTE status TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response( + id TEXT, + accountID TEXT, + network TEXT, + participants beeper_desktop_api_chats.chat_create_response_participant, + title TEXT, + type TEXT, + unreadCount BIGINT, + chatID TEXT, + capabilities beeper_desktop_api_chats.chat_create_response_capability DEFAULT NULL, + description TEXT DEFAULT NULL, + draft beeper_desktop_api_chats.chat_create_response_draft DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isArchived BOOLEAN DEFAULT NULL, + isLowPriority BOOLEAN DEFAULT NULL, + isMarkedUnread BOOLEAN DEFAULT NULL, + isMuted BOOLEAN DEFAULT NULL, + isPinned BOOLEAN DEFAULT NULL, + isReadOnly BOOLEAN DEFAULT NULL, + lastActivity TIMESTAMP DEFAULT NULL, + lastReadMessageSortKey TEXT DEFAULT NULL, + localChatID TEXT DEFAULT NULL, + messageExpirySeconds BIGINT DEFAULT NULL, + reminder beeper_desktop_api_chats.chat_create_response_reminder DEFAULT NULL, + snooze beeper_desktop_api_chats.chat_create_response_snooze DEFAULT NULL, + unreadMentionsCount BIGINT DEFAULT NULL, + status TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + accountID, + network, + participants, + title, + type, + unreadCount, + chatID, + capabilities, + description, + draft, + imgURL, + isArchived, + isLowPriority, + isMarkedUnread, + isMuted, + isPinned, + isReadOnly, + lastActivity, + lastReadMessageSortKey, + localChatID, + messageExpirySeconds, + reminder, + snooze, + unreadMentionsCount, + status + )::beeper_desktop_api_chats.chat_create_response; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_participant + ADD ATTRIBUTE hasMore BOOLEAN, + ADD ATTRIBUTE items beeper_desktop_api_chats.chat_create_response_participant_item[], + ADD ATTRIBUTE total BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_participant( + hasMore BOOLEAN, + items beeper_desktop_api_chats.chat_create_response_participant_item[], + total BIGINT +) +RETURNS beeper_desktop_api_chats.chat_create_response_participant +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + hasMore, items, total + )::beeper_desktop_api_chats.chat_create_response_participant; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_participant_item + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE cannotMessage BOOLEAN, + ADD ATTRIBUTE email TEXT, + ADD ATTRIBUTE fullName TEXT, + ADD ATTRIBUTE imgURL TEXT, + ADD ATTRIBUTE isSelf BOOLEAN, + ADD ATTRIBUTE phoneNumber TEXT, + ADD ATTRIBUTE username TEXT, + ADD ATTRIBUTE isAdmin BOOLEAN, + ADD ATTRIBUTE isNetworkBot BOOLEAN, + ADD ATTRIBUTE isPending BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_participant_item( + id TEXT, + cannotMessage BOOLEAN DEFAULT NULL, + email TEXT DEFAULT NULL, + fullName TEXT DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isSelf BOOLEAN DEFAULT NULL, + phoneNumber TEXT DEFAULT NULL, + username TEXT DEFAULT NULL, + isAdmin BOOLEAN DEFAULT NULL, + isNetworkBot BOOLEAN DEFAULT NULL, + isPending BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_participant_item +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + cannotMessage, + email, + fullName, + imgURL, + isSelf, + phoneNumber, + username, + isAdmin, + isNetworkBot, + isPending + )::beeper_desktop_api_chats.chat_create_response_participant_item; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability + ADD ATTRIBUTE allowedReactions TEXT[], + ADD ATTRIBUTE archive BOOLEAN, + ADD ATTRIBUTE attachments JSONB, + ADD ATTRIBUTE customEmojiReactions BOOLEAN, + ADD ATTRIBUTE delete BIGINT, + ADD ATTRIBUTE deleteChat BOOLEAN, + ADD ATTRIBUTE deleteChatForEveryone BOOLEAN, + ADD ATTRIBUTE deleteForMe BOOLEAN, + ADD ATTRIBUTE deleteMaxAge BIGINT, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_create_response_capability_disappearing_timer, + ADD ATTRIBUTE edit BIGINT, + ADD ATTRIBUTE editMaxAge BIGINT, + ADD ATTRIBUTE editMaxCount BIGINT, + ADD ATTRIBUTE formatting JSONB, + ADD ATTRIBUTE locationMessage BIGINT, + ADD ATTRIBUTE markAsUnread BOOLEAN, + ADD ATTRIBUTE maxTextLength BIGINT, + ADD ATTRIBUTE messageRequest beeper_desktop_api_chats.chat_create_response_capability_message_request, + ADD ATTRIBUTE participantActions beeper_desktop_api_chats.chat_create_response_capability_participant_action, + ADD ATTRIBUTE poll BIGINT, + ADD ATTRIBUTE reaction BIGINT, + ADD ATTRIBUTE reactionCount BIGINT, + ADD ATTRIBUTE readReceipts BOOLEAN, + ADD ATTRIBUTE reply BIGINT, + ADD ATTRIBUTE state beeper_desktop_api_chats.chat_create_response_capability_state, + ADD ATTRIBUTE thread BIGINT, + ADD ATTRIBUTE typingNotifications BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability( + allowedReactions TEXT[] DEFAULT NULL, + archive BOOLEAN DEFAULT NULL, + attachments JSONB DEFAULT NULL, + customEmojiReactions BOOLEAN DEFAULT NULL, + delete BIGINT DEFAULT NULL, + deleteChat BOOLEAN DEFAULT NULL, + deleteChatForEveryone BOOLEAN DEFAULT NULL, + deleteForMe BOOLEAN DEFAULT NULL, + deleteMaxAge BIGINT DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_create_response_capability_disappearing_timer DEFAULT NULL, + edit BIGINT DEFAULT NULL, + editMaxAge BIGINT DEFAULT NULL, + editMaxCount BIGINT DEFAULT NULL, + formatting JSONB DEFAULT NULL, + locationMessage BIGINT DEFAULT NULL, + markAsUnread BOOLEAN DEFAULT NULL, + maxTextLength BIGINT DEFAULT NULL, + messageRequest beeper_desktop_api_chats.chat_create_response_capability_message_request DEFAULT NULL, + participantActions beeper_desktop_api_chats.chat_create_response_capability_participant_action DEFAULT NULL, + poll BIGINT DEFAULT NULL, + reaction BIGINT DEFAULT NULL, + reactionCount BIGINT DEFAULT NULL, + readReceipts BOOLEAN DEFAULT NULL, + reply BIGINT DEFAULT NULL, + state beeper_desktop_api_chats.chat_create_response_capability_state DEFAULT NULL, + thread BIGINT DEFAULT NULL, + typingNotifications BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + allowedReactions, + archive, + attachments, + customEmojiReactions, + delete, + deleteChat, + deleteChatForEveryone, + deleteForMe, + deleteMaxAge, + disappearingTimer, + edit, + editMaxAge, + editMaxCount, + formatting, + locationMessage, + markAsUnread, + maxTextLength, + messageRequest, + participantActions, + poll, + reaction, + reactionCount, + readReceipts, + reply, + state, + thread, + typingNotifications + )::beeper_desktop_api_chats.chat_create_response_capability; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_disappearing_timer + ADD ATTRIBUTE omitEmptyTimer BOOLEAN, + ADD ATTRIBUTE timers BIGINT[], + ADD ATTRIBUTE types TEXT[]; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_disappearing_timer( + omitEmptyTimer BOOLEAN DEFAULT NULL, + timers BIGINT[] DEFAULT NULL, + types TEXT[] DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + omitEmptyTimer, timers, types + )::beeper_desktop_api_chats.chat_create_response_capability_disappearing_timer; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_message_request + ADD ATTRIBUTE acceptWithButton BIGINT, ADD ATTRIBUTE acceptWithMessage BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_message_request( + acceptWithButton BIGINT DEFAULT NULL, acceptWithMessage BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_message_request +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + acceptWithButton, acceptWithMessage + )::beeper_desktop_api_chats.chat_create_response_capability_message_request; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_participant_action + ADD ATTRIBUTE ban BIGINT, + ADD ATTRIBUTE invite BIGINT, + ADD ATTRIBUTE kick BIGINT, + ADD ATTRIBUTE leave BIGINT, + ADD ATTRIBUTE revokeInvite BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_participant_action( + ban BIGINT DEFAULT NULL, + invite BIGINT DEFAULT NULL, + kick BIGINT DEFAULT NULL, + leave BIGINT DEFAULT NULL, + revokeInvite BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_participant_action +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + ban, invite, kick, leave, revokeInvite + )::beeper_desktop_api_chats.chat_create_response_capability_participant_action; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_state + ADD ATTRIBUTE avatar beeper_desktop_api_chats.chat_create_response_capability_state_avatar, + ADD ATTRIBUTE description beeper_desktop_api_chats.chat_create_response_capability_state_description, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_create_response_capability_state_disappearing_timer, + ADD ATTRIBUTE title beeper_desktop_api_chats.chat_create_response_capability_state_title; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_state( + avatar beeper_desktop_api_chats.chat_create_response_capability_state_avatar DEFAULT NULL, + description beeper_desktop_api_chats.chat_create_response_capability_state_description DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_create_response_capability_state_disappearing_timer DEFAULT NULL, + title beeper_desktop_api_chats.chat_create_response_capability_state_title DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_state +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + avatar, description, disappearingTimer, title + )::beeper_desktop_api_chats.chat_create_response_capability_state; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_state_avatar + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_state_avatar( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_state_avatar +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_create_response_capability_state_avatar; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_state_description + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_state_description( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_state_description +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_create_response_capability_state_description; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_state_disappearing_timer + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_state_disappearing_timer( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_state_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_create_response_capability_state_disappearing_timer; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_capability_state_title + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_capability_state_title( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_create_response_capability_state_title +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_create_response_capability_state_title; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_draft + ADD ATTRIBUTE text TEXT, ADD ATTRIBUTE attachments JSONB; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_draft( + text TEXT, attachments JSONB DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_draft +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + text, attachments + )::beeper_desktop_api_chats.chat_create_response_draft; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_reminder + ADD ATTRIBUTE dismissOnIncomingMessage BOOLEAN, + ADD ATTRIBUTE remindAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_reminder( + dismissOnIncomingMessage BOOLEAN DEFAULT NULL, remindAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_reminder +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + dismissOnIncomingMessage, remindAt + )::beeper_desktop_api_chats.chat_create_response_reminder; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_create_response_snooze + ADD ATTRIBUTE snoozeUntil TIMESTAMP, ADD ATTRIBUTE userSnoozedAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response_snooze( + snoozeUntil TIMESTAMP DEFAULT NULL, userSnoozedAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_create_response_snooze +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + snoozeUntil, userSnoozedAt + )::beeper_desktop_api_chats.chat_create_response_snooze; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE network TEXT, + ADD ATTRIBUTE participants beeper_desktop_api_chats.chat_list_response_participant, + ADD ATTRIBUTE title TEXT, + ADD ATTRIBUTE type TEXT, + ADD ATTRIBUTE unreadCount BIGINT, + ADD ATTRIBUTE capabilities beeper_desktop_api_chats.chat_list_response_capability, + ADD ATTRIBUTE description TEXT, + ADD ATTRIBUTE draft beeper_desktop_api_chats.chat_list_response_draft, + ADD ATTRIBUTE imgURL TEXT, + ADD ATTRIBUTE isArchived BOOLEAN, + ADD ATTRIBUTE isLowPriority BOOLEAN, + ADD ATTRIBUTE isMarkedUnread BOOLEAN, + ADD ATTRIBUTE isMuted BOOLEAN, + ADD ATTRIBUTE isPinned BOOLEAN, + ADD ATTRIBUTE isReadOnly BOOLEAN, + ADD ATTRIBUTE lastActivity TIMESTAMP, + ADD ATTRIBUTE lastReadMessageSortKey TEXT, + ADD ATTRIBUTE localChatID TEXT, + ADD ATTRIBUTE messageExpirySeconds BIGINT, + ADD ATTRIBUTE reminder beeper_desktop_api_chats.chat_list_response_reminder, + ADD ATTRIBUTE snooze beeper_desktop_api_chats.chat_list_response_snooze, + ADD ATTRIBUTE unreadMentionsCount BIGINT, + ADD ATTRIBUTE preview beeper_desktop_api.message; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response( + id TEXT, + accountID TEXT, + network TEXT, + participants beeper_desktop_api_chats.chat_list_response_participant, + title TEXT, + type TEXT, + unreadCount BIGINT, + capabilities beeper_desktop_api_chats.chat_list_response_capability DEFAULT NULL, + description TEXT DEFAULT NULL, + draft beeper_desktop_api_chats.chat_list_response_draft DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isArchived BOOLEAN DEFAULT NULL, + isLowPriority BOOLEAN DEFAULT NULL, + isMarkedUnread BOOLEAN DEFAULT NULL, + isMuted BOOLEAN DEFAULT NULL, + isPinned BOOLEAN DEFAULT NULL, + isReadOnly BOOLEAN DEFAULT NULL, + lastActivity TIMESTAMP DEFAULT NULL, + lastReadMessageSortKey TEXT DEFAULT NULL, + localChatID TEXT DEFAULT NULL, + messageExpirySeconds BIGINT DEFAULT NULL, + reminder beeper_desktop_api_chats.chat_list_response_reminder DEFAULT NULL, + snooze beeper_desktop_api_chats.chat_list_response_snooze DEFAULT NULL, + unreadMentionsCount BIGINT DEFAULT NULL, + preview beeper_desktop_api.message DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + accountID, + network, + participants, + title, + type, + unreadCount, + capabilities, + description, + draft, + imgURL, + isArchived, + isLowPriority, + isMarkedUnread, + isMuted, + isPinned, + isReadOnly, + lastActivity, + lastReadMessageSortKey, + localChatID, + messageExpirySeconds, + reminder, + snooze, + unreadMentionsCount, + preview + )::beeper_desktop_api_chats.chat_list_response; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_participant + ADD ATTRIBUTE hasMore BOOLEAN, + ADD ATTRIBUTE items beeper_desktop_api_chats.chat_list_response_participant_item[], + ADD ATTRIBUTE total BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_participant( + hasMore BOOLEAN, + items beeper_desktop_api_chats.chat_list_response_participant_item[], + total BIGINT +) +RETURNS beeper_desktop_api_chats.chat_list_response_participant +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + hasMore, items, total + )::beeper_desktop_api_chats.chat_list_response_participant; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_participant_item + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE cannotMessage BOOLEAN, + ADD ATTRIBUTE email TEXT, + ADD ATTRIBUTE fullName TEXT, + ADD ATTRIBUTE imgURL TEXT, + ADD ATTRIBUTE isSelf BOOLEAN, + ADD ATTRIBUTE phoneNumber TEXT, + ADD ATTRIBUTE username TEXT, + ADD ATTRIBUTE isAdmin BOOLEAN, + ADD ATTRIBUTE isNetworkBot BOOLEAN, + ADD ATTRIBUTE isPending BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_participant_item( + id TEXT, + cannotMessage BOOLEAN DEFAULT NULL, + email TEXT DEFAULT NULL, + fullName TEXT DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isSelf BOOLEAN DEFAULT NULL, + phoneNumber TEXT DEFAULT NULL, + username TEXT DEFAULT NULL, + isAdmin BOOLEAN DEFAULT NULL, + isNetworkBot BOOLEAN DEFAULT NULL, + isPending BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_participant_item +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + cannotMessage, + email, + fullName, + imgURL, + isSelf, + phoneNumber, + username, + isAdmin, + isNetworkBot, + isPending + )::beeper_desktop_api_chats.chat_list_response_participant_item; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability + ADD ATTRIBUTE allowedReactions TEXT[], + ADD ATTRIBUTE archive BOOLEAN, + ADD ATTRIBUTE attachments JSONB, + ADD ATTRIBUTE customEmojiReactions BOOLEAN, + ADD ATTRIBUTE delete BIGINT, + ADD ATTRIBUTE deleteChat BOOLEAN, + ADD ATTRIBUTE deleteChatForEveryone BOOLEAN, + ADD ATTRIBUTE deleteForMe BOOLEAN, + ADD ATTRIBUTE deleteMaxAge BIGINT, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_list_response_capability_disappearing_timer, + ADD ATTRIBUTE edit BIGINT, + ADD ATTRIBUTE editMaxAge BIGINT, + ADD ATTRIBUTE editMaxCount BIGINT, + ADD ATTRIBUTE formatting JSONB, + ADD ATTRIBUTE locationMessage BIGINT, + ADD ATTRIBUTE markAsUnread BOOLEAN, + ADD ATTRIBUTE maxTextLength BIGINT, + ADD ATTRIBUTE messageRequest beeper_desktop_api_chats.chat_list_response_capability_message_request, + ADD ATTRIBUTE participantActions beeper_desktop_api_chats.chat_list_response_capability_participant_action, + ADD ATTRIBUTE poll BIGINT, + ADD ATTRIBUTE reaction BIGINT, + ADD ATTRIBUTE reactionCount BIGINT, + ADD ATTRIBUTE readReceipts BOOLEAN, + ADD ATTRIBUTE reply BIGINT, + ADD ATTRIBUTE state beeper_desktop_api_chats.chat_list_response_capability_state, + ADD ATTRIBUTE thread BIGINT, + ADD ATTRIBUTE typingNotifications BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability( + allowedReactions TEXT[] DEFAULT NULL, + archive BOOLEAN DEFAULT NULL, + attachments JSONB DEFAULT NULL, + customEmojiReactions BOOLEAN DEFAULT NULL, + delete BIGINT DEFAULT NULL, + deleteChat BOOLEAN DEFAULT NULL, + deleteChatForEveryone BOOLEAN DEFAULT NULL, + deleteForMe BOOLEAN DEFAULT NULL, + deleteMaxAge BIGINT DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_list_response_capability_disappearing_timer DEFAULT NULL, + edit BIGINT DEFAULT NULL, + editMaxAge BIGINT DEFAULT NULL, + editMaxCount BIGINT DEFAULT NULL, + formatting JSONB DEFAULT NULL, + locationMessage BIGINT DEFAULT NULL, + markAsUnread BOOLEAN DEFAULT NULL, + maxTextLength BIGINT DEFAULT NULL, + messageRequest beeper_desktop_api_chats.chat_list_response_capability_message_request DEFAULT NULL, + participantActions beeper_desktop_api_chats.chat_list_response_capability_participant_action DEFAULT NULL, + poll BIGINT DEFAULT NULL, + reaction BIGINT DEFAULT NULL, + reactionCount BIGINT DEFAULT NULL, + readReceipts BOOLEAN DEFAULT NULL, + reply BIGINT DEFAULT NULL, + state beeper_desktop_api_chats.chat_list_response_capability_state DEFAULT NULL, + thread BIGINT DEFAULT NULL, + typingNotifications BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + allowedReactions, + archive, + attachments, + customEmojiReactions, + delete, + deleteChat, + deleteChatForEveryone, + deleteForMe, + deleteMaxAge, + disappearingTimer, + edit, + editMaxAge, + editMaxCount, + formatting, + locationMessage, + markAsUnread, + maxTextLength, + messageRequest, + participantActions, + poll, + reaction, + reactionCount, + readReceipts, + reply, + state, + thread, + typingNotifications + )::beeper_desktop_api_chats.chat_list_response_capability; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_disappearing_timer + ADD ATTRIBUTE omitEmptyTimer BOOLEAN, + ADD ATTRIBUTE timers BIGINT[], + ADD ATTRIBUTE types TEXT[]; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_disappearing_timer( + omitEmptyTimer BOOLEAN DEFAULT NULL, + timers BIGINT[] DEFAULT NULL, + types TEXT[] DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + omitEmptyTimer, timers, types + )::beeper_desktop_api_chats.chat_list_response_capability_disappearing_timer; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_message_request + ADD ATTRIBUTE acceptWithButton BIGINT, ADD ATTRIBUTE acceptWithMessage BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_message_request( + acceptWithButton BIGINT DEFAULT NULL, acceptWithMessage BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_message_request +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + acceptWithButton, acceptWithMessage + )::beeper_desktop_api_chats.chat_list_response_capability_message_request; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_participant_action + ADD ATTRIBUTE ban BIGINT, + ADD ATTRIBUTE invite BIGINT, + ADD ATTRIBUTE kick BIGINT, + ADD ATTRIBUTE leave BIGINT, + ADD ATTRIBUTE revokeInvite BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_participant_action( + ban BIGINT DEFAULT NULL, + invite BIGINT DEFAULT NULL, + kick BIGINT DEFAULT NULL, + leave BIGINT DEFAULT NULL, + revokeInvite BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_participant_action +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + ban, invite, kick, leave, revokeInvite + )::beeper_desktop_api_chats.chat_list_response_capability_participant_action; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_state + ADD ATTRIBUTE avatar beeper_desktop_api_chats.chat_list_response_capability_state_avatar, + ADD ATTRIBUTE description beeper_desktop_api_chats.chat_list_response_capability_state_description, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_list_response_capability_state_disappearing_timer, + ADD ATTRIBUTE title beeper_desktop_api_chats.chat_list_response_capability_state_title; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_state( + avatar beeper_desktop_api_chats.chat_list_response_capability_state_avatar DEFAULT NULL, + description beeper_desktop_api_chats.chat_list_response_capability_state_description DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_list_response_capability_state_disappearing_timer DEFAULT NULL, + title beeper_desktop_api_chats.chat_list_response_capability_state_title DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_state +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + avatar, description, disappearingTimer, title + )::beeper_desktop_api_chats.chat_list_response_capability_state; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_state_avatar + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_state_avatar( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_state_avatar +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_list_response_capability_state_avatar; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_state_description + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_state_description( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_state_description +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_list_response_capability_state_description; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_state_disappearing_timer + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_state_disappearing_timer( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_state_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_list_response_capability_state_disappearing_timer; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_capability_state_title + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_capability_state_title( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_list_response_capability_state_title +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_list_response_capability_state_title; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_draft + ADD ATTRIBUTE text TEXT, ADD ATTRIBUTE attachments JSONB; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_draft( + text TEXT, attachments JSONB DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_draft +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + text, attachments + )::beeper_desktop_api_chats.chat_list_response_draft; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_reminder + ADD ATTRIBUTE dismissOnIncomingMessage BOOLEAN, + ADD ATTRIBUTE remindAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_reminder( + dismissOnIncomingMessage BOOLEAN DEFAULT NULL, remindAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_reminder +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + dismissOnIncomingMessage, remindAt + )::beeper_desktop_api_chats.chat_list_response_reminder; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_list_response_snooze + ADD ATTRIBUTE snoozeUntil TIMESTAMP, ADD ATTRIBUTE userSnoozedAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_snooze( + snoozeUntil TIMESTAMP DEFAULT NULL, userSnoozedAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_list_response_snooze +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + snoozeUntil, userSnoozedAt + )::beeper_desktop_api_chats.chat_list_response_snooze; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE network TEXT, + ADD ATTRIBUTE participants beeper_desktop_api_chats.chat_start_response_participant, + ADD ATTRIBUTE title TEXT, + ADD ATTRIBUTE type TEXT, + ADD ATTRIBUTE unreadCount BIGINT, + ADD ATTRIBUTE chatID TEXT, + ADD ATTRIBUTE capabilities beeper_desktop_api_chats.chat_start_response_capability, + ADD ATTRIBUTE description TEXT, + ADD ATTRIBUTE draft beeper_desktop_api_chats.chat_start_response_draft, + ADD ATTRIBUTE imgURL TEXT, + ADD ATTRIBUTE isArchived BOOLEAN, + ADD ATTRIBUTE isLowPriority BOOLEAN, + ADD ATTRIBUTE isMarkedUnread BOOLEAN, + ADD ATTRIBUTE isMuted BOOLEAN, + ADD ATTRIBUTE isPinned BOOLEAN, + ADD ATTRIBUTE isReadOnly BOOLEAN, + ADD ATTRIBUTE lastActivity TIMESTAMP, + ADD ATTRIBUTE lastReadMessageSortKey TEXT, + ADD ATTRIBUTE localChatID TEXT, + ADD ATTRIBUTE messageExpirySeconds BIGINT, + ADD ATTRIBUTE reminder beeper_desktop_api_chats.chat_start_response_reminder, + ADD ATTRIBUTE snooze beeper_desktop_api_chats.chat_start_response_snooze, + ADD ATTRIBUTE unreadMentionsCount BIGINT, + ADD ATTRIBUTE status TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response( + id TEXT, + accountID TEXT, + network TEXT, + participants beeper_desktop_api_chats.chat_start_response_participant, + title TEXT, + type TEXT, + unreadCount BIGINT, + chatID TEXT, + capabilities beeper_desktop_api_chats.chat_start_response_capability DEFAULT NULL, + description TEXT DEFAULT NULL, + draft beeper_desktop_api_chats.chat_start_response_draft DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isArchived BOOLEAN DEFAULT NULL, + isLowPriority BOOLEAN DEFAULT NULL, + isMarkedUnread BOOLEAN DEFAULT NULL, + isMuted BOOLEAN DEFAULT NULL, + isPinned BOOLEAN DEFAULT NULL, + isReadOnly BOOLEAN DEFAULT NULL, + lastActivity TIMESTAMP DEFAULT NULL, + lastReadMessageSortKey TEXT DEFAULT NULL, + localChatID TEXT DEFAULT NULL, + messageExpirySeconds BIGINT DEFAULT NULL, + reminder beeper_desktop_api_chats.chat_start_response_reminder DEFAULT NULL, + snooze beeper_desktop_api_chats.chat_start_response_snooze DEFAULT NULL, + unreadMentionsCount BIGINT DEFAULT NULL, + status TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + accountID, + network, + participants, + title, + type, + unreadCount, + chatID, + capabilities, + description, + draft, + imgURL, + isArchived, + isLowPriority, + isMarkedUnread, + isMuted, + isPinned, + isReadOnly, + lastActivity, + lastReadMessageSortKey, + localChatID, + messageExpirySeconds, + reminder, + snooze, + unreadMentionsCount, + status + )::beeper_desktop_api_chats.chat_start_response; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_participant + ADD ATTRIBUTE hasMore BOOLEAN, + ADD ATTRIBUTE items beeper_desktop_api_chats.chat_start_response_participant_item[], + ADD ATTRIBUTE total BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_participant( + hasMore BOOLEAN, + items beeper_desktop_api_chats.chat_start_response_participant_item[], + total BIGINT +) +RETURNS beeper_desktop_api_chats.chat_start_response_participant +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + hasMore, items, total + )::beeper_desktop_api_chats.chat_start_response_participant; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_participant_item + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE cannotMessage BOOLEAN, + ADD ATTRIBUTE email TEXT, + ADD ATTRIBUTE fullName TEXT, + ADD ATTRIBUTE imgURL TEXT, + ADD ATTRIBUTE isSelf BOOLEAN, + ADD ATTRIBUTE phoneNumber TEXT, + ADD ATTRIBUTE username TEXT, + ADD ATTRIBUTE isAdmin BOOLEAN, + ADD ATTRIBUTE isNetworkBot BOOLEAN, + ADD ATTRIBUTE isPending BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_participant_item( + id TEXT, + cannotMessage BOOLEAN DEFAULT NULL, + email TEXT DEFAULT NULL, + fullName TEXT DEFAULT NULL, + imgURL TEXT DEFAULT NULL, + isSelf BOOLEAN DEFAULT NULL, + phoneNumber TEXT DEFAULT NULL, + username TEXT DEFAULT NULL, + isAdmin BOOLEAN DEFAULT NULL, + isNetworkBot BOOLEAN DEFAULT NULL, + isPending BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_participant_item +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + id, + cannotMessage, + email, + fullName, + imgURL, + isSelf, + phoneNumber, + username, + isAdmin, + isNetworkBot, + isPending + )::beeper_desktop_api_chats.chat_start_response_participant_item; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability + ADD ATTRIBUTE allowedReactions TEXT[], + ADD ATTRIBUTE archive BOOLEAN, + ADD ATTRIBUTE attachments JSONB, + ADD ATTRIBUTE customEmojiReactions BOOLEAN, + ADD ATTRIBUTE delete BIGINT, + ADD ATTRIBUTE deleteChat BOOLEAN, + ADD ATTRIBUTE deleteChatForEveryone BOOLEAN, + ADD ATTRIBUTE deleteForMe BOOLEAN, + ADD ATTRIBUTE deleteMaxAge BIGINT, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_start_response_capability_disappearing_timer, + ADD ATTRIBUTE edit BIGINT, + ADD ATTRIBUTE editMaxAge BIGINT, + ADD ATTRIBUTE editMaxCount BIGINT, + ADD ATTRIBUTE formatting JSONB, + ADD ATTRIBUTE locationMessage BIGINT, + ADD ATTRIBUTE markAsUnread BOOLEAN, + ADD ATTRIBUTE maxTextLength BIGINT, + ADD ATTRIBUTE messageRequest beeper_desktop_api_chats.chat_start_response_capability_message_request, + ADD ATTRIBUTE participantActions beeper_desktop_api_chats.chat_start_response_capability_participant_action, + ADD ATTRIBUTE poll BIGINT, + ADD ATTRIBUTE reaction BIGINT, + ADD ATTRIBUTE reactionCount BIGINT, + ADD ATTRIBUTE readReceipts BOOLEAN, + ADD ATTRIBUTE reply BIGINT, + ADD ATTRIBUTE state beeper_desktop_api_chats.chat_start_response_capability_state, + ADD ATTRIBUTE thread BIGINT, + ADD ATTRIBUTE typingNotifications BOOLEAN; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability( + allowedReactions TEXT[] DEFAULT NULL, + archive BOOLEAN DEFAULT NULL, + attachments JSONB DEFAULT NULL, + customEmojiReactions BOOLEAN DEFAULT NULL, + delete BIGINT DEFAULT NULL, + deleteChat BOOLEAN DEFAULT NULL, + deleteChatForEveryone BOOLEAN DEFAULT NULL, + deleteForMe BOOLEAN DEFAULT NULL, + deleteMaxAge BIGINT DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_start_response_capability_disappearing_timer DEFAULT NULL, + edit BIGINT DEFAULT NULL, + editMaxAge BIGINT DEFAULT NULL, + editMaxCount BIGINT DEFAULT NULL, + formatting JSONB DEFAULT NULL, + locationMessage BIGINT DEFAULT NULL, + markAsUnread BOOLEAN DEFAULT NULL, + maxTextLength BIGINT DEFAULT NULL, + messageRequest beeper_desktop_api_chats.chat_start_response_capability_message_request DEFAULT NULL, + participantActions beeper_desktop_api_chats.chat_start_response_capability_participant_action DEFAULT NULL, + poll BIGINT DEFAULT NULL, + reaction BIGINT DEFAULT NULL, + reactionCount BIGINT DEFAULT NULL, + readReceipts BOOLEAN DEFAULT NULL, + reply BIGINT DEFAULT NULL, + state beeper_desktop_api_chats.chat_start_response_capability_state DEFAULT NULL, + thread BIGINT DEFAULT NULL, + typingNotifications BOOLEAN DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + allowedReactions, + archive, + attachments, + customEmojiReactions, + delete, + deleteChat, + deleteChatForEveryone, + deleteForMe, + deleteMaxAge, + disappearingTimer, + edit, + editMaxAge, + editMaxCount, + formatting, + locationMessage, + markAsUnread, + maxTextLength, + messageRequest, + participantActions, + poll, + reaction, + reactionCount, + readReceipts, + reply, + state, + thread, + typingNotifications + )::beeper_desktop_api_chats.chat_start_response_capability; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_disappearing_timer + ADD ATTRIBUTE omitEmptyTimer BOOLEAN, + ADD ATTRIBUTE timers BIGINT[], + ADD ATTRIBUTE types TEXT[]; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_disappearing_timer( + omitEmptyTimer BOOLEAN DEFAULT NULL, + timers BIGINT[] DEFAULT NULL, + types TEXT[] DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + omitEmptyTimer, timers, types + )::beeper_desktop_api_chats.chat_start_response_capability_disappearing_timer; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_message_request + ADD ATTRIBUTE acceptWithButton BIGINT, ADD ATTRIBUTE acceptWithMessage BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_message_request( + acceptWithButton BIGINT DEFAULT NULL, acceptWithMessage BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability_message_request +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + acceptWithButton, acceptWithMessage + )::beeper_desktop_api_chats.chat_start_response_capability_message_request; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_participant_action + ADD ATTRIBUTE ban BIGINT, + ADD ATTRIBUTE invite BIGINT, + ADD ATTRIBUTE kick BIGINT, + ADD ATTRIBUTE leave BIGINT, + ADD ATTRIBUTE revokeInvite BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_participant_action( + ban BIGINT DEFAULT NULL, + invite BIGINT DEFAULT NULL, + kick BIGINT DEFAULT NULL, + leave BIGINT DEFAULT NULL, + revokeInvite BIGINT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability_participant_action +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + ban, invite, kick, leave, revokeInvite + )::beeper_desktop_api_chats.chat_start_response_capability_participant_action; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_state + ADD ATTRIBUTE avatar beeper_desktop_api_chats.chat_start_response_capability_state_avatar, + ADD ATTRIBUTE description beeper_desktop_api_chats.chat_start_response_capability_state_description, + ADD ATTRIBUTE disappearingTimer beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer, + ADD ATTRIBUTE title beeper_desktop_api_chats.chat_start_response_capability_state_title; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_state( + avatar beeper_desktop_api_chats.chat_start_response_capability_state_avatar DEFAULT NULL, + description beeper_desktop_api_chats.chat_start_response_capability_state_description DEFAULT NULL, + disappearingTimer beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer DEFAULT NULL, + title beeper_desktop_api_chats.chat_start_response_capability_state_title DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + avatar, description, disappearingTimer, title + )::beeper_desktop_api_chats.chat_start_response_capability_state; +$$; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat( - id TEXT, - accountID TEXT, - participants beeper_desktop_api_chats.chat_participant, - title TEXT, - type TEXT, - unreadCount BIGINT, - isArchived BOOLEAN DEFAULT NULL, - isMuted BOOLEAN DEFAULT NULL, - isPinned BOOLEAN DEFAULT NULL, - lastActivity TIMESTAMP DEFAULT NULL, - lastReadMessageSortKey TEXT DEFAULT NULL, - localChatID TEXT DEFAULT NULL +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_state_avatar + ADD ATTRIBUTE level BIGINT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_state_avatar( + level BIGINT ) -RETURNS beeper_desktop_api_chats.chat +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state_avatar LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( - id, - accountID, - participants, - title, - type, - unreadCount, - isArchived, - isMuted, - isPinned, - lastActivity, - lastReadMessageSortKey, - localChatID - )::beeper_desktop_api_chats.chat; + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_avatar; $$; -ALTER TYPE beeper_desktop_api_chats.chat_participant - ADD ATTRIBUTE hasMore BOOLEAN, - ADD ATTRIBUTE items beeper_desktop_api.user[], - ADD ATTRIBUTE total BIGINT; +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_state_description + ADD ATTRIBUTE level BIGINT; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_participant( - hasMore BOOLEAN, items beeper_desktop_api.user[], total BIGINT +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_state_description( + level BIGINT ) -RETURNS beeper_desktop_api_chats.chat_participant +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state_description LANGUAGE SQL IMMUTABLE AS $$ - SELECT ROW(hasMore, items, total)::beeper_desktop_api_chats.chat_participant; + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_description; $$; -ALTER TYPE beeper_desktop_api_chats.chat_create_response - ADD ATTRIBUTE chatID TEXT, ADD ATTRIBUTE status TEXT; +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer + ADD ATTRIBUTE level BIGINT; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_create_response( - chatID TEXT, status TEXT DEFAULT NULL +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_state_disappearing_timer( + level BIGINT ) -RETURNS beeper_desktop_api_chats.chat_create_response +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer LANGUAGE SQL IMMUTABLE AS $$ - SELECT ROW(chatID, status)::beeper_desktop_api_chats.chat_create_response; + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer; $$; -ALTER TYPE beeper_desktop_api_chats.chat_list_response - ADD ATTRIBUTE id TEXT, - ADD ATTRIBUTE accountID TEXT, - ADD ATTRIBUTE participants beeper_desktop_api_chats.chat_list_response_participant, - ADD ATTRIBUTE title TEXT, - ADD ATTRIBUTE type TEXT, - ADD ATTRIBUTE unreadCount BIGINT, - ADD ATTRIBUTE isArchived BOOLEAN, - ADD ATTRIBUTE isMuted BOOLEAN, - ADD ATTRIBUTE isPinned BOOLEAN, - ADD ATTRIBUTE lastActivity TIMESTAMP, - ADD ATTRIBUTE lastReadMessageSortKey TEXT, - ADD ATTRIBUTE localChatID TEXT, - ADD ATTRIBUTE preview beeper_desktop_api.message; +ALTER TYPE beeper_desktop_api_chats.chat_start_response_capability_state_title + ADD ATTRIBUTE level BIGINT; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response( - id TEXT, - accountID TEXT, - participants beeper_desktop_api_chats.chat_list_response_participant, - title TEXT, - type TEXT, - unreadCount BIGINT, - isArchived BOOLEAN DEFAULT NULL, - isMuted BOOLEAN DEFAULT NULL, - isPinned BOOLEAN DEFAULT NULL, - lastActivity TIMESTAMP DEFAULT NULL, - lastReadMessageSortKey TEXT DEFAULT NULL, - localChatID TEXT DEFAULT NULL, - preview beeper_desktop_api.message DEFAULT NULL +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_capability_state_title( + level BIGINT ) -RETURNS beeper_desktop_api_chats.chat_list_response +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state_title LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( - id, - accountID, - participants, - title, - type, - unreadCount, - isArchived, - isMuted, - isPinned, - lastActivity, - lastReadMessageSortKey, - localChatID, - preview - )::beeper_desktop_api_chats.chat_list_response; + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_title; $$; -ALTER TYPE beeper_desktop_api_chats.chat_list_response_participant - ADD ATTRIBUTE hasMore BOOLEAN, - ADD ATTRIBUTE items beeper_desktop_api.user[], - ADD ATTRIBUTE total BIGINT; +ALTER TYPE beeper_desktop_api_chats.chat_start_response_draft + ADD ATTRIBUTE text TEXT, ADD ATTRIBUTE attachments JSONB; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_list_response_participant( - hasMore BOOLEAN, items beeper_desktop_api.user[], total BIGINT +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_draft( + text TEXT, attachments JSONB DEFAULT NULL ) -RETURNS beeper_desktop_api_chats.chat_list_response_participant +RETURNS beeper_desktop_api_chats.chat_start_response_draft LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( - hasMore, items, total - )::beeper_desktop_api_chats.chat_list_response_participant; + text, attachments + )::beeper_desktop_api_chats.chat_start_response_draft; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_reminder + ADD ATTRIBUTE dismissOnIncomingMessage BOOLEAN, + ADD ATTRIBUTE remindAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_reminder( + dismissOnIncomingMessage BOOLEAN DEFAULT NULL, remindAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_reminder +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + dismissOnIncomingMessage, remindAt + )::beeper_desktop_api_chats.chat_start_response_reminder; +$$; + +ALTER TYPE beeper_desktop_api_chats.chat_start_response_snooze + ADD ATTRIBUTE snoozeUntil TIMESTAMP, ADD ATTRIBUTE userSnoozedAt TIMESTAMP; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response_snooze( + snoozeUntil TIMESTAMP DEFAULT NULL, userSnoozedAt TIMESTAMP DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_snooze +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + snoozeUntil, userSnoozedAt + )::beeper_desktop_api_chats.chat_start_response_snooze; +$$; + +ALTER TYPE beeper_desktop_api_chats.update_params_draft + ADD ATTRIBUTE text TEXT, ADD ATTRIBUTE attachments JSONB; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_update_params_draft( + text TEXT, attachments JSONB DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.update_params_draft +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(text, attachments)::beeper_desktop_api_chats.update_params_draft; $$; -ALTER TYPE beeper_desktop_api_chats.create_params_user +ALTER TYPE beeper_desktop_api_chats.start_params_user ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE email TEXT, ADD ATTRIBUTE fullName TEXT, ADD ATTRIBUTE phoneNumber TEXT, ADD ATTRIBUTE username TEXT; -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_user( +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_start_params_user( id TEXT DEFAULT NULL, email TEXT DEFAULT NULL, fullName TEXT DEFAULT NULL, phoneNumber TEXT DEFAULT NULL, username TEXT DEFAULT NULL ) -RETURNS beeper_desktop_api_chats.create_params_user +RETURNS beeper_desktop_api_chats.start_params_user LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( id, email, fullName, phoneNumber, username - )::beeper_desktop_api_chats.create_params_user; + )::beeper_desktop_api_chats.start_params_user; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._create( account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, + participant_ids TEXT[], + type TEXT, message_text TEXT DEFAULT NULL, - mode TEXT DEFAULT NULL, - participant_ids TEXT[] DEFAULT NULL, - title TEXT DEFAULT NULL, - type TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL + title TEXT DEFAULT NULL ) RETURNS JSONB LANGUAGE plpython3u @@ -182,13 +1751,10 @@ AS $$ response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.create( account_id=account_id, - allow_invite=not_given if allow_invite is None else allow_invite, + participant_ids=participant_ids, + type=type, message_text=not_given if message_text is None else message_text, - mode=not_given if mode is None else mode, - participant_ids=not_given if participant_ids is None else participant_ids, title=not_given if title is None else title, - type=not_given if type is None else type, - user=not_given if user is None else GD["__beeper_desktop_api_context__"].strip_none(user), ) # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted @@ -199,13 +1765,10 @@ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.create( account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, + participant_ids TEXT[], + type TEXT, message_text TEXT DEFAULT NULL, - mode TEXT DEFAULT NULL, - participant_ids TEXT[] DEFAULT NULL, - title TEXT DEFAULT NULL, - type TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_user DEFAULT NULL + title TEXT DEFAULT NULL ) RETURNS beeper_desktop_api_chats.chat_create_response LANGUAGE plpgsql @@ -215,14 +1778,7 @@ AS $$ RETURN jsonb_populate_record( NULL::beeper_desktop_api_chats.chat_create_response, beeper_desktop_api_chats._create( - account_id, - allow_invite, - message_text, - mode, - participant_ids, - title, - type, - "user" + account_id, participant_ids, type, message_text, title ) ); END; @@ -264,6 +1820,77 @@ AS $$ END; $$; +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._update( + chat_id TEXT, + description TEXT DEFAULT NULL, + draft beeper_desktop_api_chats.update_params_draft DEFAULT NULL, + img_url TEXT DEFAULT NULL, + is_archived BOOLEAN DEFAULT NULL, + is_low_priority BOOLEAN DEFAULT NULL, + is_muted BOOLEAN DEFAULT NULL, + is_pinned BOOLEAN DEFAULT NULL, + message_expiry_seconds BIGINT DEFAULT NULL, + title TEXT DEFAULT NULL +) +RETURNS JSONB +LANGUAGE plpython3u +AS $$ + from beeper_desktop_api._types import not_given + + response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.update( + chat_id=chat_id, + description=not_given if description is None else description, + draft=not_given if draft is None else GD["__beeper_desktop_api_context__"].strip_none(draft), + img_url=not_given if img_url is None else img_url, + is_archived=not_given if is_archived is None else is_archived, + is_low_priority=not_given if is_low_priority is None else is_low_priority, + is_muted=not_given if is_muted is None else is_muted, + is_pinned=not_given if is_pinned is None else is_pinned, + message_expiry_seconds=not_given if message_expiry_seconds is None else message_expiry_seconds, + title=not_given if title is None else title, + ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.update( + chat_id TEXT, + description TEXT DEFAULT NULL, + draft beeper_desktop_api_chats.update_params_draft DEFAULT NULL, + img_url TEXT DEFAULT NULL, + is_archived BOOLEAN DEFAULT NULL, + is_low_priority BOOLEAN DEFAULT NULL, + is_muted BOOLEAN DEFAULT NULL, + is_pinned BOOLEAN DEFAULT NULL, + message_expiry_seconds BIGINT DEFAULT NULL, + title TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat +LANGUAGE plpgsql +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + RETURN jsonb_populate_record( + NULL::beeper_desktop_api_chats.chat, + beeper_desktop_api_chats._update( + chat_id, + description, + draft, + img_url, + is_archived, + is_low_priority, + is_muted, + is_pinned, + message_expiry_seconds, + title + ) + ); + END; +$$; + CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._list_first_page_py( account_ids TEXT[] DEFAULT NULL, cursor TEXT DEFAULT NULL, @@ -406,6 +2033,101 @@ AS $$ END; $$; +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._mark_read( + chat_id TEXT, message_id TEXT DEFAULT NULL +) +RETURNS JSONB +LANGUAGE plpython3u +AS $$ + from beeper_desktop_api._types import not_given + + response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.mark_read( + chat_id=chat_id, + message_id=not_given if message_id is None else message_id, + ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.mark_read( + chat_id TEXT, message_id TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat +LANGUAGE plpgsql +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + RETURN jsonb_populate_record( + NULL::beeper_desktop_api_chats.chat, + beeper_desktop_api_chats._mark_read(chat_id, message_id) + ); + END; +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._mark_unread( + chat_id TEXT, message_id TEXT DEFAULT NULL +) +RETURNS JSONB +LANGUAGE plpython3u +AS $$ + from beeper_desktop_api._types import not_given + + response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.mark_unread( + chat_id=chat_id, + message_id=not_given if message_id is None else message_id, + ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.mark_unread( + chat_id TEXT, message_id TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat +LANGUAGE plpgsql +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + RETURN jsonb_populate_record( + NULL::beeper_desktop_api_chats.chat, + beeper_desktop_api_chats._mark_unread(chat_id, message_id) + ); + END; +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._notify_anyway(chat_id TEXT) +RETURNS JSONB +LANGUAGE plpython3u +AS $$ + response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.notify_anyway( + chat_id=chat_id, + ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.notify_anyway(chat_id TEXT) +RETURNS beeper_desktop_api_chats.chat +LANGUAGE plpgsql +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + RETURN jsonb_populate_record( + NULL::beeper_desktop_api_chats.chat, + beeper_desktop_api_chats._notify_anyway(chat_id) + ); + END; +$$; + CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._search_first_page_py( account_ids TEXT[] DEFAULT NULL, cursor TEXT DEFAULT NULL, @@ -578,4 +2300,48 @@ AS $$ WHERE paginated.next_request_options IS NOT NULL ) SELECT (jsonb_populate_recordset(NULL::beeper_desktop_api_chats.chat, data)).* FROM paginated; +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._start( + account_id TEXT, + "user" beeper_desktop_api_chats.start_params_user, + allow_invite BOOLEAN DEFAULT NULL, + message_text TEXT DEFAULT NULL +) +RETURNS JSONB +LANGUAGE plpython3u +AS $$ + from beeper_desktop_api._types import not_given + + response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.start( + account_id=account_id, + user=GD["__beeper_desktop_api_context__"].strip_none(user), + allow_invite=not_given if allow_invite is None else allow_invite, + message_text=not_given if message_text is None else message_text, + ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.start( + account_id TEXT, + "user" beeper_desktop_api_chats.start_params_user, + allow_invite BOOLEAN DEFAULT NULL, + message_text TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response +LANGUAGE plpgsql +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + RETURN jsonb_populate_record( + NULL::beeper_desktop_api_chats.chat_start_response, + beeper_desktop_api_chats._start( + account_id, "user", allow_invite, message_text + ) + ); + END; $$; \ No newline at end of file diff --git a/sql/beeper_desktop_api_chats_reminders.sql b/sql/beeper_desktop_api_chats_reminders.sql index b3dfea8..82568a8 100644 --- a/sql/beeper_desktop_api_chats_reminders.sql +++ b/sql/beeper_desktop_api_chats_reminders.sql @@ -1,16 +1,16 @@ ALTER TYPE beeper_desktop_api_chats_reminders.create_params_reminder - ADD ATTRIBUTE remindAtMs DOUBLE PRECISION, + ADD ATTRIBUTE remindAt TIMESTAMP, ADD ATTRIBUTE dismissOnIncomingMessage BOOLEAN; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats_reminders.make_create_params_reminder( - remindAtMs DOUBLE PRECISION, dismissOnIncomingMessage BOOLEAN DEFAULT NULL + remindAt TIMESTAMP, dismissOnIncomingMessage BOOLEAN DEFAULT NULL ) RETURNS beeper_desktop_api_chats_reminders.create_params_reminder LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( - remindAtMs, dismissOnIncomingMessage + remindAt, dismissOnIncomingMessage )::beeper_desktop_api_chats_reminders.create_params_reminder; $$; diff --git a/sql/beeper_desktop_api_messages.sql b/sql/beeper_desktop_api_messages.sql index 2eae195..70eace2 100644 --- a/sql/beeper_desktop_api_messages.sql +++ b/sql/beeper_desktop_api_messages.sql @@ -1,20 +1,151 @@ ALTER TYPE beeper_desktop_api_messages.message_update_response + ADD ATTRIBUTE id TEXT, + ADD ATTRIBUTE accountID TEXT, ADD ATTRIBUTE chatID TEXT, + ADD ATTRIBUTE senderID TEXT, + ADD ATTRIBUTE sortKey TEXT, + ADD ATTRIBUTE "timestamp" TIMESTAMP, ADD ATTRIBUTE messageID TEXT, - ADD ATTRIBUTE success BOOLEAN; + ADD ATTRIBUTE success BOOLEAN, + ADD ATTRIBUTE attachments beeper_desktop_api.attachment[], + ADD ATTRIBUTE editedTimestamp TIMESTAMP, + ADD ATTRIBUTE isDeleted BOOLEAN, + ADD ATTRIBUTE isHidden BOOLEAN, + ADD ATTRIBUTE isSender BOOLEAN, + ADD ATTRIBUTE isUnread BOOLEAN, + ADD ATTRIBUTE linkedMessageID TEXT, + ADD ATTRIBUTE links beeper_desktop_api_messages.message_update_response_link[], + ADD ATTRIBUTE mentions TEXT[], + ADD ATTRIBUTE reactions beeper_desktop_api.reaction[], + ADD ATTRIBUTE seen JSONB, + ADD ATTRIBUTE senderName TEXT, + ADD ATTRIBUTE sendStatus beeper_desktop_api_messages.message_update_response_send_status, + ADD ATTRIBUTE text TEXT, + ADD ATTRIBUTE type TEXT; CREATE OR REPLACE FUNCTION beeper_desktop_api_messages.make_message_update_response( - chatID TEXT, messageID TEXT, success BOOLEAN + id TEXT, + accountID TEXT, + chatID TEXT, + senderID TEXT, + sortKey TEXT, + "timestamp" TIMESTAMP, + messageID TEXT, + success BOOLEAN, + attachments beeper_desktop_api.attachment[] DEFAULT NULL, + editedTimestamp TIMESTAMP DEFAULT NULL, + isDeleted BOOLEAN DEFAULT NULL, + isHidden BOOLEAN DEFAULT NULL, + isSender BOOLEAN DEFAULT NULL, + isUnread BOOLEAN DEFAULT NULL, + linkedMessageID TEXT DEFAULT NULL, + links beeper_desktop_api_messages.message_update_response_link[] DEFAULT NULL, + mentions TEXT[] DEFAULT NULL, + reactions beeper_desktop_api.reaction[] DEFAULT NULL, + seen JSONB DEFAULT NULL, + senderName TEXT DEFAULT NULL, + sendStatus beeper_desktop_api_messages.message_update_response_send_status DEFAULT NULL, + text TEXT DEFAULT NULL, + type TEXT DEFAULT NULL ) RETURNS beeper_desktop_api_messages.message_update_response LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( - chatID, messageID, success + id, + accountID, + chatID, + senderID, + sortKey, + "timestamp", + messageID, + success, + attachments, + editedTimestamp, + isDeleted, + isHidden, + isSender, + isUnread, + linkedMessageID, + links, + mentions, + reactions, + seen, + senderName, + sendStatus, + text, + type )::beeper_desktop_api_messages.message_update_response; $$; +ALTER TYPE beeper_desktop_api_messages.message_update_response_link + ADD ATTRIBUTE title TEXT, + ADD ATTRIBUTE url TEXT, + ADD ATTRIBUTE favicon TEXT, + ADD ATTRIBUTE img TEXT, + ADD ATTRIBUTE imgSize beeper_desktop_api_messages.message_update_response_link_img_size, + ADD ATTRIBUTE originalURL TEXT, + ADD ATTRIBUTE summary TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_messages.make_message_update_response_link( + title TEXT, + url TEXT, + favicon TEXT DEFAULT NULL, + img TEXT DEFAULT NULL, + imgSize beeper_desktop_api_messages.message_update_response_link_img_size DEFAULT NULL, + originalURL TEXT DEFAULT NULL, + summary TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_messages.message_update_response_link +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + title, url, favicon, img, imgSize, originalURL, summary + )::beeper_desktop_api_messages.message_update_response_link; +$$; + +ALTER TYPE beeper_desktop_api_messages.message_update_response_link_img_size + ADD ATTRIBUTE height DOUBLE PRECISION, ADD ATTRIBUTE width DOUBLE PRECISION; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_messages.make_message_update_response_link_img_size( + height DOUBLE PRECISION DEFAULT NULL, width DOUBLE PRECISION DEFAULT NULL +) +RETURNS beeper_desktop_api_messages.message_update_response_link_img_size +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + height, width + )::beeper_desktop_api_messages.message_update_response_link_img_size; +$$; + +ALTER TYPE beeper_desktop_api_messages.message_update_response_send_status + ADD ATTRIBUTE status TEXT, + ADD ATTRIBUTE "timestamp" TIMESTAMP, + ADD ATTRIBUTE deliveredToUsers TEXT[], + ADD ATTRIBUTE internalError TEXT, + ADD ATTRIBUTE message TEXT, + ADD ATTRIBUTE reason TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_messages.make_message_update_response_send_status( + status TEXT, + "timestamp" TIMESTAMP, + deliveredToUsers TEXT[] DEFAULT NULL, + internalError TEXT DEFAULT NULL, + message TEXT DEFAULT NULL, + reason TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_messages.message_update_response_send_status +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + status, "timestamp", deliveredToUsers, internalError, message, reason + )::beeper_desktop_api_messages.message_update_response_send_status; +$$; + ALTER TYPE beeper_desktop_api_messages.message_send_response ADD ATTRIBUTE chatID TEXT, ADD ATTRIBUTE pendingMessageID TEXT; @@ -70,6 +201,40 @@ AS $$ )::beeper_desktop_api_messages.send_params_attachment_send_params_size; $$; +CREATE OR REPLACE FUNCTION beeper_desktop_api_messages._retrieve( + chat_id TEXT, message_id TEXT +) +RETURNS JSONB +LANGUAGE plpython3u +STABLE +AS $$ + response = GD["__beeper_desktop_api_context__"].client.messages.with_raw_response.retrieve( + chat_id=chat_id, + message_id=message_id, + ) + + # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted + # fields instead of defaulting them to NULL, but we want to be more lenient, which we handle in the + # caller later. + return response.text() +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_messages.retrieve( + chat_id TEXT, message_id TEXT +) +RETURNS beeper_desktop_api.message +LANGUAGE plpgsql +STABLE +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + RETURN jsonb_populate_record( + NULL::beeper_desktop_api.message, + beeper_desktop_api_messages._retrieve(chat_id, message_id) + ); + END; +$$; + CREATE OR REPLACE FUNCTION beeper_desktop_api_messages._update( chat_id TEXT, message_id TEXT, text TEXT ) @@ -161,14 +326,14 @@ STABLE AS $$ import json from beeper_desktop_api.types.shared import Message - from beeper_desktop_api.pagination import SyncCursorSortKey + from beeper_desktop_api.pagination import SyncCursorNoLimit from beeper_desktop_api._models import FinalRequestOptions from pydantic import TypeAdapter from typing import Any page = GD["__beeper_desktop_api_context__"].client._request_api_list( model=Message, - page=SyncCursorSortKey[Message], + page=SyncCursorNoLimit[Message], options=FinalRequestOptions.construct(**json.loads(request_options)) ) next_page_info = page.next_page_info() @@ -213,6 +378,35 @@ AS $$ SELECT (jsonb_populate_recordset(NULL::beeper_desktop_api.message, data)).* FROM paginated; $$; +CREATE OR REPLACE FUNCTION beeper_desktop_api_messages._delete( + chat_id TEXT, message_id TEXT, for_everyone BOOLEAN DEFAULT NULL +) +RETURNS VOID +LANGUAGE plpython3u +AS $$ + from beeper_desktop_api._types import not_given + + GD["__beeper_desktop_api_context__"].client.messages.delete( + chat_id=chat_id, + message_id=message_id, + for_everyone=not_given if for_everyone is None else for_everyone, + ) +$$; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_messages.delete( + chat_id TEXT, message_id TEXT, for_everyone BOOLEAN DEFAULT NULL +) +RETURNS VOID +LANGUAGE plpgsql +AS $$ + BEGIN + PERFORM beeper_desktop_api_internal.ensure_context(); + PERFORM beeper_desktop_api_messages._delete( + chat_id, message_id, for_everyone + ); + END; +$$; + CREATE OR REPLACE FUNCTION beeper_desktop_api_messages._search_first_page_py( account_ids TEXT[] DEFAULT NULL, chat_ids TEXT[] DEFAULT NULL, diff --git a/test/sql/beeper_desktop_api_accounts_contacts_test.sql b/test/sql/beeper_desktop_api_accounts_contacts_test.sql index 3a34024..dc90446 100644 --- a/test/sql/beeper_desktop_api_accounts_contacts_test.sql +++ b/test/sql/beeper_desktop_api_accounts_contacts_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_accounts_contacts.list(account_id := 'accountID') diff --git a/test/sql/beeper_desktop_api_accounts_test.sql b/test/sql/beeper_desktop_api_accounts_test.sql index bee634f..8d462e6 100644 --- a/test/sql/beeper_desktop_api_accounts_test.sql +++ b/test/sql/beeper_desktop_api_accounts_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_accounts.list(); \ No newline at end of file diff --git a/test/sql/beeper_desktop_api_assets_test.sql b/test/sql/beeper_desktop_api_assets_test.sql index b246c23..8d16905 100644 --- a/test/sql/beeper_desktop_api_assets_test.sql +++ b/test/sql/beeper_desktop_api_assets_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_assets.download( diff --git a/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql b/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql index d3f8bee..0d59ca0 100644 --- a/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql +++ b/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql @@ -1,16 +1,16 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_chats_messages_reactions.delete( chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com', - message_id := 'messageID', + message_id := '1343993', reaction_key := 'x' ); SELECT * FROM beeper_desktop_api_chats_messages_reactions.add( chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com', - message_id := 'messageID', + message_id := '1343993', reaction_key := 'x' ); \ No newline at end of file diff --git a/test/sql/beeper_desktop_api_chats_reminders_test.sql b/test/sql/beeper_desktop_api_chats_reminders_test.sql index db5873b..9e3d86e 100644 --- a/test/sql/beeper_desktop_api_chats_reminders_test.sql +++ b/test/sql/beeper_desktop_api_chats_reminders_test.sql @@ -1,11 +1,11 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_chats_reminders.create( chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com', reminder := beeper_desktop_api_chats_reminders.make_create_params_reminder( - remindAtMs := 0, dismissOnIncomingMessage := TRUE + remindAt := '2025-08-31T23:30:12.520Z', dismissOnIncomingMessage := TRUE ) ); diff --git a/test/sql/beeper_desktop_api_chats_test.sql b/test/sql/beeper_desktop_api_chats_test.sql index c46c02e..40b9700 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -1,14 +1,23 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * -FROM beeper_desktop_api_chats.create(account_id := 'accountID'); +FROM beeper_desktop_api_chats.create( + account_id := 'accountID', + participant_ids := ARRAY['string'], + type := 'single' +); SELECT * FROM beeper_desktop_api_chats.retrieve( chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com' ); +SELECT * +FROM beeper_desktop_api_chats.update( + chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com' +); + SELECT * FROM beeper_desktop_api_chats.list() LIMIT 42; @@ -18,6 +27,33 @@ FROM beeper_desktop_api_chats.archive( chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com' ); +SELECT * +FROM beeper_desktop_api_chats.mark_read( + chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com' +); + +SELECT * +FROM beeper_desktop_api_chats.mark_unread( + chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com' +); + +SELECT * +FROM beeper_desktop_api_chats.notify_anyway( + chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com' +); + SELECT * FROM beeper_desktop_api_chats.search() -LIMIT 42; \ No newline at end of file +LIMIT 42; + +SELECT * +FROM beeper_desktop_api_chats.start( + account_id := 'accountID', + "user" := beeper_desktop_api_chats.make_start_params_user( + id := 'id', + email := 'email', + fullName := 'fullName', + phoneNumber := 'phoneNumber', + username := 'username' + ) +); \ No newline at end of file diff --git a/test/sql/beeper_desktop_api_info_test.sql b/test/sql/beeper_desktop_api_info_test.sql index 5598e10..e37887f 100644 --- a/test/sql/beeper_desktop_api_info_test.sql +++ b/test/sql/beeper_desktop_api_info_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api_info.retrieve(); \ No newline at end of file diff --git a/test/sql/beeper_desktop_api_messages_test.sql b/test/sql/beeper_desktop_api_messages_test.sql index 0872843..d4e3d11 100644 --- a/test/sql/beeper_desktop_api_messages_test.sql +++ b/test/sql/beeper_desktop_api_messages_test.sql @@ -1,10 +1,15 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; + +SELECT * +FROM beeper_desktop_api_messages.retrieve( + chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com', message_id := '1343993' +); SELECT * FROM beeper_desktop_api_messages.update( chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com', - message_id := 'messageID', + message_id := '1343993', text := 'x' ); @@ -14,6 +19,11 @@ FROM beeper_desktop_api_messages.list( ) LIMIT 42; +SELECT * +FROM beeper_desktop_api_messages.delete( + chat_id := '!NCdzlIaMjZUmvmvyHU:beeper.com', message_id := '1343993' +); + SELECT * FROM beeper_desktop_api_messages.search() LIMIT 42; diff --git a/test/sql/beeper_desktop_api_test.sql b/test/sql/beeper_desktop_api_test.sql index ddb5b54..05b90fb 100644 --- a/test/sql/beeper_desktop_api_test.sql +++ b/test/sql/beeper_desktop_api_test.sql @@ -1,5 +1,5 @@ SET datestyle = 'ISO'; -SET beeper_desktop_api.beeper_access_token = 'My Access Token'; +SET beeper_desktop_api.access_token = 'My Access Token'; SELECT * FROM beeper_desktop_api.focus(); diff --git a/uv.lock b/uv.lock index 3e068d8..3b6dfce 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "0.0.1" +version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" },