From 91994fa8b9e406c674d5245f2da123608e87046b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 03:07:49 +0000 Subject: [PATCH 01/29] chore(internal): codegen related update --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 3e068d8..99ade34 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "0.0.1" +version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, From 2db5518d6ac525ccd1d753e271f6adcde42398bf Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 17 Mar 2026 03:38:40 +0000 Subject: [PATCH 02/29] chore(internal): tweak CI branches --- .github/workflows/ci.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) 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/**' From d84f8a50545721a86b7ea48a8af34bd588961c54 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 02:31:17 +0000 Subject: [PATCH 03/29] docs: explain caching --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index 0544b3f..e2d467b 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,27 @@ 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['local-telegram_ba_QFrb5lrLPhO3OT5MFBeTWv0x4BI'], + "limit" := 10, + query := 'deployment' +); + +-- 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 From 9183ad1d77206204a8650471616d1f97b817f024 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 18 Mar 2026 02:44:59 +0000 Subject: [PATCH 04/29] chore(internal): support env vars in `./scripts/repl` --- scripts/repl | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/scripts/repl b/scripts/repl index 21d1eab..679bf51 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.beeper_access_token = :value;' +if [ -n "$BEEPER_DESKTOP_BASE_URL" ]; then + psql -d postgres --variable "value='$BEEPER_DESKTOP_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 From ca3c264cee5d12947269f7fc6f919eb8db071c9b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 20 Mar 2026 02:09:59 +0000 Subject: [PATCH 05/29] refactor(tests): switch from prism to steady --- scripts/mock | 26 +++++++++++++------------- scripts/test | 16 ++++++++-------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/scripts/mock b/scripts/mock index bcf3b39..00b490b 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.19.3 -- steady --version - npm exec --package=@stainless-api/prism-cli@5.15.0 -- prism mock "$URL" &> .prism.log & + npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-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.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 8b23b9c..3e62240 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.19.3 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-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 From fe76f5e4d60950521215581557cd0453720d7a71 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2026 02:11:15 +0000 Subject: [PATCH 06/29] chore(tests): bump steady to v0.19.4 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 00b490b..f310477 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # 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=@stdy/cli@0.19.3 -- steady --version + npm exec --package=@stdy/cli@0.19.4 -- steady --version - npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.3 -- steady --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 3e62240..18b5b0f 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.3 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-query-array-format=repeat --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.4 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From 71cbd2c8566c6c466557c8ee7209f6710687cf1a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 21 Mar 2026 02:18:35 +0000 Subject: [PATCH 07/29] chore(tests): bump steady to v0.19.5 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index f310477..54fc791 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # 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=@stdy/cli@0.19.4 -- steady --version + npm exec --package=@stdy/cli@0.19.5 -- steady --version - npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.4 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 18b5b0f..d958b6d 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.4 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.5 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From 998e1de2a033f9cb44326e681eadc5cbd25d862b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 02:09:45 +0000 Subject: [PATCH 08/29] chore(internal): update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) 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/ From 827b6a2c9d2f7db42f469a86f207318e1441a46a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 02:16:44 +0000 Subject: [PATCH 09/29] chore(tests): bump steady to v0.19.6 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 54fc791..0f82c95 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # 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=@stdy/cli@0.19.5 -- steady --version + npm exec --package=@stdy/cli@0.19.6 -- steady --version - npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.5 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index d958b6d..455f0ac 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.5 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.6 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From be70621335ade7130eedb59982ff75f36c3ce75a Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:06:09 +0000 Subject: [PATCH 10/29] chore(tests): bump steady to v0.19.7 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 0f82c95..3732f8e 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # 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=@stdy/cli@0.19.6 -- steady --version + npm exec --package=@stdy/cli@0.19.7 -- steady --version - npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & # Wait for server to come online via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.6 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" fi diff --git a/scripts/test b/scripts/test index 455f0ac..b14f997 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.6 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" echo exit 1 From 71dc9866112525943eb11a430cf2505236cc3f46 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:25:12 +0000 Subject: [PATCH 11/29] chore: update SDK settings --- .stats.yml | 2 +- README.md | 4 ++-- pyproject.toml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2b39be6..60bb453 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 +config_hash: e342a96262eaf44c54e8bbb93cc8d7a7 diff --git a/README.md b/README.md index e2d467b..edcfb1d 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,8 @@ CREATE EXTENSION beeper_desktop_api; And install the Python SDK dependency: ```sh -# install from the production repo -pip install git+ssh://git@github.com/beeper/desktop-api-python.git +# install from PyPI +pip install beeper_desktop_api ``` See [`./scripts/test`](./scripts/test) how to use a [Python virtual environment](https://docs.python.org/3/library/sys_path_init.html#sys-path-init-virtual-environments) if you prefer that instead. diff --git a/pyproject.toml b/pyproject.toml index 274d004..026d2f1 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,5 +3,5 @@ name = "beeper_desktop_api-sql" version = "0.0.0" requires-python = ">=3.9.18" dependencies = [ - "beeper_desktop_api @ https://github.com/beeper/desktop-api-python.git", + "beeper_desktop_api", ] \ No newline at end of file From 0a9073f46d93db4a40065df2d4dbe7251e904619 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:26:04 +0000 Subject: [PATCH 12/29] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 60bb453..16d5bba 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: e342a96262eaf44c54e8bbb93cc8d7a7 +config_hash: f99f904573839260bdb6d428bad17613 From 2d3e14836a55109b02bc1ee46ce0a62cfd37c865 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 25 Mar 2026 02:26:32 +0000 Subject: [PATCH 13/29] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index 16d5bba..2c47924 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: f99f904573839260bdb6d428bad17613 +config_hash: 7d85c0b454fc78a59db6474c5c4d73c6 From 0af81d8b40c42ae06bac4d2ee9d9bcf5fb887641 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 27 Mar 2026 02:09:47 +0000 Subject: [PATCH 14/29] chore(internal): update multipart form array serialization --- scripts/mock | 4 ++-- scripts/test | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/mock b/scripts/mock index 3732f8e..58e4628 100755 --- a/scripts/mock +++ b/scripts/mock @@ -24,7 +24,7 @@ if [ "$1" == "--daemon" ]; then # Pre-install the package so the download doesn't eat into the startup timeout npm exec --package=@stdy/cli@0.19.7 -- steady --version - npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" &> .stdy.log & + npm exec --package=@stdy/cli@0.19.7 -- 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 via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.7 -- steady --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets "$URL" + npm exec --package=@stdy/cli@0.19.7 -- 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/test b/scripts/test index b14f997..be740ad 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- steady path/to/your.openapi.yml --host 127.0.0.1 -p 4010 --validator-form-array-format=repeat --validator-query-array-format=repeat --validator-form-object-format=brackets --validator-query-object-format=brackets${NC}" + echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- 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 From 1c1334345f7df0ab235018431f6f64026db45332 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 02:18:10 +0000 Subject: [PATCH 15/29] chore(tests): bump steady to v0.20.1 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 58e4628..5ea72a2 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # 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=@stdy/cli@0.19.7 -- steady --version + npm exec --package=@stdy/cli@0.20.1 -- steady --version - npm exec --package=@stdy/cli@0.19.7 -- 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 & + npm exec --package=@stdy/cli@0.20.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 via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.19.7 -- 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" + npm exec --package=@stdy/cli@0.20.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/test b/scripts/test index be740ad..d6a8909 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.19.7 -- 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 -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.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 From 60ca0242076c462be6e9da54a39b1138a56b9732 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 1 Apr 2026 02:22:43 +0000 Subject: [PATCH 16/29] chore(tests): bump steady to v0.20.2 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 5ea72a2..7c58865 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # 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=@stdy/cli@0.20.1 -- steady --version + npm exec --package=@stdy/cli@0.20.2 -- steady --version - npm exec --package=@stdy/cli@0.20.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 & + npm exec --package=@stdy/cli@0.20.2 -- 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 via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.20.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" + npm exec --package=@stdy/cli@0.20.2 -- 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/test b/scripts/test index d6a8909..6524d14 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.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 -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.2 -- 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 From 41e28294a7fcad3839ea2d3c5c3b48061774776f Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sun, 12 Apr 2026 18:32:00 +0000 Subject: [PATCH 17/29] feat(api): add network, bridge fields to accounts --- .stats.yml | 6 +- META.json | 1 - README.md | 16 ++--- pyproject.toml | 2 +- sql/_beeper_desktop_api.sql | 4 +- sql/beeper_desktop_api_accounts.sql | 27 ++++++- sql/beeper_desktop_api_chats.sql | 82 ++++++++++++---------- test/sql/beeper_desktop_api_chats_test.sql | 2 +- 8 files changed, 81 insertions(+), 59 deletions(-) diff --git a/.stats.yml b/.stats.yml index 2c47924..229f6b5 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: 7d85c0b454fc78a59db6474c5c4d73c6 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper%2Fbeeper-desktop-api-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml +openapi_spec_hash: d6c0a1776048dab04f6c5625c9893c9c +config_hash: 39ed0717b5f415499aaace2468346e1a 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 edcfb1d..24848ab 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 @@ -39,8 +37,8 @@ CREATE EXTENSION beeper_desktop_api; And install the Python SDK dependency: ```sh -# install from PyPI -pip install beeper_desktop_api +# install from the production repo +pip install git+ssh://git@github.com/beeper/desktop-api-python.git ``` See [`./scripts/test`](./scripts/test) how to use a [Python virtual environment](https://docs.python.org/3/library/sys_path_init.html#sys-path-init-virtual-environments) if you prefer that instead. @@ -89,15 +87,11 @@ See this table for the available configuration parameters: 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_reminders.create_params_reminder` 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_reminders.make_create_params_reminder( + remindAtMs := 0, dismissOnIncomingMessage := TRUE ) ``` diff --git a/pyproject.toml b/pyproject.toml index 026d2f1..274d004 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,5 +3,5 @@ name = "beeper_desktop_api-sql" version = "0.0.0" requires-python = ">=3.9.18" dependencies = [ - "beeper_desktop_api", + "beeper_desktop_api @ https://github.com/beeper/desktop-api-python.git", ] \ No newline at end of file diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index 1e703eb..57b523f 100644 --- a/sql/_beeper_desktop_api.sql +++ b/sql/_beeper_desktop_api.sql @@ -122,6 +122,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; @@ -134,7 +135,8 @@ CREATE TYPE beeper_desktop_api_chats.chat_participant AS (); CREATE TYPE beeper_desktop_api_chats.chat_create_response 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.create_params_param AS (); +CREATE TYPE beeper_desktop_api_chats.create_params_param_create_params_user AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats_reminders; diff --git a/sql/beeper_desktop_api_accounts.sql b/sql/beeper_desktop_api_accounts.sql index 34100ee..de30423 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 network TEXT, + ADD ATTRIBUTE "user" beeper_desktop_api.user; 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, + network TEXT, + "user" beeper_desktop_api.user ) RETURNS beeper_desktop_api_accounts.account LANGUAGE SQL IMMUTABLE AS $$ - SELECT ROW(accountID, "user")::beeper_desktop_api_accounts.account; + SELECT ROW( + accountID, bridge, network, "user" + )::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_chats.sql b/sql/beeper_desktop_api_chats.sql index f7e06b8..adafbbc 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -142,38 +142,67 @@ AS $$ )::beeper_desktop_api_chats.chat_list_response_participant; $$; -ALTER TYPE beeper_desktop_api_chats.create_params_user +ALTER TYPE beeper_desktop_api_chats.create_params_param + ADD ATTRIBUTE accountID TEXT, + ADD ATTRIBUTE mode TEXT, + ADD ATTRIBUTE "user" beeper_desktop_api_chats.create_params_param_create_params_user, + ADD ATTRIBUTE allowInvite BOOLEAN, + ADD ATTRIBUTE messageText TEXT, + ADD ATTRIBUTE participantIDs TEXT[], + ADD ATTRIBUTE type TEXT, + ADD ATTRIBUTE title TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_param( + accountID TEXT, + mode TEXT DEFAULT NULL, + "user" beeper_desktop_api_chats.create_params_param_create_params_user DEFAULT NULL, + allowInvite BOOLEAN DEFAULT NULL, + messageText TEXT DEFAULT NULL, + participantIDs TEXT[] DEFAULT NULL, + type TEXT DEFAULT NULL, + title TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.create_params_param +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + accountID, + mode, + "user", + allowInvite, + messageText, + participantIDs, + type, + title + )::beeper_desktop_api_chats.create_params_param; +$$; + +ALTER TYPE beeper_desktop_api_chats.create_params_param_create_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_create_params_param_create_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.create_params_param_create_params_user LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( id, email, fullName, phoneNumber, username - )::beeper_desktop_api_chats.create_params_user; + )::beeper_desktop_api_chats.create_params_param_create_params_user; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._create( - account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, - 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 + params beeper_desktop_api_chats.create_params_param DEFAULT NULL ) RETURNS JSONB LANGUAGE plpython3u @@ -181,14 +210,7 @@ AS $$ from beeper_desktop_api._types import not_given 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, - 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), + params=not_given if params is None else GD["__beeper_desktop_api_context__"].strip_none(params), ) # We don't parse the JSON and let PL/Python perform data mapping because PL/Python errors for omitted @@ -198,14 +220,7 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.create( - account_id TEXT, - allow_invite BOOLEAN DEFAULT NULL, - 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 + params beeper_desktop_api_chats.create_params_param DEFAULT NULL ) RETURNS beeper_desktop_api_chats.chat_create_response LANGUAGE plpgsql @@ -214,16 +229,7 @@ AS $$ PERFORM beeper_desktop_api_internal.ensure_context(); 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" - ) + beeper_desktop_api_chats._create(params) ); END; $$; diff --git a/test/sql/beeper_desktop_api_chats_test.sql b/test/sql/beeper_desktop_api_chats_test.sql index c46c02e..6f1a5cd 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -2,7 +2,7 @@ SET datestyle = 'ISO'; SET beeper_desktop_api.beeper_access_token = 'My Access Token'; SELECT * -FROM beeper_desktop_api_chats.create(account_id := 'accountID'); +FROM beeper_desktop_api_chats.create(); SELECT * FROM beeper_desktop_api_chats.retrieve( From ad561c97cdcae8a56ac67bd285e4a4c74f34ac09 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Sat, 18 Apr 2026 02:34:50 +0000 Subject: [PATCH 18/29] chore(tests): bump steady to v0.22.1 --- scripts/mock | 6 +++--- scripts/test | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/mock b/scripts/mock index 7c58865..9c7c439 100755 --- a/scripts/mock +++ b/scripts/mock @@ -22,9 +22,9 @@ echo "==> Starting mock server with URL ${URL}" # 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=@stdy/cli@0.20.2 -- steady --version + npm exec --package=@stdy/cli@0.22.1 -- steady --version - npm exec --package=@stdy/cli@0.20.2 -- 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 & + 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 via health endpoint (max 30s) echo -n "Waiting for server" @@ -48,5 +48,5 @@ if [ "$1" == "--daemon" ]; then echo else - npm exec --package=@stdy/cli@0.20.2 -- 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" + 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/test b/scripts/test index 6524d14..dc681e7 100755 --- a/scripts/test +++ b/scripts/test @@ -43,7 +43,7 @@ elif ! steady_is_running ; then echo -e "To run the server, pass in the path or url of your OpenAPI" echo -e "spec to the steady command:" echo - echo -e " \$ ${YELLOW}npm exec --package=@stdy/cli@0.20.2 -- 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 -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 From d1ebc75c6cdaf3421824fc57f4ec85cba613c944 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Tue, 28 Apr 2026 02:07:58 +0000 Subject: [PATCH 19/29] feat: support setting headers via env --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 99ade34..3e068d8 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "4.3.0" +version = "0.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, From 836fc2121e4d8bdc5116b39acac969c20a4af775 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 03:57:52 +0000 Subject: [PATCH 20/29] chore(internal): codegen related update --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 3e068d8..99ade34 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "0.0.1" +version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, From b6260e27f503eb7256fd805a5bc6dc5ee66a2fac Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 19:51:00 +0000 Subject: [PATCH 21/29] Update Desktop API Stainless config and OpenAPI spec --- .stats.yml | 4 +- README.md | 22 +++-- scripts/repl | 6 +- sql/_beeper_desktop_api.sql | 9 +- sql/beeper_desktop_api_accounts.sql | 10 +-- sql/beeper_desktop_api_assets.sql | 15 +++- sql/beeper_desktop_api_chats.sql | 82 +++++++++---------- sql/beeper_desktop_api_messages.sql | 4 +- ...per_desktop_api_accounts_contacts_test.sql | 2 +- test/sql/beeper_desktop_api_accounts_test.sql | 2 +- test/sql/beeper_desktop_api_assets_test.sql | 2 +- ...ktop_api_chats_messages_reactions_test.sql | 2 +- ...eeper_desktop_api_chats_reminders_test.sql | 2 +- test/sql/beeper_desktop_api_chats_test.sql | 4 +- test/sql/beeper_desktop_api_info_test.sql | 2 +- test/sql/beeper_desktop_api_messages_test.sql | 2 +- test/sql/beeper_desktop_api_test.sql | 2 +- 17 files changed, 88 insertions(+), 84 deletions(-) diff --git a/.stats.yml b/.stats.yml index 229f6b5..e925f68 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-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml -openapi_spec_hash: d6c0a1776048dab04f6c5625c9893c9c -config_hash: 39ed0717b5f415499aaace2468346e1a +openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef +config_hash: 05ebdec072113f63395372504da98192 diff --git a/README.md b/README.md index 24848ab..faa6bc0 100644 --- a/README.md +++ b/README.md @@ -68,30 +68,34 @@ 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_reminders.create_params_reminder` 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.create_params_user` may be constructed like so: ```sql -beeper_desktop_api_chats_reminders.make_create_params_reminder( - remindAtMs := 0, dismissOnIncomingMessage := TRUE +beeper_desktop_api_chats.make_create_params_user( + id := 'id', + email := 'email', + fullName := 'fullName', + phoneNumber := 'phoneNumber', + username := 'username' ) ``` diff --git a/scripts/repl b/scripts/repl index 679bf51..30588b5 100755 --- a/scripts/repl +++ b/scripts/repl @@ -66,9 +66,9 @@ 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.beeper_access_token = :value;' -if [ -n "$BEEPER_DESKTOP_BASE_URL" ]; then - psql -d postgres --variable "value='$BEEPER_DESKTOP_BASE_URL'" -c 'ALTER DATABASE postgres SET beeper_desktop_api.base_url = :value;' +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 diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index 57b523f..545b6c6 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): @@ -135,8 +135,7 @@ CREATE TYPE beeper_desktop_api_chats.chat_participant AS (); CREATE TYPE beeper_desktop_api_chats.chat_create_response 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_param AS (); -CREATE TYPE beeper_desktop_api_chats.create_params_param_create_params_user AS (); +CREATE TYPE beeper_desktop_api_chats.create_params_user AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats_reminders; diff --git a/sql/beeper_desktop_api_accounts.sql b/sql/beeper_desktop_api_accounts.sql index de30423..5dc05ec 100644 --- a/sql/beeper_desktop_api_accounts.sql +++ b/sql/beeper_desktop_api_accounts.sql @@ -1,21 +1,21 @@ ALTER TYPE beeper_desktop_api_accounts.account ADD ATTRIBUTE accountID TEXT, ADD ATTRIBUTE bridge beeper_desktop_api_accounts.account_bridge, - ADD ATTRIBUTE network TEXT, - ADD ATTRIBUTE "user" beeper_desktop_api.user; + ADD ATTRIBUTE "user" beeper_desktop_api.user, + ADD ATTRIBUTE network TEXT; CREATE OR REPLACE FUNCTION beeper_desktop_api_accounts.make_account( accountID TEXT, bridge beeper_desktop_api_accounts.account_bridge, - network TEXT, - "user" beeper_desktop_api.user + "user" beeper_desktop_api.user, + network TEXT DEFAULT NULL ) RETURNS beeper_desktop_api_accounts.account LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( - accountID, bridge, network, "user" + accountID, bridge, "user", network )::beeper_desktop_api_accounts.account; $$; 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 adafbbc..f7e06b8 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -142,67 +142,38 @@ AS $$ )::beeper_desktop_api_chats.chat_list_response_participant; $$; -ALTER TYPE beeper_desktop_api_chats.create_params_param - ADD ATTRIBUTE accountID TEXT, - ADD ATTRIBUTE mode TEXT, - ADD ATTRIBUTE "user" beeper_desktop_api_chats.create_params_param_create_params_user, - ADD ATTRIBUTE allowInvite BOOLEAN, - ADD ATTRIBUTE messageText TEXT, - ADD ATTRIBUTE participantIDs TEXT[], - ADD ATTRIBUTE type TEXT, - ADD ATTRIBUTE title TEXT; - -CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_params_param( - accountID TEXT, - mode TEXT DEFAULT NULL, - "user" beeper_desktop_api_chats.create_params_param_create_params_user DEFAULT NULL, - allowInvite BOOLEAN DEFAULT NULL, - messageText TEXT DEFAULT NULL, - participantIDs TEXT[] DEFAULT NULL, - type TEXT DEFAULT NULL, - title TEXT DEFAULT NULL -) -RETURNS beeper_desktop_api_chats.create_params_param -LANGUAGE SQL -IMMUTABLE -AS $$ - SELECT ROW( - accountID, - mode, - "user", - allowInvite, - messageText, - participantIDs, - type, - title - )::beeper_desktop_api_chats.create_params_param; -$$; - -ALTER TYPE beeper_desktop_api_chats.create_params_param_create_params_user +ALTER TYPE beeper_desktop_api_chats.create_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_param_create_params_user( +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_create_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_param_create_params_user +RETURNS beeper_desktop_api_chats.create_params_user LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( id, email, fullName, phoneNumber, username - )::beeper_desktop_api_chats.create_params_param_create_params_user; + )::beeper_desktop_api_chats.create_params_user; $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats._create( - params beeper_desktop_api_chats.create_params_param DEFAULT NULL + account_id TEXT, + allow_invite BOOLEAN DEFAULT NULL, + 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 ) RETURNS JSONB LANGUAGE plpython3u @@ -210,7 +181,14 @@ AS $$ from beeper_desktop_api._types import not_given response = GD["__beeper_desktop_api_context__"].client.chats.with_raw_response.create( - params=not_given if params is None else GD["__beeper_desktop_api_context__"].strip_none(params), + account_id=account_id, + allow_invite=not_given if allow_invite is None else allow_invite, + 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 @@ -220,7 +198,14 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.create( - params beeper_desktop_api_chats.create_params_param DEFAULT NULL + account_id TEXT, + allow_invite BOOLEAN DEFAULT NULL, + 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 ) RETURNS beeper_desktop_api_chats.chat_create_response LANGUAGE plpgsql @@ -229,7 +214,16 @@ AS $$ PERFORM beeper_desktop_api_internal.ensure_context(); RETURN jsonb_populate_record( NULL::beeper_desktop_api_chats.chat_create_response, - beeper_desktop_api_chats._create(params) + beeper_desktop_api_chats._create( + account_id, + allow_invite, + message_text, + mode, + participant_ids, + title, + type, + "user" + ) ); END; $$; diff --git a/sql/beeper_desktop_api_messages.sql b/sql/beeper_desktop_api_messages.sql index 2eae195..36741e6 100644 --- a/sql/beeper_desktop_api_messages.sql +++ b/sql/beeper_desktop_api_messages.sql @@ -161,14 +161,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() 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..ce1b811 100644 --- a/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql +++ b/test/sql/beeper_desktop_api_chats_messages_reactions_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_chats_messages_reactions.delete( diff --git a/test/sql/beeper_desktop_api_chats_reminders_test.sql b/test/sql/beeper_desktop_api_chats_reminders_test.sql index db5873b..8a93e16 100644 --- a/test/sql/beeper_desktop_api_chats_reminders_test.sql +++ b/test/sql/beeper_desktop_api_chats_reminders_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_chats_reminders.create( diff --git a/test/sql/beeper_desktop_api_chats_test.sql b/test/sql/beeper_desktop_api_chats_test.sql index 6f1a5cd..93240c0 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -1,8 +1,8 @@ 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(); +FROM beeper_desktop_api_chats.create(account_id := 'accountID'); SELECT * FROM beeper_desktop_api_chats.retrieve( 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..a574bd7 100644 --- a/test/sql/beeper_desktop_api_messages_test.sql +++ b/test/sql/beeper_desktop_api_messages_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_messages.update( 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(); From 3311a3305591ddad1399cecc7bd133ba8a4fff4b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 19:53:39 +0000 Subject: [PATCH 22/29] Preserve asset serve SDK compatibility --- .stats.yml | 2 +- sql/beeper_desktop_api_assets.sql | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/.stats.yml b/.stats.yml index e925f68..1d3cc36 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-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml -openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef +openapi_spec_hash: 8dff13848934c5b20f3804236e8286d3 config_hash: 05ebdec072113f63395372504da98192 diff --git a/sql/beeper_desktop_api_assets.sql b/sql/beeper_desktop_api_assets.sql index 8ed4508..3e5ed45 100644 --- a/sql/beeper_desktop_api_assets.sql +++ b/sql/beeper_desktop_api_assets.sql @@ -117,30 +117,23 @@ AS $$ $$; CREATE OR REPLACE FUNCTION beeper_desktop_api_assets._serve(url TEXT) -RETURNS JSONB +RETURNS VOID LANGUAGE plpython3u STABLE AS $$ - response = GD["__beeper_desktop_api_context__"].client.assets.with_raw_response.serve( + GD["__beeper_desktop_api_context__"].client.assets.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 BYTEA +RETURNS VOID LANGUAGE plpgsql STABLE AS $$ BEGIN PERFORM beeper_desktop_api_internal.ensure_context(); - RETURN jsonb_populate_record( - NULL::BYTEA, beeper_desktop_api_assets._serve(url) - ); + PERFORM beeper_desktop_api_assets._serve(url); END; $$; From 1f3f4e58f085c06bb6fc9bcf56399f2abf4a3fcd Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 29 Apr 2026 19:54:43 +0000 Subject: [PATCH 23/29] Document asset serve stream response --- .stats.yml | 2 +- sql/beeper_desktop_api_assets.sql | 15 +++++++++++---- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/.stats.yml b/.stats.yml index 1d3cc36..e925f68 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-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml -openapi_spec_hash: 8dff13848934c5b20f3804236e8286d3 +openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef config_hash: 05ebdec072113f63395372504da98192 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; $$; From c6ba28fad09ca00c1237fa811443eefe664fa342 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 07:53:10 +0000 Subject: [PATCH 24/29] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index e925f68..a2edbe5 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-611aa7641fbca8cf31d626bf86f9efd3c2b92778e897ebbb25c6ea44185ed1ed.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-fdefa92da44ff91a34438591d022c182a83d9daf9a28b452556e325c6ef7b3f0.yml openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef config_hash: 05ebdec072113f63395372504da98192 From d60a4234aee7bea142a7dac097b93ebf3315b1cc Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Fri, 1 May 2026 03:39:01 +0000 Subject: [PATCH 25/29] codegen metadata --- .stats.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.stats.yml b/.stats.yml index a2edbe5..ec75571 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/beeper-desktop-api-fdefa92da44ff91a34438591d022c182a83d9daf9a28b452556e325c6ef7b3f0.yml +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-356444646dafe352d3ef7c2e01aedf030197a5519b41cf2c3fd8be2571456b43.yml openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef config_hash: 05ebdec072113f63395372504da98192 From 673f0a1de2c331b41c8093c7bf7edcd908b3bcb0 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Mon, 4 May 2026 18:07:15 +0000 Subject: [PATCH 26/29] feat(api): api update --- .stats.yml | 8 +- README.md | 4 +- sql/_beeper_desktop_api.sql | 3 +- sql/beeper_desktop_api_chats.sql | 99 +++++++++++++++------- test/sql/beeper_desktop_api_chats_test.sql | 20 ++++- 5 files changed, 96 insertions(+), 38 deletions(-) diff --git a/.stats.yml b/.stats.yml index ec75571..75ad795 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/beeper-desktop-api-356444646dafe352d3ef7c2e01aedf030197a5519b41cf2c3fd8be2571456b43.yml -openapi_spec_hash: 4840f003552e8b48eb8e689b59a819ef -config_hash: 05ebdec072113f63395372504da98192 +configured_endpoints: 24 +openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-8b89ffbfeb39b4186328fefd81f7dab1d28c786012201feb8035c7f920c4fbae.yml +openapi_spec_hash: de40e013fcc83fa44d5c51ddecb543c0 +config_hash: 08b781db5f1857ed601d1b2f4b6b45d9 diff --git a/README.md b/README.md index faa6bc0..d072a4a 100644 --- a/README.md +++ b/README.md @@ -87,10 +87,10 @@ See this table for the available configuration parameters: 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.start_params_user` may be constructed like so: ```sql -beeper_desktop_api_chats.make_create_params_user( +beeper_desktop_api_chats.make_start_params_user( id := 'id', email := 'email', fullName := 'fullName', diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index 545b6c6..adcbe27 100644 --- a/sql/_beeper_desktop_api.sql +++ b/sql/_beeper_desktop_api.sql @@ -135,7 +135,8 @@ CREATE TYPE beeper_desktop_api_chats.chat_participant AS (); CREATE TYPE beeper_desktop_api_chats.chat_create_response 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_start_response AS (); +CREATE TYPE beeper_desktop_api_chats.start_params_user AS (); CREATE SCHEMA IF NOT EXISTS beeper_desktop_api_chats_reminders; diff --git a/sql/beeper_desktop_api_chats.sql b/sql/beeper_desktop_api_chats.sql index f7e06b8..71cd535 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -142,38 +142,48 @@ AS $$ )::beeper_desktop_api_chats.chat_list_response_participant; $$; -ALTER TYPE beeper_desktop_api_chats.create_params_user +ALTER TYPE beeper_desktop_api_chats.chat_start_response + ADD ATTRIBUTE chatID TEXT, ADD ATTRIBUTE status TEXT; + +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response( + chatID TEXT, status TEXT DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW(chatID, status)::beeper_desktop_api_chats.chat_start_response; +$$; + +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 +192,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 +206,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 +219,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; @@ -578,4 +575,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/test/sql/beeper_desktop_api_chats_test.sql b/test/sql/beeper_desktop_api_chats_test.sql index 93240c0..cfcfe53 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -2,7 +2,11 @@ SET datestyle = 'ISO'; 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( @@ -20,4 +24,16 @@ FROM beeper_desktop_api_chats.archive( 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 From 21cafde63f92786cb87ff52ed169ab3590dfae1b Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Wed, 6 May 2026 21:17:56 +0000 Subject: [PATCH 27/29] feat(api): api update --- .stats.yml | 8 +- README.md | 45 +- sql/_beeper_desktop_api.sql | 62 + sql/beeper_desktop_api.sql | 112 +- sql/beeper_desktop_api_chats.sql | 1801 ++++++++++++++++- sql/beeper_desktop_api_chats_reminders.sql | 6 +- sql/beeper_desktop_api_messages.sql | 200 +- ...ktop_api_chats_messages_reactions_test.sql | 4 +- ...eeper_desktop_api_chats_reminders_test.sql | 2 +- test/sql/beeper_desktop_api_chats_test.sql | 20 + test/sql/beeper_desktop_api_messages_test.sql | 12 +- 11 files changed, 2205 insertions(+), 67 deletions(-) diff --git a/.stats.yml b/.stats.yml index 75ad795..2dd3fee 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1,4 +1,4 @@ -configured_endpoints: 24 -openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-8b89ffbfeb39b4186328fefd81f7dab1d28c786012201feb8035c7f920c4fbae.yml -openapi_spec_hash: de40e013fcc83fa44d5c51ddecb543c0 -config_hash: 08b781db5f1857ed601d1b2f4b6b45d9 +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/README.md b/README.md index d072a4a..e16c3c0 100644 --- a/README.md +++ b/README.md @@ -59,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' ); ``` @@ -87,15 +92,27 @@ See this table for the available configuration parameters: 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.start_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_start_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 ) ``` @@ -108,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; ``` @@ -129,9 +148,11 @@ Sending requests to the Beeper Desktop API for every SQL query can be slow. Comb CREATE MATERIALIZED VIEW beeper_desktop_api_messages AS 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' ); -- Refresh the view every 4 hours. diff --git a/sql/_beeper_desktop_api.sql b/sql/_beeper_desktop_api.sql index adcbe27..003866d 100644 --- a/sql/_beeper_desktop_api.sql +++ b/sql/_beeper_desktop_api.sql @@ -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 (); @@ -132,10 +136,65 @@ 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.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; @@ -150,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_chats.sql b/sql/beeper_desktop_api_chats.sql index 71cd535..4a6a8e0 100644 --- a/sql/beeper_desktop_api_chats.sql +++ b/sql/beeper_desktop_api_chats.sql @@ -1,30 +1,54 @@ 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 + 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 @@ -33,126 +57,1661 @@ AS $$ SELECT ROW( id, accountID, + network, participants, title, type, unreadCount, + capabilities, + description, + draft, + imgURL, isArchived, + isLowPriority, + isMarkedUnread, isMuted, isPinned, + isReadOnly, lastActivity, lastReadMessageSortKey, - localChatID + 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.user[], - ADD ATTRIBUTE total BIGINT; +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_participant( - hasMore BOOLEAN, items beeper_desktop_api.user[], total BIGINT +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_participant +RETURNS beeper_desktop_api_chats.chat_list_response_reminder LANGUAGE SQL IMMUTABLE AS $$ - SELECT ROW(hasMore, items, total)::beeper_desktop_api_chats.chat_participant; + SELECT ROW( + dismissOnIncomingMessage, remindAt + )::beeper_desktop_api_chats.chat_list_response_reminder; $$; -ALTER TYPE beeper_desktop_api_chats.chat_create_response - ADD ATTRIBUTE chatID TEXT, ADD ATTRIBUTE status TEXT; +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_create_response( - chatID TEXT, status TEXT DEFAULT NULL +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_create_response +RETURNS beeper_desktop_api_chats.chat_list_response_snooze LANGUAGE SQL IMMUTABLE AS $$ - SELECT ROW(chatID, status)::beeper_desktop_api_chats.chat_create_response; + SELECT ROW( + snoozeUntil, userSnoozedAt + )::beeper_desktop_api_chats.chat_list_response_snooze; $$; -ALTER TYPE beeper_desktop_api_chats.chat_list_response +ALTER TYPE beeper_desktop_api_chats.chat_start_response ADD ATTRIBUTE id TEXT, ADD ATTRIBUTE accountID TEXT, - ADD ATTRIBUTE participants beeper_desktop_api_chats.chat_list_response_participant, + 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 preview beeper_desktop_api.message; + 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_list_response( +CREATE OR REPLACE FUNCTION beeper_desktop_api_chats.make_chat_start_response( id TEXT, accountID TEXT, - participants beeper_desktop_api_chats.chat_list_response_participant, + 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, - preview beeper_desktop_api.message 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_list_response +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, - preview - )::beeper_desktop_api_chats.chat_list_response; + messageExpirySeconds, + reminder, + snooze, + unreadMentionsCount, + status + )::beeper_desktop_api_chats.chat_start_response; $$; -ALTER TYPE beeper_desktop_api_chats.chat_list_response_participant +ALTER TYPE beeper_desktop_api_chats.chat_start_response_participant ADD ATTRIBUTE hasMore BOOLEAN, - ADD ATTRIBUTE items beeper_desktop_api.user[], + 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_list_response_participant( - hasMore BOOLEAN, items beeper_desktop_api.user[], 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_list_response_participant +RETURNS beeper_desktop_api_chats.chat_start_response_participant LANGUAGE SQL IMMUTABLE AS $$ SELECT ROW( hasMore, items, total - )::beeper_desktop_api_chats.chat_list_response_participant; + )::beeper_desktop_api_chats.chat_start_response_participant; $$; -ALTER TYPE beeper_desktop_api_chats.chat_start_response - ADD ATTRIBUTE chatID TEXT, ADD ATTRIBUTE status TEXT; +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( - chatID TEXT, status TEXT DEFAULT NULL +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 +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; +$$; + +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_start_response_capability_state_avatar +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_avatar; +$$; + +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_start_response_capability_state_description( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state_description +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_description; +$$; + +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_start_response_capability_state_disappearing_timer( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_disappearing_timer; +$$; + +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_start_response_capability_state_title( + level BIGINT +) +RETURNS beeper_desktop_api_chats.chat_start_response_capability_state_title +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + level + )::beeper_desktop_api_chats.chat_start_response_capability_state_title; +$$; + +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_start_response_draft( + text TEXT, attachments JSONB DEFAULT NULL +) +RETURNS beeper_desktop_api_chats.chat_start_response_draft +LANGUAGE SQL +IMMUTABLE +AS $$ + SELECT ROW( + 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(chatID, status)::beeper_desktop_api_chats.chat_start_response; + SELECT ROW(text, attachments)::beeper_desktop_api_chats.update_params_draft; $$; ALTER TYPE beeper_desktop_api_chats.start_params_user @@ -261,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, @@ -403,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, 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 36741e6..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 ) @@ -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_chats_messages_reactions_test.sql b/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql index ce1b811..0d59ca0 100644 --- a/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql +++ b/test/sql/beeper_desktop_api_chats_messages_reactions_test.sql @@ -4,13 +4,13 @@ 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 8a93e16..9e3d86e 100644 --- a/test/sql/beeper_desktop_api_chats_reminders_test.sql +++ b/test/sql/beeper_desktop_api_chats_reminders_test.sql @@ -5,7 +5,7 @@ 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 cfcfe53..40b9700 100644 --- a/test/sql/beeper_desktop_api_chats_test.sql +++ b/test/sql/beeper_desktop_api_chats_test.sql @@ -13,6 +13,11 @@ 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; @@ -22,6 +27,21 @@ 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; diff --git a/test/sql/beeper_desktop_api_messages_test.sql b/test/sql/beeper_desktop_api_messages_test.sql index a574bd7..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.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; From 43a6ea972203ffff707a1e9be275ec61fca3ccd2 Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 03:18:13 +0000 Subject: [PATCH 28/29] chore(internal): codegen related update --- uv.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/uv.lock b/uv.lock index 99ade34..3b6dfce 100644 --- a/uv.lock +++ b/uv.lock @@ -103,7 +103,7 @@ wheels = [ [[package]] name = "beeper_desktop_api" -version = "4.3.0" +version = "5.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "anyio" }, From ef748032f2362d401985e1b5837da9a6dad6d4dc Mon Sep 17 00:00:00 2001 From: "stainless-app[bot]" <142633134+stainless-app[bot]@users.noreply.github.com> Date: Thu, 7 May 2026 03:18:44 +0000 Subject: [PATCH 29/29] release: 5.0.0 --- .release-please-manifest.json | 2 +- CHANGELOG.md | 40 +++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) 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/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)