diff options
28 files changed, 384 insertions, 232 deletions
diff --git a/.sqlx/query-579bf0557d3e141dfd411c25c2ae66d6abb70f7bd2413cfbe23b71d1ce6090cd.json b/.sqlx/query-008401c1a1988a925d76aeeb722b56858a0c2aa7eedf4cc5824ea61da504f2f7.json index 27349d7..f80d588 100644 --- a/.sqlx/query-579bf0557d3e141dfd411c25c2ae66d6abb70f7bd2413cfbe23b71d1ce6090cd.json +++ b/.sqlx/query-008401c1a1988a925d76aeeb722b56858a0c2aa7eedf4cc5824ea61da504f2f7.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n insert into message\n (id, channel, sender, sent_at, sent_sequence, body, last_sequence)\n values ($1, $2, $3, $4, $5, $6, $7)\n returning\n id as \"id: Id\",\n channel as \"channel: channel::Id\",\n sender as \"sender: user::Id\",\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\",\n body as \"body: Body\"\n ", + "query": "\n insert into message\n (id, conversation, sender, sent_at, sent_sequence, body, last_sequence)\n values ($1, $2, $3, $4, $5, $6, $7)\n returning\n id as \"id: Id\",\n conversation as \"conversation: channel::Id\",\n sender as \"sender: user::Id\",\n sent_at as \"sent_at: DateTime\",\n sent_sequence as \"sent_sequence: Sequence\",\n body as \"body: Body\"\n ", "describe": { "columns": [ { @@ -9,7 +9,7 @@ "type_info": "Text" }, { - "name": "channel: channel::Id", + "name": "conversation: channel::Id", "ordinal": 1, "type_info": "Text" }, @@ -46,5 +46,5 @@ true ] }, - "hash": "579bf0557d3e141dfd411c25c2ae66d6abb70f7bd2413cfbe23b71d1ce6090cd" + "hash": "008401c1a1988a925d76aeeb722b56858a0c2aa7eedf4cc5824ea61da504f2f7" } diff --git a/.sqlx/query-3ff8a089ca1c57111e8c0e8d6d9da73e88a6cab35ae511674d25aa78bac9bc04.json b/.sqlx/query-0795c8c7f01f67cc05e1d0f750c807319b2c1d3069f9186ccaf722904310cf3d.json index ad364ea..20d217e 100644 --- a/.sqlx/query-3ff8a089ca1c57111e8c0e8d6d9da73e88a6cab35ae511674d25aa78bac9bc04.json +++ b/.sqlx/query-0795c8c7f01f67cc05e1d0f750c807319b2c1d3069f9186ccaf722904310cf3d.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n select\n id as \"id: Id\",\n message.channel as \"channel: channel::Id\",\n message.sender as \"sender: user::Id\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n message.body as \"body: Body\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.last_sequence > $1\n ", + "query": "\n select\n id as \"id: Id\",\n message.conversation as \"conversation: channel::Id\",\n message.sender as \"sender: user::Id\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n message.body as \"body: Body\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.last_sequence > $1\n ", "describe": { "columns": [ { @@ -9,7 +9,7 @@ "type_info": "Text" }, { - "name": "channel: channel::Id", + "name": "conversation: channel::Id", "ordinal": 1, "type_info": "Text" }, @@ -58,5 +58,5 @@ false ] }, - "hash": "3ff8a089ca1c57111e8c0e8d6d9da73e88a6cab35ae511674d25aa78bac9bc04" + "hash": "0795c8c7f01f67cc05e1d0f750c807319b2c1d3069f9186ccaf722904310cf3d" } diff --git a/.sqlx/query-0e06b7b5aeb29b946ab79430dd7a65ab18430e7f71afde9af52e99767c1f268f.json b/.sqlx/query-0e06b7b5aeb29b946ab79430dd7a65ab18430e7f71afde9af52e99767c1f268f.json new file mode 100644 index 0000000..befefa1 --- /dev/null +++ b/.sqlx/query-0e06b7b5aeb29b946ab79430dd7a65ab18430e7f71afde9af52e99767c1f268f.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n with has_messages as (\n select conversation\n from message\n group by conversation\n )\n delete from conversation_deleted\n where deleted_at < $1\n and id not in has_messages\n returning id as \"id: Id\"\n ", + "describe": { + "columns": [ + { + "name": "id: Id", + "ordinal": 0, + "type_info": "Text" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "0e06b7b5aeb29b946ab79430dd7a65ab18430e7f71afde9af52e99767c1f268f" +} diff --git a/.sqlx/query-1f0f35655dd57532897aaba9bde38547e626387dfe5b859f02ae1dbe171d5741.json b/.sqlx/query-1f0f35655dd57532897aaba9bde38547e626387dfe5b859f02ae1dbe171d5741.json new file mode 100644 index 0000000..9c62ca9 --- /dev/null +++ b/.sqlx/query-1f0f35655dd57532897aaba9bde38547e626387dfe5b859f02ae1dbe171d5741.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n insert into conversation (id, created_at, created_sequence, last_sequence)\n values ($1, $2, $3, $4)\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 4 + }, + "nullable": [] + }, + "hash": "1f0f35655dd57532897aaba9bde38547e626387dfe5b859f02ae1dbe171d5741" +} diff --git a/.sqlx/query-2773f12ef58c251596dd00f0bd048975fb06f090a11622cc74ced47a3d7ad44a.json b/.sqlx/query-2773f12ef58c251596dd00f0bd048975fb06f090a11622cc74ced47a3d7ad44a.json deleted file mode 100644 index 2de9614..0000000 --- a/.sqlx/query-2773f12ef58c251596dd00f0bd048975fb06f090a11622cc74ced47a3d7ad44a.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n insert into channel_deleted (id, deleted_at, deleted_sequence)\n values ($1, $2, $3)\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - }, - "hash": "2773f12ef58c251596dd00f0bd048975fb06f090a11622cc74ced47a3d7ad44a" -} diff --git a/.sqlx/query-454ca70caa83eee2dac585cf421524e41055cddf76dd4e4016142f61e0a4903f.json b/.sqlx/query-454ca70caa83eee2dac585cf421524e41055cddf76dd4e4016142f61e0a4903f.json deleted file mode 100644 index ebddeb8..0000000 --- a/.sqlx/query-454ca70caa83eee2dac585cf421524e41055cddf76dd4e4016142f61e0a4903f.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n delete from channel_name\n where id = $1\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - }, - "hash": "454ca70caa83eee2dac585cf421524e41055cddf76dd4e4016142f61e0a4903f" -} diff --git a/.sqlx/query-487092b18b01005fdb446c11f4726612141f7242decad1de5d9d5f166cb04990.json b/.sqlx/query-487092b18b01005fdb446c11f4726612141f7242decad1de5d9d5f166cb04990.json deleted file mode 100644 index c919eb2..0000000 --- a/.sqlx/query-487092b18b01005fdb446c11f4726612141f7242decad1de5d9d5f166cb04990.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n with has_messages as (\n select channel\n from message\n group by channel\n )\n delete from channel_deleted\n where deleted_at < $1\n and id not in has_messages\n returning id as \"id: Id\"\n ", - "describe": { - "columns": [ - { - "name": "id: Id", - "ordinal": 0, - "type_info": "Text" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false - ] - }, - "hash": "487092b18b01005fdb446c11f4726612141f7242decad1de5d9d5f166cb04990" -} diff --git a/.sqlx/query-4c27c8f7ed9b6315433dc2b5f787a61d82693fe0426b46f9971fcde5e44f38b0.json b/.sqlx/query-4c27c8f7ed9b6315433dc2b5f787a61d82693fe0426b46f9971fcde5e44f38b0.json deleted file mode 100644 index 8962098..0000000 --- a/.sqlx/query-4c27c8f7ed9b6315433dc2b5f787a61d82693fe0426b46f9971fcde5e44f38b0.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n insert into channel_name (id, display_name, canonical_name)\n values ($1, $2, $3)\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 3 - }, - "nullable": [] - }, - "hash": "4c27c8f7ed9b6315433dc2b5f787a61d82693fe0426b46f9971fcde5e44f38b0" -} diff --git a/.sqlx/query-4e39f27605dec811824fddae5559dda60c4b2a9c6746376a3552ce73b7d8ea38.json b/.sqlx/query-4e39f27605dec811824fddae5559dda60c4b2a9c6746376a3552ce73b7d8ea38.json deleted file mode 100644 index 902b216..0000000 --- a/.sqlx/query-4e39f27605dec811824fddae5559dda60c4b2a9c6746376a3552ce73b7d8ea38.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n update channel\n set last_sequence = max(last_sequence, $1)\n where id = $2\n returning id as \"id: Id\"\n ", - "describe": { - "columns": [ - { - "name": "id: Id", - "ordinal": 0, - "type_info": "Text" - } - ], - "parameters": { - "Right": 2 - }, - "nullable": [ - false - ] - }, - "hash": "4e39f27605dec811824fddae5559dda60c4b2a9c6746376a3552ce73b7d8ea38" -} diff --git a/.sqlx/query-5ec47dd232a277d37e2f1a523cc4aadf757f55c6f44836e9c37b36e473ac2321.json b/.sqlx/query-5ec47dd232a277d37e2f1a523cc4aadf757f55c6f44836e9c37b36e473ac2321.json new file mode 100644 index 0000000..aa3166d --- /dev/null +++ b/.sqlx/query-5ec47dd232a277d37e2f1a523cc4aadf757f55c6f44836e9c37b36e473ac2321.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n insert into conversation_name (id, display_name, canonical_name)\n values ($1, $2, $3)\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "5ec47dd232a277d37e2f1a523cc4aadf757f55c6f44836e9c37b36e473ac2321" +} diff --git a/.sqlx/query-66da54683caf3b003d20427290da9266cbd53de8761ea9ea58c4311ba78677a9.json b/.sqlx/query-66da54683caf3b003d20427290da9266cbd53de8761ea9ea58c4311ba78677a9.json new file mode 100644 index 0000000..2869b91 --- /dev/null +++ b/.sqlx/query-66da54683caf3b003d20427290da9266cbd53de8761ea9ea58c4311ba78677a9.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n insert into conversation_deleted (id, deleted_at, deleted_sequence)\n values ($1, $2, $3)\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 3 + }, + "nullable": [] + }, + "hash": "66da54683caf3b003d20427290da9266cbd53de8761ea9ea58c4311ba78677a9" +} diff --git a/.sqlx/query-6a767f2ad017fe3f56c4eb6060ea34dba0d4d325bc07fc882bea05abbae5414c.json b/.sqlx/query-6a767f2ad017fe3f56c4eb6060ea34dba0d4d325bc07fc882bea05abbae5414c.json new file mode 100644 index 0000000..e15da37 --- /dev/null +++ b/.sqlx/query-6a767f2ad017fe3f56c4eb6060ea34dba0d4d325bc07fc882bea05abbae5414c.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n delete from conversation_name\n where id = $1\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "6a767f2ad017fe3f56c4eb6060ea34dba0d4d325bc07fc882bea05abbae5414c" +} diff --git a/.sqlx/query-814400dfe985ef284db22c89d6e1a0eb2131b6581759a5028afb6a0910284803.json b/.sqlx/query-814400dfe985ef284db22c89d6e1a0eb2131b6581759a5028afb6a0910284803.json deleted file mode 100644 index 4bcf6d0..0000000 --- a/.sqlx/query-814400dfe985ef284db22c89d6e1a0eb2131b6581759a5028afb6a0910284803.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n delete from channel\n where id = $1\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 1 - }, - "nullable": [] - }, - "hash": "814400dfe985ef284db22c89d6e1a0eb2131b6581759a5028afb6a0910284803" -} diff --git a/.sqlx/query-85145c8b8264e7d01eef66e22353037f33fd3a3eaec0e36f06ffbbffb625aa24.json b/.sqlx/query-85145c8b8264e7d01eef66e22353037f33fd3a3eaec0e36f06ffbbffb625aa24.json new file mode 100644 index 0000000..9d212fa --- /dev/null +++ b/.sqlx/query-85145c8b8264e7d01eef66e22353037f33fd3a3eaec0e36f06ffbbffb625aa24.json @@ -0,0 +1,20 @@ +{ + "db_name": "SQLite", + "query": "\n update conversation\n set last_sequence = max(last_sequence, $1)\n where id = $2\n returning id as \"id: Id\"\n ", + "describe": { + "columns": [ + { + "name": "id: Id", + "ordinal": 0, + "type_info": "Text" + } + ], + "parameters": { + "Right": 2 + }, + "nullable": [ + false + ] + }, + "hash": "85145c8b8264e7d01eef66e22353037f33fd3a3eaec0e36f06ffbbffb625aa24" +} diff --git a/.sqlx/query-c44dbcc7f4c0257a991e1ae4a2679aaa4c3f28aa5436a9af067a754e46af5589.json b/.sqlx/query-927cc51fad82650938c68b8da423da82470585807b45622535cbe83cc35a10e8.json index 37d685a..4d67f21 100644 --- a/.sqlx/query-c44dbcc7f4c0257a991e1ae4a2679aaa4c3f28aa5436a9af067a754e46af5589.json +++ b/.sqlx/query-927cc51fad82650938c68b8da423da82470585807b45622535cbe83cc35a10e8.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n select\n id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n channel.created_at as \"created_at: DateTime\",\n channel.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from channel\n left join channel_name as name\n using (id)\n left join channel_deleted as deleted\n using (id)\n where channel.last_sequence > $1\n ", + "query": "\n select\n id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n conversation.created_at as \"created_at: DateTime\",\n conversation.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from conversation\n left join conversation_name as name\n using (id)\n left join conversation_deleted as deleted\n using (id)\n where id = $1\n ", "describe": { "columns": [ { @@ -52,5 +52,5 @@ false ] }, - "hash": "c44dbcc7f4c0257a991e1ae4a2679aaa4c3f28aa5436a9af067a754e46af5589" + "hash": "927cc51fad82650938c68b8da423da82470585807b45622535cbe83cc35a10e8" } diff --git a/.sqlx/query-a4b34593fdf71bb911beb850cfa88adb346b1770e32785166bd43cb853143a7f.json b/.sqlx/query-a4b34593fdf71bb911beb850cfa88adb346b1770e32785166bd43cb853143a7f.json deleted file mode 100644 index e886759..0000000 --- a/.sqlx/query-a4b34593fdf71bb911beb850cfa88adb346b1770e32785166bd43cb853143a7f.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n select\n channel.id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n channel.created_at as \"created_at: DateTime\",\n channel.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from channel\n left join channel_name as name\n using (id)\n left join channel_deleted as deleted\n using (id)\n left join message\n on channel.id = message.channel\n where channel.created_at < $1\n and message.id is null\n and deleted.id is null\n ", - "describe": { - "columns": [ - { - "name": "id: Id", - "ordinal": 0, - "type_info": "Text" - }, - { - "name": "display_name?: String", - "ordinal": 1, - "type_info": "Null" - }, - { - "name": "canonical_name?: String", - "ordinal": 2, - "type_info": "Null" - }, - { - "name": "created_at: DateTime", - "ordinal": 3, - "type_info": "Text" - }, - { - "name": "created_sequence: Sequence", - "ordinal": 4, - "type_info": "Integer" - }, - { - "name": "deleted_at?: DateTime", - "ordinal": 5, - "type_info": "Text" - }, - { - "name": "deleted_sequence?: Sequence", - "ordinal": 6, - "type_info": "Integer" - } - ], - "parameters": { - "Right": 1 - }, - "nullable": [ - false, - false, - false, - false, - false, - false, - false - ] - }, - "hash": "a4b34593fdf71bb911beb850cfa88adb346b1770e32785166bd43cb853143a7f" -} diff --git a/.sqlx/query-b18432e78891ffca0d7f3fcd1c543db4a3f02c211462704f7810fdbed924ac30.json b/.sqlx/query-a781f6b9ab38ade2a0b15d665e297e9ff65546b87e6667ad68bbc162a3e464c4.json index 3ae7605..7e4a102 100644 --- a/.sqlx/query-b18432e78891ffca0d7f3fcd1c543db4a3f02c211462704f7810fdbed924ac30.json +++ b/.sqlx/query-a781f6b9ab38ade2a0b15d665e297e9ff65546b87e6667ad68bbc162a3e464c4.json @@ -1,10 +1,10 @@ { "db_name": "SQLite", - "query": "\n select\n message.channel as \"channel: channel::Id\",\n message.sender as \"sender: user::Id\",\n message.id as \"id: Id\",\n message.body as \"body: Body\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.sent_sequence <= $1\n order by message.sent_sequence\n ", + "query": "\n select\n message.conversation as \"conversation: channel::Id\",\n message.sender as \"sender: user::Id\",\n message.id as \"id: Id\",\n message.body as \"body: Body\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.sent_sequence <= $1\n order by message.sent_sequence\n ", "describe": { "columns": [ { - "name": "channel: channel::Id", + "name": "conversation: channel::Id", "ordinal": 0, "type_info": "Text" }, @@ -58,5 +58,5 @@ false ] }, - "hash": "b18432e78891ffca0d7f3fcd1c543db4a3f02c211462704f7810fdbed924ac30" + "hash": "a781f6b9ab38ade2a0b15d665e297e9ff65546b87e6667ad68bbc162a3e464c4" } diff --git a/.sqlx/query-17f6f507d9343a734e1098f6ce56d372edeb35f92769a0181a71d68a68780649.json b/.sqlx/query-c4f0bbdcfdd1d88def0f19f69141a2e9dd3efaa0f1911765e73d1c00b34ddbaa.json index 0e67b03..c4cb21b 100644 --- a/.sqlx/query-17f6f507d9343a734e1098f6ce56d372edeb35f92769a0181a71d68a68780649.json +++ b/.sqlx/query-c4f0bbdcfdd1d88def0f19f69141a2e9dd3efaa0f1911765e73d1c00b34ddbaa.json @@ -1,10 +1,10 @@ { "db_name": "SQLite", - "query": "\n select\n message.channel as \"channel: channel::Id\",\n message.sender as \"sender: user::Id\",\n id as \"id: Id\",\n message.body as \"body: Body\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.channel = $1\n and deleted.id is null\n ", + "query": "\n select\n message.conversation as \"conversation: channel::Id\",\n message.sender as \"sender: user::Id\",\n id as \"id: Id\",\n message.body as \"body: Body\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.conversation = $1\n and deleted.id is null\n ", "describe": { "columns": [ { - "name": "channel: channel::Id", + "name": "conversation: channel::Id", "ordinal": 0, "type_info": "Text" }, @@ -58,5 +58,5 @@ false ] }, - "hash": "17f6f507d9343a734e1098f6ce56d372edeb35f92769a0181a71d68a68780649" + "hash": "c4f0bbdcfdd1d88def0f19f69141a2e9dd3efaa0f1911765e73d1c00b34ddbaa" } diff --git a/.sqlx/query-e36d7cd00f040807c3994b5010f2f77b943ec225244fcfc24013b12a48084a1e.json b/.sqlx/query-c960562be5b34678c305895cc4aaa6d96ad25184042ea1f989499285d41400f8.json index 6700c43..427962a 100644 --- a/.sqlx/query-e36d7cd00f040807c3994b5010f2f77b943ec225244fcfc24013b12a48084a1e.json +++ b/.sqlx/query-c960562be5b34678c305895cc4aaa6d96ad25184042ea1f989499285d41400f8.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n select\n id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n channel.created_at as \"created_at: DateTime\",\n channel.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from channel\n left join channel_name as name\n using (id)\n left join channel_deleted as deleted\n using (id)\n where id = $1\n ", + "query": "\n select\n id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n conversation.created_at as \"created_at: DateTime\",\n conversation.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from conversation\n left join conversation_name as name\n using (id)\n left join conversation_deleted as deleted\n using (id)\n where conversation.last_sequence > $1\n ", "describe": { "columns": [ { @@ -52,5 +52,5 @@ false ] }, - "hash": "e36d7cd00f040807c3994b5010f2f77b943ec225244fcfc24013b12a48084a1e" + "hash": "c960562be5b34678c305895cc4aaa6d96ad25184042ea1f989499285d41400f8" } diff --git a/.sqlx/query-ca9146e92c3b3e724f4b58ad72529de7030a4863d3bf479bb19a6a2a76d1590b.json b/.sqlx/query-ca9146e92c3b3e724f4b58ad72529de7030a4863d3bf479bb19a6a2a76d1590b.json deleted file mode 100644 index 0118249..0000000 --- a/.sqlx/query-ca9146e92c3b3e724f4b58ad72529de7030a4863d3bf479bb19a6a2a76d1590b.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "db_name": "SQLite", - "query": "\n insert\n into channel (id, created_at, created_sequence, last_sequence)\n values ($1, $2, $3, $4)\n ", - "describe": { - "columns": [], - "parameters": { - "Right": 4 - }, - "nullable": [] - }, - "hash": "ca9146e92c3b3e724f4b58ad72529de7030a4863d3bf479bb19a6a2a76d1590b" -} diff --git a/.sqlx/query-cf24c0d42c7e5bdc16a7925544d2057667955e468d1b6683a89d45d6ce58166f.json b/.sqlx/query-cf24c0d42c7e5bdc16a7925544d2057667955e468d1b6683a89d45d6ce58166f.json new file mode 100644 index 0000000..c32961b --- /dev/null +++ b/.sqlx/query-cf24c0d42c7e5bdc16a7925544d2057667955e468d1b6683a89d45d6ce58166f.json @@ -0,0 +1,56 @@ +{ + "db_name": "SQLite", + "query": "\n select\n conversation.id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n conversation.created_at as \"created_at: DateTime\",\n conversation.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from conversation\n left join conversation_name as name\n using (id)\n left join conversation_deleted as deleted\n using (id)\n left join message\n on conversation.id = message.conversation\n where conversation.created_at < $1\n and message.id is null\n and deleted.id is null\n ", + "describe": { + "columns": [ + { + "name": "id: Id", + "ordinal": 0, + "type_info": "Text" + }, + { + "name": "display_name?: String", + "ordinal": 1, + "type_info": "Null" + }, + { + "name": "canonical_name?: String", + "ordinal": 2, + "type_info": "Null" + }, + { + "name": "created_at: DateTime", + "ordinal": 3, + "type_info": "Text" + }, + { + "name": "created_sequence: Sequence", + "ordinal": 4, + "type_info": "Integer" + }, + { + "name": "deleted_at?: DateTime", + "ordinal": 5, + "type_info": "Text" + }, + { + "name": "deleted_sequence?: Sequence", + "ordinal": 6, + "type_info": "Integer" + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false, + false, + false, + false, + false, + false, + false + ] + }, + "hash": "cf24c0d42c7e5bdc16a7925544d2057667955e468d1b6683a89d45d6ce58166f" +} diff --git a/.sqlx/query-dfb54b7d586cc99b9e03cb08727b5af8d0b95fc30797dadcc0eb98f12667f14e.json b/.sqlx/query-dfb54b7d586cc99b9e03cb08727b5af8d0b95fc30797dadcc0eb98f12667f14e.json new file mode 100644 index 0000000..bfbdef6 --- /dev/null +++ b/.sqlx/query-dfb54b7d586cc99b9e03cb08727b5af8d0b95fc30797dadcc0eb98f12667f14e.json @@ -0,0 +1,12 @@ +{ + "db_name": "SQLite", + "query": "\n delete from conversation\n where id = $1\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 1 + }, + "nullable": [] + }, + "hash": "dfb54b7d586cc99b9e03cb08727b5af8d0b95fc30797dadcc0eb98f12667f14e" +} diff --git a/.sqlx/query-ad1485f0a5514bcfaf68477723ae0f13e93a1f18213e208d3a181936a36da5fb.json b/.sqlx/query-e2cc4ef6af56e6ac1fcf2353fb52cdf99a84c160cf1fc2bd1e889c4c6fff59ea.json index ce757ba..97dde44 100644 --- a/.sqlx/query-ad1485f0a5514bcfaf68477723ae0f13e93a1f18213e208d3a181936a36da5fb.json +++ b/.sqlx/query-e2cc4ef6af56e6ac1fcf2353fb52cdf99a84c160cf1fc2bd1e889c4c6fff59ea.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n select\n id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n channel.created_at as \"created_at: DateTime\",\n channel.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from channel\n left join channel_name as name\n using (id)\n left join channel_deleted as deleted\n using (id)\n where channel.created_sequence <= $1\n order by name.canonical_name\n ", + "query": "\n select\n id as \"id: Id\",\n name.display_name as \"display_name?: String\",\n name.canonical_name as \"canonical_name?: String\",\n conversation.created_at as \"created_at: DateTime\",\n conversation.created_sequence as \"created_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from conversation\n left join conversation_name as name\n using (id)\n left join conversation_deleted as deleted\n using (id)\n where conversation.created_sequence <= $1\n order by name.canonical_name\n ", "describe": { "columns": [ { @@ -52,5 +52,5 @@ false ] }, - "hash": "ad1485f0a5514bcfaf68477723ae0f13e93a1f18213e208d3a181936a36da5fb" + "hash": "e2cc4ef6af56e6ac1fcf2353fb52cdf99a84c160cf1fc2bd1e889c4c6fff59ea" } diff --git a/.sqlx/query-fb7114754c6dc8ffe623ae0f3f61ec2e20795692db7019d962378c740ae69599.json b/.sqlx/query-e9689d49d357b1df287bc2487bd9d1179bbf8c33398ee7b9af2ea265c4b6539c.json index 7f1e1f3..35dbbe3 100644 --- a/.sqlx/query-fb7114754c6dc8ffe623ae0f3f61ec2e20795692db7019d962378c740ae69599.json +++ b/.sqlx/query-e9689d49d357b1df287bc2487bd9d1179bbf8c33398ee7b9af2ea265c4b6539c.json @@ -1,10 +1,10 @@ { "db_name": "SQLite", - "query": "\n select\n message.channel as \"channel: channel::Id\",\n message.sender as \"sender: user::Id\",\n id as \"id: Id\",\n message.body as \"body: Body\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where id = $1\n ", + "query": "\n select\n message.conversation as \"conversation: channel::Id\",\n message.sender as \"sender: user::Id\",\n id as \"id: Id\",\n message.body as \"body: Body\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where id = $1\n ", "describe": { "columns": [ { - "name": "channel: channel::Id", + "name": "conversation: channel::Id", "ordinal": 0, "type_info": "Text" }, @@ -58,5 +58,5 @@ false ] }, - "hash": "fb7114754c6dc8ffe623ae0f3f61ec2e20795692db7019d962378c740ae69599" + "hash": "e9689d49d357b1df287bc2487bd9d1179bbf8c33398ee7b9af2ea265c4b6539c" } diff --git a/.sqlx/query-3d0354407ac4dcd7b012328b9086c4f582bd2b3dc99a6a8e5f4853e0d4c43c50.json b/.sqlx/query-f796c7c4d16a7bda355c5cbff7f0c48a70d61597e2f284bf29771a9c3c2615a9.json index 0481b7b..f194250 100644 --- a/.sqlx/query-3d0354407ac4dcd7b012328b9086c4f582bd2b3dc99a6a8e5f4853e0d4c43c50.json +++ b/.sqlx/query-f796c7c4d16a7bda355c5cbff7f0c48a70d61597e2f284bf29771a9c3c2615a9.json @@ -1,6 +1,6 @@ { "db_name": "SQLite", - "query": "\n select\n id as \"id: Id\",\n message.channel as \"channel: channel::Id\",\n message.sender as \"sender: user::Id\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n message.body as \"body: Body\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.sent_at < $1\n and deleted.id is null\n ", + "query": "\n select\n id as \"id: Id\",\n message.conversation as \"conversation: channel::Id\",\n message.sender as \"sender: user::Id\",\n message.sent_at as \"sent_at: DateTime\",\n message.sent_sequence as \"sent_sequence: Sequence\",\n message.body as \"body: Body\",\n deleted.deleted_at as \"deleted_at?: DateTime\",\n deleted.deleted_sequence as \"deleted_sequence?: Sequence\"\n from message\n left join message_deleted as deleted\n using (id)\n where message.sent_at < $1\n and deleted.id is null\n ", "describe": { "columns": [ { @@ -9,7 +9,7 @@ "type_info": "Text" }, { - "name": "channel: channel::Id", + "name": "conversation: channel::Id", "ordinal": 1, "type_info": "Text" }, @@ -58,5 +58,5 @@ false ] }, - "hash": "3d0354407ac4dcd7b012328b9086c4f582bd2b3dc99a6a8e5f4853e0d4c43c50" + "hash": "f796c7c4d16a7bda355c5cbff7f0c48a70d61597e2f284bf29771a9c3c2615a9" } diff --git a/migrations/20250624003106_rename_channel_to_conversation.sql b/migrations/20250624003106_rename_channel_to_conversation.sql new file mode 100644 index 0000000..753d42b --- /dev/null +++ b/migrations/20250624003106_rename_channel_to_conversation.sql @@ -0,0 +1,153 @@ +alter table message + rename to old_message; + +alter table message_deleted + rename to old_message_deleted; + +create table conversation ( + id text + not null + primary key, + created_sequence bigint + unique + not null, + created_at text + not null, + last_sequence bigint + not null +); + +insert into + conversation (id, created_sequence, created_at, last_sequence) +select + id, + created_sequence, + created_at, + last_sequence +from + channel; + +create table conversation_name ( + id text + not null + primary key + references conversation (id), + display_name + not null, + canonical_name + not null + unique +); + +insert into + conversation_name (id, display_name, canonical_name) +select + id, + display_name, + canonical_name +from + channel_name; + +create table conversation_deleted ( + id text + not null + primary key + references conversation (id), + deleted_sequence bigint + unique + not null, + deleted_at text + not null +); + +insert into + conversation_deleted (id, deleted_sequence, deleted_at) +select + id, + deleted_sequence, + deleted_at +from + channel_deleted; + +create table message ( + id text + not null + primary key, + conversation text + not null + references conversation (id), + sender text + not null + references user (id), + sent_sequence bigint + unique + not null, + sent_at text + not null, + body text + null, + last_sequence bigint + not null +); + +insert into + message (id, conversation, sender, sent_sequence, sent_at, body, last_sequence) +select + id, + channel, + sender, + sent_sequence, + sent_at, + body, + last_sequence +from + old_message; + +create table message_deleted ( + id text + not null + primary key + references message (id), + deleted_sequence bigint + unique + not null, + deleted_at text + not null + +); + +insert into + message_deleted (id, deleted_sequence, deleted_at) +select + id, + deleted_sequence, + deleted_at +from + old_message_deleted; + +drop table old_message_deleted; +drop table old_message; +drop table channel_deleted; +drop table channel_name; +drop table channel; + +create index conversation_created_sequence + on conversation (created_sequence); + +create index conversation_created_at + on conversation (created_at); + +create index conversation_last_sequence + on conversation (last_sequence); + +create index message_deleted_deleted_at + on message_deleted (deleted_at); + +create index message_sent_at + on message (sent_at); + +create index message_conversation + on message (conversation); + +create index message_last_sequence + on message (last_sequence); diff --git a/src/channel/repo.rs b/src/channel/repo.rs index 812a259..fd2173a 100644 --- a/src/channel/repo.rs +++ b/src/channel/repo.rs @@ -31,8 +31,7 @@ impl Channels<'_> { sqlx::query!( r#" - insert - into channel (id, created_at, created_sequence, last_sequence) + insert into conversation (id, created_at, created_sequence, last_sequence) values ($1, $2, $3, $4) "#, id, @@ -45,7 +44,7 @@ impl Channels<'_> { sqlx::query!( r#" - insert into channel_name (id, display_name, canonical_name) + insert into conversation_name (id, display_name, canonical_name) values ($1, $2, $3) "#, id, @@ -75,14 +74,14 @@ impl Channels<'_> { id as "id: Id", name.display_name as "display_name?: String", name.canonical_name as "canonical_name?: String", - channel.created_at as "created_at: DateTime", - channel.created_sequence as "created_sequence: Sequence", + conversation.created_at as "created_at: DateTime", + conversation.created_sequence as "created_sequence: Sequence", deleted.deleted_at as "deleted_at?: DateTime", deleted.deleted_sequence as "deleted_sequence?: Sequence" - from channel - left join channel_name as name + from conversation + left join conversation_name as name using (id) - left join channel_deleted as deleted + left join conversation_deleted as deleted using (id) where id = $1 "#, @@ -112,16 +111,16 @@ impl Channels<'_> { id as "id: Id", name.display_name as "display_name?: String", name.canonical_name as "canonical_name?: String", - channel.created_at as "created_at: DateTime", - channel.created_sequence as "created_sequence: Sequence", + conversation.created_at as "created_at: DateTime", + conversation.created_sequence as "created_sequence: Sequence", deleted.deleted_at as "deleted_at?: DateTime", deleted.deleted_sequence as "deleted_sequence?: Sequence" - from channel - left join channel_name as name + from conversation + left join conversation_name as name using (id) - left join channel_deleted as deleted + left join conversation_deleted as deleted using (id) - where channel.created_sequence <= $1 + where conversation.created_sequence <= $1 order by name.canonical_name "#, resume_at, @@ -152,16 +151,16 @@ impl Channels<'_> { id as "id: Id", name.display_name as "display_name?: String", name.canonical_name as "canonical_name?: String", - channel.created_at as "created_at: DateTime", - channel.created_sequence as "created_sequence: Sequence", + conversation.created_at as "created_at: DateTime", + conversation.created_sequence as "created_sequence: Sequence", deleted.deleted_at as "deleted_at?: DateTime", deleted.deleted_sequence as "deleted_sequence?: Sequence" - from channel - left join channel_name as name + from conversation + left join conversation_name as name using (id) - left join channel_deleted as deleted + left join conversation_deleted as deleted using (id) - where channel.last_sequence > $1 + where conversation.last_sequence > $1 "#, resume_at, ) @@ -192,7 +191,7 @@ impl Channels<'_> { let id = channel.id(); sqlx::query!( r#" - update channel + update conversation set last_sequence = max(last_sequence, $1) where id = $2 returning id as "id: Id" @@ -205,7 +204,7 @@ impl Channels<'_> { sqlx::query!( r#" - insert into channel_deleted (id, deleted_at, deleted_sequence) + insert into conversation_deleted (id, deleted_at, deleted_sequence) values ($1, $2, $3) "#, id, @@ -215,9 +214,9 @@ impl Channels<'_> { .execute(&mut *self.0) .await?; - // Small social responsibility hack here: when a channel is deleted, its name is - // retconned to have been the empty string. Someone reading the event stream - // afterwards, or looking at channels via the API, cannot retrieve the + // Small social responsibility hack here: when a conversation is deleted, its + // name is retconned to have been the empty string. Someone reading the event + // stream afterwards, or looking at channels via the API, cannot retrieve the // "deleted" channel's information by ignoring the deletion event. // // This also avoids the need for a separate name reservation table to ensure @@ -225,7 +224,7 @@ impl Channels<'_> { // is unique over non-null values. sqlx::query!( r#" - delete from channel_name + delete from conversation_name where id = $1 "#, id, @@ -242,11 +241,11 @@ impl Channels<'_> { let channels = sqlx::query_scalar!( r#" with has_messages as ( - select channel + select conversation from message - group by channel + group by conversation ) - delete from channel_deleted + delete from conversation_deleted where deleted_at < $1 and id not in has_messages returning id as "id: Id" @@ -260,7 +259,7 @@ impl Channels<'_> { // Wanted: a way to batch these up into one query. sqlx::query!( r#" - delete from channel + delete from conversation where id = $1 "#, channel, @@ -276,21 +275,21 @@ impl Channels<'_> { let channels = sqlx::query!( r#" select - channel.id as "id: Id", + conversation.id as "id: Id", name.display_name as "display_name?: String", name.canonical_name as "canonical_name?: String", - channel.created_at as "created_at: DateTime", - channel.created_sequence as "created_sequence: Sequence", + conversation.created_at as "created_at: DateTime", + conversation.created_sequence as "created_sequence: Sequence", deleted.deleted_at as "deleted_at?: DateTime", deleted.deleted_sequence as "deleted_sequence?: Sequence" - from channel - left join channel_name as name + from conversation + left join conversation_name as name using (id) - left join channel_deleted as deleted + left join conversation_deleted as deleted using (id) left join message - on channel.id = message.channel - where channel.created_at < $1 + on conversation.id = message.conversation + where conversation.created_at < $1 and message.id is null and deleted.id is null "#, diff --git a/src/message/repo.rs b/src/message/repo.rs index e753134..159ce8e 100644 --- a/src/message/repo.rs +++ b/src/message/repo.rs @@ -33,11 +33,11 @@ impl Messages<'_> { let message = sqlx::query!( r#" insert into message - (id, channel, sender, sent_at, sent_sequence, body, last_sequence) + (id, conversation, sender, sent_at, sent_sequence, body, last_sequence) values ($1, $2, $3, $4, $5, $6, $7) returning id as "id: Id", - channel as "channel: channel::Id", + conversation as "conversation: channel::Id", sender as "sender: user::Id", sent_at as "sent_at: DateTime", sent_sequence as "sent_sequence: Sequence", @@ -54,7 +54,7 @@ impl Messages<'_> { .map(|row| History { message: Message { sent: Instant::new(row.sent_at, row.sent_sequence), - channel: row.channel, + channel: row.conversation, sender: row.sender, id: row.id, body: row.body.unwrap_or_default(), @@ -73,7 +73,7 @@ impl Messages<'_> { let messages = sqlx::query!( r#" select - message.channel as "channel: channel::Id", + message.conversation as "conversation: channel::Id", message.sender as "sender: user::Id", id as "id: Id", message.body as "body: Body", @@ -84,7 +84,7 @@ impl Messages<'_> { from message left join message_deleted as deleted using (id) - where message.channel = $1 + where message.conversation = $1 and deleted.id is null "#, channel_id, @@ -92,7 +92,7 @@ impl Messages<'_> { .map(|row| History { message: Message { sent: Instant::new(row.sent_at, row.sent_sequence), - channel: row.channel, + channel: row.conversation, sender: row.sender, id: row.id, body: row.body.unwrap_or_default(), @@ -110,7 +110,7 @@ impl Messages<'_> { let messages = sqlx::query!( r#" select - message.channel as "channel: channel::Id", + message.conversation as "conversation: channel::Id", message.sender as "sender: user::Id", message.id as "id: Id", message.body as "body: Body", @@ -129,7 +129,7 @@ impl Messages<'_> { .map(|row| History { message: Message { sent: Instant::new(row.sent_at, row.sent_sequence), - channel: row.channel, + channel: row.conversation, sender: row.sender, id: row.id, body: row.body.unwrap_or_default(), @@ -147,7 +147,7 @@ impl Messages<'_> { let message = sqlx::query!( r#" select - message.channel as "channel: channel::Id", + message.conversation as "conversation: channel::Id", message.sender as "sender: user::Id", id as "id: Id", message.body as "body: Body", @@ -165,7 +165,7 @@ impl Messages<'_> { .map(|row| History { message: Message { sent: Instant::new(row.sent_at, row.sent_sequence), - channel: row.channel, + channel: row.conversation, sender: row.sender, id: row.id, body: row.body.unwrap_or_default(), @@ -252,7 +252,7 @@ impl Messages<'_> { r#" select id as "id: Id", - message.channel as "channel: channel::Id", + message.conversation as "conversation: channel::Id", message.sender as "sender: user::Id", message.sent_at as "sent_at: DateTime", message.sent_sequence as "sent_sequence: Sequence", @@ -271,7 +271,7 @@ impl Messages<'_> { message: Message { sent: Instant::new(row.sent_at, row.sent_sequence), id: row.id, - channel: row.channel, + channel: row.conversation, sender: row.sender, body: row.body.unwrap_or_default(), deleted_at: row.deleted_at, @@ -289,7 +289,7 @@ impl Messages<'_> { r#" select id as "id: Id", - message.channel as "channel: channel::Id", + message.conversation as "conversation: channel::Id", message.sender as "sender: user::Id", message.sent_at as "sent_at: DateTime", message.sent_sequence as "sent_sequence: Sequence", @@ -306,7 +306,7 @@ impl Messages<'_> { .map(|row| History { message: Message { sent: Instant::new(row.sent_at, row.sent_sequence), - channel: row.channel, + channel: row.conversation, sender: row.sender, id: row.id, body: row.body.unwrap_or_default(), |
