diff --git a/.sqlx/query-d1368c7b093ab32612530248f47357cb2fd6cfe071ddac8a7787d07134a32fec.json b/.sqlx/query-006c357b649175b19f61a8cb6c8b19c4e20b0ffec9ef80fdf36eb307a0d1c1bc.json similarity index 97% rename from .sqlx/query-d1368c7b093ab32612530248f47357cb2fd6cfe071ddac8a7787d07134a32fec.json rename to .sqlx/query-006c357b649175b19f61a8cb6c8b19c4e20b0ffec9ef80fdf36eb307a0d1c1bc.json index dac20486..fac03cf8 100644 --- a/.sqlx/query-d1368c7b093ab32612530248f47357cb2fd6cfe071ddac8a7787d07134a32fec.json +++ b/.sqlx/query-006c357b649175b19f61a8cb6c8b19c4e20b0ffec9ef80fdf36eb307a0d1c1bc.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT m.id AS \"id!\",\n m.room_id AS \"room_id!: RoomId\",\n m.user_id AS \"user_id?: UserId\",\n m.client_message_id,\n m.content AS \"content!\",\n m.message_type AS \"message_type!: ChatMessageType\",\n m.status AS \"status!: ChatMessageStatus\",\n m.version AS \"version!\",\n m.reply_to_message_id,\n m.reply_to_message_created_at,\n m.metadata AS \"metadata?: ChatMetadata\",\n m.edited_at,\n m.deleted_at,\n m.deleted_by AS \"deleted_by?: UserId\",\n m.delete_reason,\n m.created_at AS \"created_at!\"\n FROM chat_messages m\n JOIN unnest($2::bigint[], $3::timestamptz[]) AS wanted(id, created_at)\n ON m.id = wanted.id AND m.created_at = wanted.created_at\n WHERE m.room_id = $1\n AND m.status <> $4\n AND m.deletion_source IS DISTINCT FROM 'account'\n ", + "query": "\n SELECT m.id AS \"id!\",\n m.room_id AS \"room_id!: RoomId\",\n m.user_id AS \"user_id?: UserId\",\n m.client_message_id,\n m.content AS \"content!\",\n m.message_type AS \"message_type!: ChatMessageType\",\n m.status AS \"status!: ChatMessageStatus\",\n m.version AS \"version!\",\n m.reply_to_message_id,\n m.reply_to_message_created_at,\n m.metadata AS \"metadata?: ChatMetadata\",\n m.edited_at,\n m.deleted_at,\n m.deleted_by AS \"deleted_by?: UserId\",\n m.delete_reason,\n m.created_at AS \"created_at!\"\n FROM chat_messages m\n JOIN unnest($2::bigint[], $3::timestamptz[]) AS wanted(id, created_at)\n ON m.id = wanted.id AND m.created_at = wanted.created_at\n WHERE m.room_id = $1\n AND m.status <> $4\n AND m.deletion_source IS DISTINCT FROM $5\n ", "describe": { "columns": [ { @@ -185,6 +185,7 @@ "Int8", "Int8Array", "TimestamptzArray", + "Int2", "Int2" ] }, @@ -207,5 +208,5 @@ false ] }, - "hash": "d1368c7b093ab32612530248f47357cb2fd6cfe071ddac8a7787d07134a32fec" + "hash": "006c357b649175b19f61a8cb6c8b19c4e20b0ffec9ef80fdf36eb307a0d1c1bc" } diff --git a/.sqlx/query-48e1a373be1a82308939da5c2d866826923541bc0d8d97ae0ebee05926e082a1.json b/.sqlx/query-041574e8a0aff9f44058fffd6571ff95797a04c58e1770b90b8922016c88bd4f.json similarity index 50% rename from .sqlx/query-48e1a373be1a82308939da5c2d866826923541bc0d8d97ae0ebee05926e082a1.json rename to .sqlx/query-041574e8a0aff9f44058fffd6571ff95797a04c58e1770b90b8922016c88bd4f.json index 39db34b8..ec0c3adc 100644 --- a/.sqlx/query-48e1a373be1a82308939da5c2d866826923541bc0d8d97ae0ebee05926e082a1.json +++ b/.sqlx/query-041574e8a0aff9f44058fffd6571ff95797a04c58e1770b90b8922016c88bd4f.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = 'user',\n version = version + 1\n WHERE room_id = $1 AND deleted_at IS NULL\n AND playlist_id IS NULL\n ", + "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = $2,\n version = version + 1\n WHERE room_id = $1 AND deleted_at IS NULL\n AND playlist_id IS NULL\n ", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "48e1a373be1a82308939da5c2d866826923541bc0d8d97ae0ebee05926e082a1" + "hash": "041574e8a0aff9f44058fffd6571ff95797a04c58e1770b90b8922016c88bd4f" } diff --git a/.sqlx/query-05365780201a50a5ba64bc54d8f4449f2b53c8635811c03352c5c60430f21669.json b/.sqlx/query-05365780201a50a5ba64bc54d8f4449f2b53c8635811c03352c5c60430f21669.json new file mode 100644 index 00000000..12daf417 --- /dev/null +++ b/.sqlx/query-05365780201a50a5ba64bc54d8f4449f2b53c8635811c03352c5c60430f21669.json @@ -0,0 +1,15 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "05365780201a50a5ba64bc54d8f4449f2b53c8635811c03352c5c60430f21669" +} diff --git a/.sqlx/query-bf1653c32dc751185372ae8e273141fe40b661e3fb2c5f1a7c14c6dbf1d31515.json b/.sqlx/query-0578fb0239e07563573ee769185699734f41471a0828d4d128d2e10f06a08abb.json similarity index 65% rename from .sqlx/query-bf1653c32dc751185372ae8e273141fe40b661e3fb2c5f1a7c14c6dbf1d31515.json rename to .sqlx/query-0578fb0239e07563573ee769185699734f41471a0828d4d128d2e10f06a08abb.json index 14d13b48..0cd3bc23 100644 --- a/.sqlx/query-bf1653c32dc751185372ae8e273141fe40b661e3fb2c5f1a7c14c6dbf1d31515.json +++ b/.sqlx/query-0578fb0239e07563573ee769185699734f41471a0828d4d128d2e10f06a08abb.json @@ -1,15 +1,16 @@ { "db_name": "PostgreSQL", - "query": "WITH RECURSIVE target AS (SELECT id FROM playlists WHERE id = ANY($1) AND deleted_at IS NULL UNION ALL SELECT p.id FROM playlists p JOIN target t ON p.parent_id = t.id WHERE p.deleted_at IS NULL) UPDATE playlists SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, 'account'), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id IN (SELECT id FROM target) AND deleted_at IS NULL", + "query": "WITH RECURSIVE target AS (SELECT id FROM playlists WHERE id = ANY($1) AND deleted_at IS NULL UNION ALL SELECT p.id FROM playlists p JOIN target t ON p.parent_id = t.id WHERE p.deleted_at IS NULL) UPDATE playlists SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, $3), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id IN (SELECT id FROM target) AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { "Left": [ "Int8Array", - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "bf1653c32dc751185372ae8e273141fe40b661e3fb2c5f1a7c14c6dbf1d31515" + "hash": "0578fb0239e07563573ee769185699734f41471a0828d4d128d2e10f06a08abb" } diff --git a/.sqlx/query-07d637eaf0aa3621d92e1de791314ccc28e5cef397d05030171d3cdbdb913cf9.json b/.sqlx/query-07d637eaf0aa3621d92e1de791314ccc28e5cef397d05030171d3cdbdb913cf9.json index 9273d009..0aa7b004 100644 --- a/.sqlx/query-07d637eaf0aa3621d92e1de791314ccc28e5cef397d05030171d3cdbdb913cf9.json +++ b/.sqlx/query-07d637eaf0aa3621d92e1de791314ccc28e5cef397d05030171d3cdbdb913cf9.json @@ -7,7 +7,7 @@ "Left": [ "Int8", "Timestamptz", - "Text" + "Int2" ] }, "nullable": [] diff --git a/.sqlx/query-b6d93203a1163b4d9f14ee313e355c14f04af26f01f41d0e38b34fc9b5f6c49a.json b/.sqlx/query-0857bf3b0f9a3e3b5c04aef43f2e66a67ecada100d9e8dda11e22e7061c711d0.json similarity index 69% rename from .sqlx/query-b6d93203a1163b4d9f14ee313e355c14f04af26f01f41d0e38b34fc9b5f6c49a.json rename to .sqlx/query-0857bf3b0f9a3e3b5c04aef43f2e66a67ecada100d9e8dda11e22e7061c711d0.json index b9d6cea0..736e4290 100644 --- a/.sqlx/query-b6d93203a1163b4d9f14ee313e355c14f04af26f01f41d0e38b34fc9b5f6c49a.json +++ b/.sqlx/query-0857bf3b0f9a3e3b5c04aef43f2e66a67ecada100d9e8dda11e22e7061c711d0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT deleted_at, deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\" FROM media WHERE id = $1", + "query": "SELECT deleted_at,\n deletion_source AS \"deletion_source?: DeletionSource\",\n deleted_owner_id AS \"deleted_owner_id: UserId\"\n FROM media WHERE id = $1", "describe": { "columns": [ { @@ -16,8 +16,8 @@ }, { "ordinal": 1, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "media", @@ -48,5 +48,5 @@ true ] }, - "hash": "b6d93203a1163b4d9f14ee313e355c14f04af26f01f41d0e38b34fc9b5f6c49a" + "hash": "0857bf3b0f9a3e3b5c04aef43f2e66a67ecada100d9e8dda11e22e7061c711d0" } diff --git a/.sqlx/query-09cd7f97577e4bcd61b057b3652689f4e53feb7e3283befd3f5b9ab7f7b37959.json b/.sqlx/query-09cd7f97577e4bcd61b057b3652689f4e53feb7e3283befd3f5b9ab7f7b37959.json new file mode 100644 index 00000000..8e7be826 --- /dev/null +++ b/.sqlx/query-09cd7f97577e4bcd61b057b3652689f4e53feb7e3283befd3f5b9ab7f7b37959.json @@ -0,0 +1,17 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $4, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_instance_name = $2 AND provider_user_id = $3 AND deleted_at IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Text", + "Text", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "09cd7f97577e4bcd61b057b3652689f4e53feb7e3283befd3f5b9ab7f7b37959" +} diff --git a/.sqlx/query-1f6d478b1801be515478651cd6d99fafd1875e5fd4d86f624025a545f6377c7e.json b/.sqlx/query-0c3c33a7c12a27e3780f6690b73a824cecee73db33ba1cbe5b943acfc8ef241d.json similarity index 75% rename from .sqlx/query-1f6d478b1801be515478651cd6d99fafd1875e5fd4d86f624025a545f6377c7e.json rename to .sqlx/query-0c3c33a7c12a27e3780f6690b73a824cecee73db33ba1cbe5b943acfc8ef241d.json index 78e40434..18ebe21f 100644 --- a/.sqlx/query-1f6d478b1801be515478651cd6d99fafd1875e5fd4d86f624025a545f6377c7e.json +++ b/.sqlx/query-0c3c33a7c12a27e3780f6690b73a824cecee73db33ba1cbe5b943acfc8ef241d.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO playlists (\n room_id, creator_id, name, position, deleted_at,\n deletion_source, deleted_owner_id\n )\n VALUES ($1, $2, 'account-delete', 3.0, $3, 'account', $2)\n RETURNING id", + "query": "INSERT INTO playlists (\n room_id, creator_id, name, position, deleted_at,\n deletion_source, deleted_owner_id\n )\n VALUES ($1, $2, 'account-delete', 3.0, $3, $4, $2)\n RETURNING id", "describe": { "columns": [ { @@ -19,12 +19,13 @@ "Left": [ "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "1f6d478b1801be515478651cd6d99fafd1875e5fd4d86f624025a545f6377c7e" + "hash": "0c3c33a7c12a27e3780f6690b73a824cecee73db33ba1cbe5b943acfc8ef241d" } diff --git a/.sqlx/query-0ce043d5ce36b5e7acc6d82491919923972103169610860dfa64f5385d6a10b5.json b/.sqlx/query-0ce043d5ce36b5e7acc6d82491919923972103169610860dfa64f5385d6a10b5.json deleted file mode 100644 index 4e0256b2..00000000 --- a/.sqlx/query-0ce043d5ce36b5e7acc6d82491919923972103169610860dfa64f5385d6a10b5.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'account', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - }, - "hash": "0ce043d5ce36b5e7acc6d82491919923972103169610860dfa64f5385d6a10b5" -} diff --git a/.sqlx/query-a41ab27b5b22457c67fc070602d3b184b9e867de668926a357942b90b6d70a7b.json b/.sqlx/query-0e589e136bad660334e8731e91b913d83aa0604acb30251838e01cb53f7f198f.json similarity index 69% rename from .sqlx/query-a41ab27b5b22457c67fc070602d3b184b9e867de668926a357942b90b6d70a7b.json rename to .sqlx/query-0e589e136bad660334e8731e91b913d83aa0604acb30251838e01cb53f7f198f.json index c49d0d08..4e70b917 100644 --- a/.sqlx/query-a41ab27b5b22457c67fc070602d3b184b9e867de668926a357942b90b6d70a7b.json +++ b/.sqlx/query-0e589e136bad660334e8731e91b913d83aa0604acb30251838e01cb53f7f198f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id: crate::models::RoomId\"\n FROM rooms\n WHERE id = $1\n AND deleted_at IS NOT NULL\n AND deletion_source = 'account'\n AND deleted_owner_id = $2\n FOR UPDATE\n ", + "query": "\n SELECT id AS \"id: crate::models::RoomId\"\n FROM rooms\n WHERE id = $1\n AND deleted_at IS NOT NULL\n AND deletion_source = $3\n AND deleted_owner_id = $2\n FOR UPDATE\n ", "describe": { "columns": [ { @@ -18,12 +18,13 @@ "parameters": { "Left": [ "Int8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ false ] }, - "hash": "a41ab27b5b22457c67fc070602d3b184b9e867de668926a357942b90b6d70a7b" + "hash": "0e589e136bad660334e8731e91b913d83aa0604acb30251838e01cb53f7f198f" } diff --git a/.sqlx/query-23f36d9bfe00dcd8f9ca5b8d7685550e5becc992e82b692dc4ecd9871eea5980.json b/.sqlx/query-133937f1cceaeeae64e2d508e4115f35a3e46de1a5e85a7b43b5e4a8087f7c13.json similarity index 57% rename from .sqlx/query-23f36d9bfe00dcd8f9ca5b8d7685550e5becc992e82b692dc4ecd9871eea5980.json rename to .sqlx/query-133937f1cceaeeae64e2d508e4115f35a3e46de1a5e85a7b43b5e4a8087f7c13.json index 1e28d981..ba6c4153 100644 --- a/.sqlx/query-23f36d9bfe00dcd8f9ca5b8d7685550e5becc992e82b692dc4ecd9871eea5980.json +++ b/.sqlx/query-133937f1cceaeeae64e2d508e4115f35a3e46de1a5e85a7b43b5e4a8087f7c13.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id\n FROM auth_oauth2_identities\n WHERE deletion_source = 'user'\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", + "query": "\n SELECT id\n FROM auth_oauth2_identities\n WHERE deletion_source = $3\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", "describe": { "columns": [ { @@ -18,12 +18,13 @@ "parameters": { "Left": [ "Int4", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ false ] }, - "hash": "23f36d9bfe00dcd8f9ca5b8d7685550e5becc992e82b692dc4ecd9871eea5980" + "hash": "133937f1cceaeeae64e2d508e4115f35a3e46de1a5e85a7b43b5e4a8087f7c13" } diff --git a/.sqlx/query-53f995070b540554e246500aaf7df27e365e97af3573d726c889ee9ea4dae183.json b/.sqlx/query-13833d662b23c1e94aac481609edca89d176e096bbf5d0de0862d2eb8c866155.json similarity index 56% rename from .sqlx/query-53f995070b540554e246500aaf7df27e365e97af3573d726c889ee9ea4dae183.json rename to .sqlx/query-13833d662b23c1e94aac481609edca89d176e096bbf5d0de0862d2eb8c866155.json index 2524a616..85061a10 100644 --- a/.sqlx/query-53f995070b540554e246500aaf7df27e365e97af3573d726c889ee9ea4dae183.json +++ b/.sqlx/query-13833d662b23c1e94aac481609edca89d176e096bbf5d0de0862d2eb8c866155.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT event_id, sequence\n FROM room_resource_events e\n WHERE e.room_id = $1\n AND e.resource_type = ANY($2::TEXT[])\n AND NOT (\n (e.resource_type = 'chat_pins'\n AND e.aggregate_type = 'chat_message'\n AND EXISTS (\n SELECT 1\n FROM chat_messages m\n WHERE m.room_id = e.room_id\n AND e.aggregate_id = m.id::TEXT\n AND m.deletion_source = 'account'\n ))\n OR (e.resource_type = 'media'\n AND EXISTS (\n SELECT 1\n FROM media m\n WHERE m.room_id = e.room_id\n AND e.resource_id = m.id::TEXT\n AND m.deletion_source = 'account'\n ))\n OR (e.resource_type = 'playlist'\n AND EXISTS (\n SELECT 1\n FROM playlists p\n WHERE p.room_id = e.room_id\n AND e.resource_id = p.id::TEXT\n AND p.deletion_source = 'account'\n ))\n )\n ORDER BY sequence DESC\n LIMIT 1\n ", + "query": "\n SELECT event_id, sequence\n FROM room_resource_events e\n WHERE e.room_id = $1\n AND e.resource_type = ANY($2::TEXT[])\n AND NOT (\n (e.resource_type = 'chat_pins'\n AND e.aggregate_type = 'chat_message'\n AND EXISTS (\n SELECT 1\n FROM chat_messages m\n WHERE m.room_id = e.room_id\n AND e.aggregate_id = m.id::TEXT\n AND m.deletion_source = $3\n ))\n OR (e.resource_type = 'media'\n AND EXISTS (\n SELECT 1\n FROM media m\n WHERE m.room_id = e.room_id\n AND e.resource_id = m.id::TEXT\n AND m.deletion_source = $3\n ))\n OR (e.resource_type = 'playlist'\n AND EXISTS (\n SELECT 1\n FROM playlists p\n WHERE p.room_id = e.room_id\n AND e.resource_id = p.id::TEXT\n AND p.deletion_source = $3\n ))\n )\n ORDER BY sequence DESC\n LIMIT 1\n ", "describe": { "columns": [ { @@ -29,7 +29,8 @@ "parameters": { "Left": [ "Int8", - "TextArray" + "TextArray", + "Int2" ] }, "nullable": [ @@ -37,5 +38,5 @@ false ] }, - "hash": "53f995070b540554e246500aaf7df27e365e97af3573d726c889ee9ea4dae183" + "hash": "13833d662b23c1e94aac481609edca89d176e096bbf5d0de0862d2eb8c866155" } diff --git a/.sqlx/query-190e44c0aab676594a2772ba003dd6b5a32541d6bea783d94468f03bcc515315.json b/.sqlx/query-190e44c0aab676594a2772ba003dd6b5a32541d6bea783d94468f03bcc515315.json deleted file mode 100644 index 3287f41b..00000000 --- a/.sqlx/query-190e44c0aab676594a2772ba003dd6b5a32541d6bea783d94468f03bcc515315.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_instance_name = $2 AND provider_user_id = $3 AND deleted_at IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8", - "Text", - "Text" - ] - }, - "nullable": [] - }, - "hash": "190e44c0aab676594a2772ba003dd6b5a32541d6bea783d94468f03bcc515315" -} diff --git a/.sqlx/query-58ec6e32a37af6ef971c410b18adff46a1d5fb0b6e33d264bab25b2de94ef9a2.json b/.sqlx/query-1941f6974bea11860bb8bccc5226a258a1b8061e3a1548641298158975bfedcc.json similarity index 54% rename from .sqlx/query-58ec6e32a37af6ef971c410b18adff46a1d5fb0b6e33d264bab25b2de94ef9a2.json rename to .sqlx/query-1941f6974bea11860bb8bccc5226a258a1b8061e3a1548641298158975bfedcc.json index b383b666..7b590550 100644 --- a/.sqlx/query-58ec6e32a37af6ef971c410b18adff46a1d5fb0b6e33d264bab25b2de94ef9a2.json +++ b/.sqlx/query-1941f6974bea11860bb8bccc5226a258a1b8061e3a1548641298158975bfedcc.json @@ -1,16 +1,17 @@ { "db_name": "PostgreSQL", - "query": "UPDATE rooms\n SET deleted_at = $2, updated_at = $2,\n deletion_source = 'account', deleted_owner_id = $3\n WHERE id = $1", + "query": "UPDATE rooms\n SET deleted_at = $2, updated_at = $2,\n deletion_source = $4, deleted_owner_id = $3\n WHERE id = $1", "describe": { "columns": [], "parameters": { "Left": [ "Int8", "Timestamptz", - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "58ec6e32a37af6ef971c410b18adff46a1d5fb0b6e33d264bab25b2de94ef9a2" + "hash": "1941f6974bea11860bb8bccc5226a258a1b8061e3a1548641298158975bfedcc" } diff --git a/.sqlx/query-1c15c2ea2b878c9236d61cdee2349d67af6780ba719b44d035060d19e1e94d68.json b/.sqlx/query-1f0885abb44aa0d2886957a27c29a0d3aa9dd070bd5724062a03e56ceb314bdc.json similarity index 93% rename from .sqlx/query-1c15c2ea2b878c9236d61cdee2349d67af6780ba719b44d035060d19e1e94d68.json rename to .sqlx/query-1f0885abb44aa0d2886957a27c29a0d3aa9dd070bd5724062a03e56ceb314bdc.json index 4ae183db..4588bb92 100644 --- a/.sqlx/query-1c15c2ea2b878c9236d61cdee2349d67af6780ba719b44d035060d19e1e94d68.json +++ b/.sqlx/query-1f0885abb44aa0d2886957a27c29a0d3aa9dd070bd5724062a03e56ceb314bdc.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n AND ($2 OR status <> $3)\n AND created_at >= NOW() - INTERVAL '90 days'\n AND message_type = ANY($5::smallint[])\n ORDER BY created_at DESC, id DESC\n LIMIT $4\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM $6\n AND ($2 OR status <> $3)\n AND created_at >= NOW() - INTERVAL '90 days'\n AND message_type = ANY($5::smallint[])\n ORDER BY created_at DESC, id DESC\n LIMIT $4\n ", "describe": { "columns": [ { @@ -186,7 +186,8 @@ "Bool", "Int2", "Int8", - "Int2Array" + "Int2Array", + "Int2" ] }, "nullable": [ @@ -208,5 +209,5 @@ false ] }, - "hash": "1c15c2ea2b878c9236d61cdee2349d67af6780ba719b44d035060d19e1e94d68" + "hash": "1f0885abb44aa0d2886957a27c29a0d3aa9dd070bd5724062a03e56ceb314bdc" } diff --git a/.sqlx/query-02f88c0657be16a9ec46667c1f7348770c50e2aef701412094becaed13f649cc.json b/.sqlx/query-223dcf71e84db1647e51fb76b44605ae3f27a5e5b3416a74840296956cb97fca.json similarity index 51% rename from .sqlx/query-02f88c0657be16a9ec46667c1f7348770c50e2aef701412094becaed13f649cc.json rename to .sqlx/query-223dcf71e84db1647e51fb76b44605ae3f27a5e5b3416a74840296956cb97fca.json index 90184938..3d2975f7 100644 --- a/.sqlx/query-02f88c0657be16a9ec46667c1f7348770c50e2aef701412094becaed13f649cc.json +++ b/.sqlx/query-223dcf71e84db1647e51fb76b44605ae3f27a5e5b3416a74840296956cb97fca.json @@ -1,15 +1,16 @@ { "db_name": "PostgreSQL", - "query": "UPDATE media SET deleted_at = $2, deletion_source = COALESCE(deletion_source, 'room'), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "query": "UPDATE media SET deleted_at = $2, deletion_source = COALESCE(deletion_source, $3), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { "Left": [ "Int8Array", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [] }, - "hash": "02f88c0657be16a9ec46667c1f7348770c50e2aef701412094becaed13f649cc" + "hash": "223dcf71e84db1647e51fb76b44605ae3f27a5e5b3416a74840296956cb97fca" } diff --git a/.sqlx/query-27042baee83358a3b5a191683e65882c500eacc29b0d296cf980da524be50f45.json b/.sqlx/query-27042baee83358a3b5a191683e65882c500eacc29b0d296cf980da524be50f45.json new file mode 100644 index 00000000..db485606 --- /dev/null +++ b/.sqlx/query-27042baee83358a3b5a191683e65882c500eacc29b0d296cf980da524be50f45.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE rooms SET deletion_source = $3, deleted_owner_id = $2 WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Int8", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "27042baee83358a3b5a191683e65882c500eacc29b0d296cf980da524be50f45" +} diff --git a/.sqlx/query-2ff542e4b23abc96dc0046df3ee4e105de3b75d4749988bfccbfffcc835de867.json b/.sqlx/query-2ff542e4b23abc96dc0046df3ee4e105de3b75d4749988bfccbfffcc835de867.json deleted file mode 100644 index c0bd2b05..00000000 --- a/.sqlx/query-2ff542e4b23abc96dc0046df3ee4e105de3b75d4749988bfccbfffcc835de867.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - }, - "hash": "2ff542e4b23abc96dc0046df3ee4e105de3b75d4749988bfccbfffcc835de867" -} diff --git a/.sqlx/query-f5a16bc5d29ee531a010ebceffb6bf619fec5923bd48bd215308a017398cdaab.json b/.sqlx/query-31b79255f574ce5d1fed858ce789f3f5e62b152c390a6394921eb7642540942c.json similarity index 65% rename from .sqlx/query-f5a16bc5d29ee531a010ebceffb6bf619fec5923bd48bd215308a017398cdaab.json rename to .sqlx/query-31b79255f574ce5d1fed858ce789f3f5e62b152c390a6394921eb7642540942c.json index 45c2e731..f1105330 100644 --- a/.sqlx/query-f5a16bc5d29ee531a010ebceffb6bf619fec5923bd48bd215308a017398cdaab.json +++ b/.sqlx/query-31b79255f574ce5d1fed858ce789f3f5e62b152c390a6394921eb7642540942c.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE auth_oauth2_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = $1 AND deletion_source = 'account'", + "query": "UPDATE auth_oauth2_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = $1 AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "f5a16bc5d29ee531a010ebceffb6bf619fec5923bd48bd215308a017398cdaab" + "hash": "31b79255f574ce5d1fed858ce789f3f5e62b152c390a6394921eb7642540942c" } diff --git a/.sqlx/query-6621dfd1df429630c999369ba4d6815ef0ba7241239a7c00a46ec1ac08911530.json b/.sqlx/query-338cabedeeff3cee6a6a4b82d7b7f3e561b3d16ebcbe1f83ca771180ab1a79fe.json similarity index 82% rename from .sqlx/query-6621dfd1df429630c999369ba4d6815ef0ba7241239a7c00a46ec1ac08911530.json rename to .sqlx/query-338cabedeeff3cee6a6a4b82d7b7f3e561b3d16ebcbe1f83ca771180ab1a79fe.json index 133005f3..df5c60f1 100644 --- a/.sqlx/query-6621dfd1df429630c999369ba4d6815ef0ba7241239a7c00a46ec1ac08911530.json +++ b/.sqlx/query-338cabedeeff3cee6a6a4b82d7b7f3e561b3d16ebcbe1f83ca771180ab1a79fe.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO media (\n playlist_id, room_id, creator_id, name, position,\n source_provider, source_config, cover_file_reference_id,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, $3, 'expired-media', 1.0, 1, '{}'::JSONB, $4, $5, 'user')\n RETURNING id", + "query": "INSERT INTO media (\n playlist_id, room_id, creator_id, name, position,\n source_provider, source_config, cover_file_reference_id,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, $3, 'expired-media', 1.0, 1, '{}'::JSONB, $4, $5, $6)\n RETURNING id", "describe": { "columns": [ { @@ -21,12 +21,13 @@ "Int8", "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "6621dfd1df429630c999369ba4d6815ef0ba7241239a7c00a46ec1ac08911530" + "hash": "338cabedeeff3cee6a6a4b82d7b7f3e561b3d16ebcbe1f83ca771180ab1a79fe" } diff --git a/.sqlx/query-fe012af8ab82e5e7ea670041f286de1d58f1885eb711fed766bacb9e050a65f4.json b/.sqlx/query-33b93d28982b988436bde43d4e0cf759de6188a74a97d91991c8151cf5ed5d96.json similarity index 52% rename from .sqlx/query-fe012af8ab82e5e7ea670041f286de1d58f1885eb711fed766bacb9e050a65f4.json rename to .sqlx/query-33b93d28982b988436bde43d4e0cf759de6188a74a97d91991c8151cf5ed5d96.json index 81046dbf..39226498 100644 --- a/.sqlx/query-fe012af8ab82e5e7ea670041f286de1d58f1885eb711fed766bacb9e050a65f4.json +++ b/.sqlx/query-33b93d28982b988436bde43d4e0cf759de6188a74a97d91991c8151cf5ed5d96.json @@ -1,15 +1,16 @@ { "db_name": "PostgreSQL", - "query": "UPDATE chat_messages SET deleted_at = $2, deletion_source = COALESCE(deletion_source, 'room') WHERE room_id = $1 AND deleted_at IS NULL", + "query": "UPDATE chat_messages SET deleted_at = $2, deletion_source = COALESCE(deletion_source, $3) WHERE room_id = $1 AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { "Left": [ "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [] }, - "hash": "fe012af8ab82e5e7ea670041f286de1d58f1885eb711fed766bacb9e050a65f4" + "hash": "33b93d28982b988436bde43d4e0cf759de6188a74a97d91991c8151cf5ed5d96" } diff --git a/.sqlx/query-eb4984b62ac0e9835151f98b5630b4a025f27a601828c0d17900c99dac813a9b.json b/.sqlx/query-3712806aaa504338d9b8245dfc3ab7ffcc53738bf1e16cd91ebe0a0cf793d257.json similarity index 61% rename from .sqlx/query-eb4984b62ac0e9835151f98b5630b4a025f27a601828c0d17900c99dac813a9b.json rename to .sqlx/query-3712806aaa504338d9b8245dfc3ab7ffcc53738bf1e16cd91ebe0a0cf793d257.json index 56e3aeb4..30e2f032 100644 --- a/.sqlx/query-eb4984b62ac0e9835151f98b5630b4a025f27a601828c0d17900c99dac813a9b.json +++ b/.sqlx/query-3712806aaa504338d9b8245dfc3ab7ffcc53738bf1e16cd91ebe0a0cf793d257.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "DELETE FROM playlists WHERE id = ANY($1) AND deletion_source = 'user'", + "query": "DELETE FROM playlists WHERE id = ANY($1) AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8Array" + "Int8Array", + "Int2" ] }, "nullable": [] }, - "hash": "eb4984b62ac0e9835151f98b5630b4a025f27a601828c0d17900c99dac813a9b" + "hash": "3712806aaa504338d9b8245dfc3ab7ffcc53738bf1e16cd91ebe0a0cf793d257" } diff --git a/.sqlx/query-316ef140d7b352aefbb5f2a382736fb848b3c02dadf882647bc9a488affb3db0.json b/.sqlx/query-37d5305bf0821dc82ab3fe81792aa4ceb8cfb42c47e3294515999928f2b694d2.json similarity index 78% rename from .sqlx/query-316ef140d7b352aefbb5f2a382736fb848b3c02dadf882647bc9a488affb3db0.json rename to .sqlx/query-37d5305bf0821dc82ab3fe81792aa4ceb8cfb42c47e3294515999928f2b694d2.json index 901e9a0e..7239881b 100644 --- a/.sqlx/query-316ef140d7b352aefbb5f2a382736fb848b3c02dadf882647bc9a488affb3db0.json +++ b/.sqlx/query-37d5305bf0821dc82ab3fe81792aa4ceb8cfb42c47e3294515999928f2b694d2.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT aei.email\n FROM auth_email_identities aei\n JOIN users u ON u.id = aei.user_id\n WHERE u.id = $1\n AND (\n (u.deleted_at IS NULL AND aei.deleted_at IS NULL)\n OR (\n u.deleted_at IS NOT NULL\n AND aei.deleted_at IS NOT NULL\n AND aei.deletion_source = 'account'\n )\n )\n ", + "query": "\n SELECT aei.email\n FROM auth_email_identities aei\n JOIN users u ON u.id = aei.user_id\n WHERE u.id = $1\n AND (\n (u.deleted_at IS NULL AND aei.deleted_at IS NULL)\n OR (\n u.deleted_at IS NOT NULL\n AND aei.deleted_at IS NOT NULL\n AND aei.deletion_source = $2\n )\n )\n ", "describe": { "columns": [ { @@ -17,12 +17,13 @@ ], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [ false ] }, - "hash": "316ef140d7b352aefbb5f2a382736fb848b3c02dadf882647bc9a488affb3db0" + "hash": "37d5305bf0821dc82ab3fe81792aa4ceb8cfb42c47e3294515999928f2b694d2" } diff --git a/.sqlx/query-d710f6f4e14dfffbd73ec22a384506638e809e663e1e5b35893a3ad72b2536f0.json b/.sqlx/query-38fbc48567c9e2928ef237e12db41e52ea9011b291800e972b453c540b1f5ca9.json similarity index 62% rename from .sqlx/query-d710f6f4e14dfffbd73ec22a384506638e809e663e1e5b35893a3ad72b2536f0.json rename to .sqlx/query-38fbc48567c9e2928ef237e12db41e52ea9011b291800e972b453c540b1f5ca9.json index 0923d323..4f387b46 100644 --- a/.sqlx/query-d710f6f4e14dfffbd73ec22a384506638e809e663e1e5b35893a3ad72b2536f0.json +++ b/.sqlx/query-38fbc48567c9e2928ef237e12db41e52ea9011b291800e972b453c540b1f5ca9.json @@ -1,15 +1,16 @@ { "db_name": "PostgreSQL", - "query": "UPDATE auth_email_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND LOWER(email) = LOWER($2) AND deletion_source = 'account'", + "query": "UPDATE auth_email_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND LOWER(email) = LOWER($2) AND deletion_source = $3", "describe": { "columns": [], "parameters": { "Left": [ "Int8", - "Text" + "Text", + "Int2" ] }, "nullable": [] }, - "hash": "d710f6f4e14dfffbd73ec22a384506638e809e663e1e5b35893a3ad72b2536f0" + "hash": "38fbc48567c9e2928ef237e12db41e52ea9011b291800e972b453c540b1f5ca9" } diff --git a/.sqlx/query-499434947e960ce6bd9ed7e3e3c0e3be1cbb7b079d9c6be715590e9fe0c66ead.json b/.sqlx/query-39bb90985bff4d866832022c83157eaae8edab1d933a4c764c5dc097b6aaed8c.json similarity index 59% rename from .sqlx/query-499434947e960ce6bd9ed7e3e3c0e3be1cbb7b079d9c6be715590e9fe0c66ead.json rename to .sqlx/query-39bb90985bff4d866832022c83157eaae8edab1d933a4c764c5dc097b6aaed8c.json index 3581cc0d..0a9a3689 100644 --- a/.sqlx/query-499434947e960ce6bd9ed7e3e3c0e3be1cbb7b079d9c6be715590e9fe0c66ead.json +++ b/.sqlx/query-39bb90985bff4d866832022c83157eaae8edab1d933a4c764c5dc097b6aaed8c.json @@ -1,12 +1,12 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT deletion_source,\n deleted_owner_id AS \"deleted_owner_id?: crate::models::UserId\"\n FROM rooms\n WHERE id = $1\n ", + "query": "\n SELECT deletion_source AS \"deletion_source?: DeletionSource\",\n deleted_owner_id AS \"deleted_owner_id?: crate::models::UserId\"\n FROM rooms\n WHERE id = $1\n ", "describe": { "columns": [ { "ordinal": 0, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "rooms", @@ -36,5 +36,5 @@ true ] }, - "hash": "499434947e960ce6bd9ed7e3e3c0e3be1cbb7b079d9c6be715590e9fe0c66ead" + "hash": "39bb90985bff4d866832022c83157eaae8edab1d933a4c764c5dc097b6aaed8c" } diff --git a/.sqlx/query-39cbb70af94a3730aabf1df6c9305fd60e2818a505afa59e8d1b7f78947db2a5.json b/.sqlx/query-39cbb70af94a3730aabf1df6c9305fd60e2818a505afa59e8d1b7f78947db2a5.json deleted file mode 100644 index 24f0cc53..00000000 --- a/.sqlx/query-39cbb70af94a3730aabf1df6c9305fd60e2818a505afa59e8d1b7f78947db2a5.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE playlists SET deletion_source = 'account', deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8Array", - "Int8" - ] - }, - "nullable": [] - }, - "hash": "39cbb70af94a3730aabf1df6c9305fd60e2818a505afa59e8d1b7f78947db2a5" -} diff --git a/.sqlx/query-39f1ad8834c902ebc11d1e3680815be9c38515e50e83738231afec1526e97676.json b/.sqlx/query-39f1ad8834c902ebc11d1e3680815be9c38515e50e83738231afec1526e97676.json new file mode 100644 index 00000000..efaa011a --- /dev/null +++ b/.sqlx/query-39f1ad8834c902ebc11d1e3680815be9c38515e50e83738231afec1526e97676.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE media SET deletion_source = $3, deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8Array", + "Int8", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "39f1ad8834c902ebc11d1e3680815be9c38515e50e83738231afec1526e97676" +} diff --git a/.sqlx/query-d8e3c37503a2934ab7e6a06a2aecc11a7682d1e1d1380b1f6f6c0f81408ff3c6.json b/.sqlx/query-3d6da35d6820ad5a94f8a8e3945fa1e72d3a8eb59276104e3a924e1f937db78c.json similarity index 72% rename from .sqlx/query-d8e3c37503a2934ab7e6a06a2aecc11a7682d1e1d1380b1f6f6c0f81408ff3c6.json rename to .sqlx/query-3d6da35d6820ad5a94f8a8e3945fa1e72d3a8eb59276104e3a924e1f937db78c.json index 291d4535..e4c6cc7e 100644 --- a/.sqlx/query-d8e3c37503a2934ab7e6a06a2aecc11a7682d1e1d1380b1f6f6c0f81408ff3c6.json +++ b/.sqlx/query-3d6da35d6820ad5a94f8a8e3945fa1e72d3a8eb59276104e3a924e1f937db78c.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE playlists SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "query": "UPDATE playlists SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "d8e3c37503a2934ab7e6a06a2aecc11a7682d1e1d1380b1f6f6c0f81408ff3c6" + "hash": "3d6da35d6820ad5a94f8a8e3945fa1e72d3a8eb59276104e3a924e1f937db78c" } diff --git a/.sqlx/query-402725084638d288edd012a9ff26c79860d25c4abd0ea0ad410d9371c387c560.json b/.sqlx/query-402725084638d288edd012a9ff26c79860d25c4abd0ea0ad410d9371c387c560.json new file mode 100644 index 00000000..7d05c87e --- /dev/null +++ b/.sqlx/query-402725084638d288edd012a9ff26c79860d25c4abd0ea0ad410d9371c387c560.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE playlists SET deletion_source = $3, deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8Array", + "Int8", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "402725084638d288edd012a9ff26c79860d25c4abd0ea0ad410d9371c387c560" +} diff --git a/.sqlx/query-e45511aa1e3fe00e808739570075d5282b390cb49830592f7409935305602030.json b/.sqlx/query-40c88728aef49462472c91c34e9657e0cdde262bdc0d6074ecf4f76a19f636de.json similarity index 53% rename from .sqlx/query-e45511aa1e3fe00e808739570075d5282b390cb49830592f7409935305602030.json rename to .sqlx/query-40c88728aef49462472c91c34e9657e0cdde262bdc0d6074ecf4f76a19f636de.json index 574bf6bc..3d5bd735 100644 --- a/.sqlx/query-e45511aa1e3fe00e808739570075d5282b390cb49830592f7409935305602030.json +++ b/.sqlx/query-40c88728aef49462472c91c34e9657e0cdde262bdc0d6074ecf4f76a19f636de.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = 'user',\n version = version + 1\n WHERE id = $1 AND deleted_at IS NULL\n ", + "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = $2,\n version = version + 1\n WHERE playlist_id = $1 AND deleted_at IS NULL\n ", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "e45511aa1e3fe00e808739570075d5282b390cb49830592f7409935305602030" + "hash": "40c88728aef49462472c91c34e9657e0cdde262bdc0d6074ecf4f76a19f636de" } diff --git a/.sqlx/query-42869da45366f4f87b7d5767d1d0fec79ec17b58e6f4cc5d7d0c1b1c3802dd66.json b/.sqlx/query-42869da45366f4f87b7d5767d1d0fec79ec17b58e6f4cc5d7d0c1b1c3802dd66.json deleted file mode 100644 index b8c5a756..00000000 --- a/.sqlx/query-42869da45366f4f87b7d5767d1d0fec79ec17b58e6f4cc5d7d0c1b1c3802dd66.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE chat_messages SET deletion_source = 'account', deleted_owner_id = $2 WHERE room_id = $1 AND deleted_at = $3 AND deletion_source = 'room' AND deleted_owner_id IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8", - "Int8", - "Timestamptz" - ] - }, - "nullable": [] - }, - "hash": "42869da45366f4f87b7d5767d1d0fec79ec17b58e6f4cc5d7d0c1b1c3802dd66" -} diff --git a/.sqlx/query-45c31347c935dea83fa8e85b9b0559bd14e86f950ca9dd6bcbde4115b7f13a4f.json b/.sqlx/query-45c31347c935dea83fa8e85b9b0559bd14e86f950ca9dd6bcbde4115b7f13a4f.json new file mode 100644 index 00000000..fdac182d --- /dev/null +++ b/.sqlx/query-45c31347c935dea83fa8e85b9b0559bd14e86f950ca9dd6bcbde4115b7f13a4f.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE media SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, $3), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8Array", + "Int8", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "45c31347c935dea83fa8e85b9b0559bd14e86f950ca9dd6bcbde4115b7f13a4f" +} diff --git a/.sqlx/query-787dfc672def6a259b333e97cf618d7b34ae2252c0eeccca0fa91677538f8504.json b/.sqlx/query-4ff5fa022f22d915a9e5b0a8a0779b5cba054363719b751f2942bfa7b36a9690.json similarity index 91% rename from .sqlx/query-787dfc672def6a259b333e97cf618d7b34ae2252c0eeccca0fa91677538f8504.json rename to .sqlx/query-4ff5fa022f22d915a9e5b0a8a0779b5cba054363719b751f2942bfa7b36a9690.json index 0da3cbd2..6c4bda6d 100644 --- a/.sqlx/query-787dfc672def6a259b333e97cf618d7b34ae2252c0eeccca0fa91677538f8504.json +++ b/.sqlx/query-4ff5fa022f22d915a9e5b0a8a0779b5cba054363719b751f2942bfa7b36a9690.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH search_terms AS (\n SELECT websearch_to_tsquery('simple', $2) AS tsquery\n )\n SELECT m.id AS \"id!\",\n m.room_id AS \"room_id!: RoomId\",\n m.user_id AS \"user_id?: UserId\",\n m.client_message_id,\n m.content AS \"content!\",\n m.message_type AS \"message_type!: ChatMessageType\",\n m.status AS \"status!: ChatMessageStatus\",\n m.version AS \"version!\",\n m.reply_to_message_id,\n m.reply_to_message_created_at,\n m.metadata AS \"metadata?: ChatMetadata\",\n m.edited_at,\n m.deleted_at,\n m.deleted_by AS \"deleted_by?: UserId\",\n m.delete_reason,\n m.created_at AS \"created_at!\"\n FROM chat_messages m\n CROSS JOIN search_terms st\n WHERE m.room_id = $1\n AND m.deletion_source IS DISTINCT FROM 'account'\n AND (m.content_search @@ st.tsquery OR m.content ILIKE $3 ESCAPE '\\')\n AND ($4 OR m.status <> $5)\n AND ($6::bigint IS NULL OR m.user_id = $6)\n AND (m.created_at, m.id) < ($7, $8)\n ORDER BY m.created_at DESC, m.id DESC\n LIMIT $9\n ", + "query": "\n WITH search_terms AS (\n SELECT websearch_to_tsquery('simple', $2) AS tsquery\n )\n SELECT m.id AS \"id!\",\n m.room_id AS \"room_id!: RoomId\",\n m.user_id AS \"user_id?: UserId\",\n m.client_message_id,\n m.content AS \"content!\",\n m.message_type AS \"message_type!: ChatMessageType\",\n m.status AS \"status!: ChatMessageStatus\",\n m.version AS \"version!\",\n m.reply_to_message_id,\n m.reply_to_message_created_at,\n m.metadata AS \"metadata?: ChatMetadata\",\n m.edited_at,\n m.deleted_at,\n m.deleted_by AS \"deleted_by?: UserId\",\n m.delete_reason,\n m.created_at AS \"created_at!\"\n FROM chat_messages m\n CROSS JOIN search_terms st\n WHERE m.room_id = $1\n AND m.deletion_source IS DISTINCT FROM $10\n AND (m.content_search @@ st.tsquery OR m.content ILIKE $3 ESCAPE '\\')\n AND ($4 OR m.status <> $5)\n AND ($6::bigint IS NULL OR m.user_id = $6)\n AND (m.created_at, m.id) < ($7, $8)\n ORDER BY m.created_at DESC, m.id DESC\n LIMIT $9\n ", "describe": { "columns": [ { @@ -190,7 +190,8 @@ "Int8", "Timestamptz", "Int8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -212,5 +213,5 @@ false ] }, - "hash": "787dfc672def6a259b333e97cf618d7b34ae2252c0eeccca0fa91677538f8504" + "hash": "4ff5fa022f22d915a9e5b0a8a0779b5cba054363719b751f2942bfa7b36a9690" } diff --git a/.sqlx/query-7561186702456fb9886a6b224d1466d2beb74e81280fec5686e89edb6c8eb3f1.json b/.sqlx/query-54313833a6cee855e8de7b0c6dad45c278b6cf13481bcdf608016a46e08079f6.json similarity index 58% rename from .sqlx/query-7561186702456fb9886a6b224d1466d2beb74e81280fec5686e89edb6c8eb3f1.json rename to .sqlx/query-54313833a6cee855e8de7b0c6dad45c278b6cf13481bcdf608016a46e08079f6.json index ddc9e14a..d7d5fbcb 100644 --- a/.sqlx/query-7561186702456fb9886a6b224d1466d2beb74e81280fec5686e89edb6c8eb3f1.json +++ b/.sqlx/query-54313833a6cee855e8de7b0c6dad45c278b6cf13481bcdf608016a46e08079f6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT COUNT(*) AS \"count!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n AND status <> $2\n AND (user_id IS NULL OR user_id <> $3)\n AND created_at >= NOW() - INTERVAL '90 days'\n ", + "query": "\n SELECT COUNT(*) AS \"count!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM $4\n AND status <> $2\n AND (user_id IS NULL OR user_id <> $3)\n AND created_at >= NOW() - INTERVAL '90 days'\n ", "describe": { "columns": [ { @@ -14,12 +14,13 @@ "Left": [ "Int8", "Int2", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ null ] }, - "hash": "7561186702456fb9886a6b224d1466d2beb74e81280fec5686e89edb6c8eb3f1" + "hash": "54313833a6cee855e8de7b0c6dad45c278b6cf13481bcdf608016a46e08079f6" } diff --git a/.sqlx/query-550db6e1d4e55125df37f0fcb3cb7528cc13055c3080ef5702981911058a6eee.json b/.sqlx/query-550db6e1d4e55125df37f0fcb3cb7528cc13055c3080ef5702981911058a6eee.json deleted file mode 100644 index a1cb3545..00000000 --- a/.sqlx/query-550db6e1d4e55125df37f0fcb3cb7528cc13055c3080ef5702981911058a6eee.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "SELECT deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\"\n FROM playlists\n WHERE id = ANY($1)\n UNION ALL\n SELECT deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\"\n FROM media\n WHERE id = ANY($2)", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "deletion_source", - "type_info": "Text", - "origin": "Expression" - }, - { - "ordinal": 1, - "name": "deleted_owner_id: UserId", - "type_info": "Int8", - "origin": "Expression" - } - ], - "parameters": { - "Left": [ - "Int8Array", - "Int8Array" - ] - }, - "nullable": [ - null, - null - ] - }, - "hash": "550db6e1d4e55125df37f0fcb3cb7528cc13055c3080ef5702981911058a6eee" -} diff --git a/.sqlx/query-97405243984b25d1133581fa9242c3750f3bfeb9584db7086a860f071172bd47.json b/.sqlx/query-5600661453309777113995d3064644655db437327cc18852eae8607b1ad3c796.json similarity index 54% rename from .sqlx/query-97405243984b25d1133581fa9242c3750f3bfeb9584db7086a860f071172bd47.json rename to .sqlx/query-5600661453309777113995d3064644655db437327cc18852eae8607b1ad3c796.json index 3eac41e2..a6acdc0d 100644 --- a/.sqlx/query-97405243984b25d1133581fa9242c3750f3bfeb9584db7086a860f071172bd47.json +++ b/.sqlx/query-5600661453309777113995d3064644655db437327cc18852eae8607b1ad3c796.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = 'user',\n version = version + 1\n WHERE id = ANY($1) AND deleted_at IS NULL\n ", + "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = $2,\n version = version + 1\n WHERE id = $1 AND deleted_at IS NULL\n ", "describe": { "columns": [], "parameters": { "Left": [ - "Int8Array" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "97405243984b25d1133581fa9242c3750f3bfeb9584db7086a860f071172bd47" + "hash": "5600661453309777113995d3064644655db437327cc18852eae8607b1ad3c796" } diff --git a/.sqlx/query-b77c5345d314c7b96e2db7782717e41c807b82c44df14ead9a574cc0b56bf0bf.json b/.sqlx/query-565ee0913874b50d05ea625bf4443eab2e28b5b58e188d960c2e52046a742f0e.json similarity index 85% rename from .sqlx/query-b77c5345d314c7b96e2db7782717e41c807b82c44df14ead9a574cc0b56bf0bf.json rename to .sqlx/query-565ee0913874b50d05ea625bf4443eab2e28b5b58e188d960c2e52046a742f0e.json index f06c4b31..27f6b577 100644 --- a/.sqlx/query-b77c5345d314c7b96e2db7782717e41c807b82c44df14ead9a574cc0b56bf0bf.json +++ b/.sqlx/query-565ee0913874b50d05ea625bf4443eab2e28b5b58e188d960c2e52046a742f0e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM 'account'\n WHERE e.room_id = $1\n AND e.event_type = ANY($2::text[])\n AND e.message_id = $3\n AND e.message_created_at = $4\n ORDER BY sequence DESC\n LIMIT 1\n ", + "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM $5\n WHERE e.room_id = $1\n AND e.event_type = ANY($2::text[])\n AND e.message_id = $3\n AND e.message_created_at = $4\n ORDER BY sequence DESC\n LIMIT 1\n ", "describe": { "columns": [ { @@ -75,7 +75,8 @@ "Int8", "TextArray", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ @@ -87,5 +88,5 @@ false ] }, - "hash": "b77c5345d314c7b96e2db7782717e41c807b82c44df14ead9a574cc0b56bf0bf" + "hash": "565ee0913874b50d05ea625bf4443eab2e28b5b58e188d960c2e52046a742f0e" } diff --git a/.sqlx/query-9c430c4cb5fd8fb903580f90c8bdd045d87f2e7c49ec0134e3a5f434e4470267.json b/.sqlx/query-5dcc1931221eaac6001584d14334dd80825223cc48176442307581862abad86b.json similarity index 66% rename from .sqlx/query-9c430c4cb5fd8fb903580f90c8bdd045d87f2e7c49ec0134e3a5f434e4470267.json rename to .sqlx/query-5dcc1931221eaac6001584d14334dd80825223cc48176442307581862abad86b.json index 974112a4..6f4a9b90 100644 --- a/.sqlx/query-9c430c4cb5fd8fb903580f90c8bdd045d87f2e7c49ec0134e3a5f434e4470267.json +++ b/.sqlx/query-5dcc1931221eaac6001584d14334dd80825223cc48176442307581862abad86b.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT deleted_at, deletion_source FROM media WHERE id = $1", + "query": "SELECT deleted_at,\n deletion_source AS \"deletion_source?: DeletionSource\"\n FROM media WHERE id = $1", "describe": { "columns": [ { @@ -16,8 +16,8 @@ }, { "ordinal": 1, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "media", @@ -36,5 +36,5 @@ true ] }, - "hash": "9c430c4cb5fd8fb903580f90c8bdd045d87f2e7c49ec0134e3a5f434e4470267" + "hash": "5dcc1931221eaac6001584d14334dd80825223cc48176442307581862abad86b" } diff --git a/.sqlx/query-2a2786a35b1aead69e0914bccb12784f3ed3323f7564388246492f4b5d1d7e6f.json b/.sqlx/query-5e64d3186df37b2e4fdc367318040b54a9131a32242750681e2259a0db97ba2a.json similarity index 76% rename from .sqlx/query-2a2786a35b1aead69e0914bccb12784f3ed3323f7564388246492f4b5d1d7e6f.json rename to .sqlx/query-5e64d3186df37b2e4fdc367318040b54a9131a32242750681e2259a0db97ba2a.json index f67a56c4..f935983f 100644 --- a/.sqlx/query-2a2786a35b1aead69e0914bccb12784f3ed3323f7564388246492f4b5d1d7e6f.json +++ b/.sqlx/query-5e64d3186df37b2e4fdc367318040b54a9131a32242750681e2259a0db97ba2a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO playlists (\n room_id, creator_id, name, parent_id, position,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'retained-other-user-child', $3, 1.0, $4, 'user')\n RETURNING id", + "query": "INSERT INTO playlists (\n room_id, creator_id, name, parent_id, position,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'expired-child', $3, 1.0, $4, $5)\n RETURNING id", "describe": { "columns": [ { @@ -20,12 +20,13 @@ "Int8", "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "2a2786a35b1aead69e0914bccb12784f3ed3323f7564388246492f4b5d1d7e6f" + "hash": "5e64d3186df37b2e4fdc367318040b54a9131a32242750681e2259a0db97ba2a" } diff --git a/.sqlx/query-f57b0b56bb2a76ba1d0e4767e48d975e1088067316724a2dc15e9d7062d393af.json b/.sqlx/query-5e93e3eabc027a4e3a6ad250cf5c53f6e14e17bfa47b6754d4c832ffe4fb96e0.json similarity index 65% rename from .sqlx/query-f57b0b56bb2a76ba1d0e4767e48d975e1088067316724a2dc15e9d7062d393af.json rename to .sqlx/query-5e93e3eabc027a4e3a6ad250cf5c53f6e14e17bfa47b6754d4c832ffe4fb96e0.json index 68f3a8c8..82b6513f 100644 --- a/.sqlx/query-f57b0b56bb2a76ba1d0e4767e48d975e1088067316724a2dc15e9d7062d393af.json +++ b/.sqlx/query-5e93e3eabc027a4e3a6ad250cf5c53f6e14e17bfa47b6754d4c832ffe4fb96e0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT deleted_at, deletion_source FROM auth_oauth2_identities WHERE user_id = $1", + "query": "SELECT deleted_at,\n deletion_source AS \"deletion_source?: DeletionSource\"\n FROM auth_oauth2_identities WHERE user_id = $1", "describe": { "columns": [ { @@ -16,8 +16,8 @@ }, { "ordinal": 1, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "auth_oauth2_identities", @@ -36,5 +36,5 @@ true ] }, - "hash": "f57b0b56bb2a76ba1d0e4767e48d975e1088067316724a2dc15e9d7062d393af" + "hash": "5e93e3eabc027a4e3a6ad250cf5c53f6e14e17bfa47b6754d4c832ffe4fb96e0" } diff --git a/.sqlx/query-7d2e33b1b78eaec7a9bc9297d96738916b304e48efbdaad503df4cf0484c6fbc.json b/.sqlx/query-5ee4d290817b42e61d97a4844e58fa3dc498a08b9a45269e480addecabdafa90.json similarity index 59% rename from .sqlx/query-7d2e33b1b78eaec7a9bc9297d96738916b304e48efbdaad503df4cf0484c6fbc.json rename to .sqlx/query-5ee4d290817b42e61d97a4844e58fa3dc498a08b9a45269e480addecabdafa90.json index f3132d70..1a64ee17 100644 --- a/.sqlx/query-7d2e33b1b78eaec7a9bc9297d96738916b304e48efbdaad503df4cf0484c6fbc.json +++ b/.sqlx/query-5ee4d290817b42e61d97a4844e58fa3dc498a08b9a45269e480addecabdafa90.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "DELETE FROM auth_email_identities WHERE id = ANY($1) AND deletion_source = 'user'", + "query": "DELETE FROM auth_email_identities WHERE id = ANY($1) AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8Array" + "Int8Array", + "Int2" ] }, "nullable": [] }, - "hash": "7d2e33b1b78eaec7a9bc9297d96738916b304e48efbdaad503df4cf0484c6fbc" + "hash": "5ee4d290817b42e61d97a4844e58fa3dc498a08b9a45269e480addecabdafa90" } diff --git a/.sqlx/query-1e98756a4a648583eb3df442dc496a2917f2b302ee9c2e61587c8439bfa2f226.json b/.sqlx/query-64df33ec837e28728702879f32e422580ddcf30df46000393098ff1e99a13eac.json similarity index 55% rename from .sqlx/query-1e98756a4a648583eb3df442dc496a2917f2b302ee9c2e61587c8439bfa2f226.json rename to .sqlx/query-64df33ec837e28728702879f32e422580ddcf30df46000393098ff1e99a13eac.json index a8d6ca3f..d2902707 100644 --- a/.sqlx/query-1e98756a4a648583eb3df442dc496a2917f2b302ee9c2e61587c8439bfa2f226.json +++ b/.sqlx/query-64df33ec837e28728702879f32e422580ddcf30df46000393098ff1e99a13eac.json @@ -1,12 +1,12 @@ { "db_name": "PostgreSQL", - "query": "SELECT deletion_source FROM auth_email_identities WHERE user_id = $1", + "query": "SELECT deletion_source AS \"deletion_source?: DeletionSource\"\n FROM auth_email_identities WHERE user_id = $1", "describe": { "columns": [ { "ordinal": 0, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "auth_email_identities", @@ -24,5 +24,5 @@ true ] }, - "hash": "1e98756a4a648583eb3df442dc496a2917f2b302ee9c2e61587c8439bfa2f226" + "hash": "64df33ec837e28728702879f32e422580ddcf30df46000393098ff1e99a13eac" } diff --git a/.sqlx/query-6a191d04a7c7ca618aed997c9789725ebf580566e6781e6ac082a6d797af4a71.json b/.sqlx/query-6a191d04a7c7ca618aed997c9789725ebf580566e6781e6ac082a6d797af4a71.json new file mode 100644 index 00000000..07928a36 --- /dev/null +++ b/.sqlx/query-6a191d04a7c7ca618aed997c9789725ebf580566e6781e6ac082a6d797af4a71.json @@ -0,0 +1,18 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE chat_messages SET deletion_source = $4, deleted_owner_id = $2 WHERE room_id = $1 AND deleted_at = $3 AND deletion_source = $5 AND deleted_owner_id IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Int8", + "Timestamptz", + "Int2", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "6a191d04a7c7ca618aed997c9789725ebf580566e6781e6ac082a6d797af4a71" +} diff --git a/.sqlx/query-d7b6b7f53e4b3e081c0732fe3c2dd4c9ca7322cdd9ac4e08c9168b0655eac8ca.json b/.sqlx/query-6a79f393465ca458b446353cbfb90a464207aab57ac1a403230c895b5cbeaaef.json similarity index 72% rename from .sqlx/query-d7b6b7f53e4b3e081c0732fe3c2dd4c9ca7322cdd9ac4e08c9168b0655eac8ca.json rename to .sqlx/query-6a79f393465ca458b446353cbfb90a464207aab57ac1a403230c895b5cbeaaef.json index 3b2c6e75..907b53a3 100644 --- a/.sqlx/query-d7b6b7f53e4b3e081c0732fe3c2dd4c9ca7322cdd9ac4e08c9168b0655eac8ca.json +++ b/.sqlx/query-6a79f393465ca458b446353cbfb90a464207aab57ac1a403230c895b5cbeaaef.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id AS \"id: RoomId\"\n FROM rooms\n WHERE deleted_owner_id = $1\n AND deletion_source = 'account'\n ORDER BY id\n FOR UPDATE", + "query": "SELECT id AS \"id: RoomId\"\n FROM rooms\n WHERE deleted_owner_id = $1\n AND deletion_source = $2\n ORDER BY id\n FOR UPDATE", "describe": { "columns": [ { @@ -17,12 +17,13 @@ ], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [ false ] }, - "hash": "d7b6b7f53e4b3e081c0732fe3c2dd4c9ca7322cdd9ac4e08c9168b0655eac8ca" + "hash": "6a79f393465ca458b446353cbfb90a464207aab57ac1a403230c895b5cbeaaef" } diff --git a/.sqlx/query-a4cbbdbd2154d47b6f70975d6796c31d86429a9b45af044754d92416d053f6e8.json b/.sqlx/query-6b2b1a6a443394f92d720e61dbbc2ce5cf71ae7e39bbc9f3020af3483d424c78.json similarity index 56% rename from .sqlx/query-a4cbbdbd2154d47b6f70975d6796c31d86429a9b45af044754d92416d053f6e8.json rename to .sqlx/query-6b2b1a6a443394f92d720e61dbbc2ce5cf71ae7e39bbc9f3020af3483d424c78.json index 8c8e54a4..a248d736 100644 --- a/.sqlx/query-a4cbbdbd2154d47b6f70975d6796c31d86429a9b45af044754d92416d053f6e8.json +++ b/.sqlx/query-6b2b1a6a443394f92d720e61dbbc2ce5cf71ae7e39bbc9f3020af3483d424c78.json @@ -1,15 +1,16 @@ { "db_name": "PostgreSQL", - "query": "UPDATE users\n SET deleted_at = $2, updated_at = $2, deletion_source = 'account'\n WHERE id = $1", + "query": "UPDATE users\n SET deleted_at = $2, updated_at = $2, deletion_source = $3\n WHERE id = $1", "describe": { "columns": [], "parameters": { "Left": [ "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [] }, - "hash": "a4cbbdbd2154d47b6f70975d6796c31d86429a9b45af044754d92416d053f6e8" + "hash": "6b2b1a6a443394f92d720e61dbbc2ce5cf71ae7e39bbc9f3020af3483d424c78" } diff --git a/.sqlx/query-6b4a55f508bccc0bfd25976f46d043be5049f8b177654184b5d80d88577dd925.json b/.sqlx/query-6b4a55f508bccc0bfd25976f46d043be5049f8b177654184b5d80d88577dd925.json index d08c3ccd..7177d993 100644 --- a/.sqlx/query-6b4a55f508bccc0bfd25976f46d043be5049f8b177654184b5d80d88577dd925.json +++ b/.sqlx/query-6b4a55f508bccc0bfd25976f46d043be5049f8b177654184b5d80d88577dd925.json @@ -6,7 +6,7 @@ "parameters": { "Left": [ "Int8", - "Text", + "Int2", "Text", "Int8" ] diff --git a/.sqlx/query-6dea9846f586c9e05dff692c1cde65ae6f7e7c870cb9c2951b4370c5abbd3730.json b/.sqlx/query-6dea9846f586c9e05dff692c1cde65ae6f7e7c870cb9c2951b4370c5abbd3730.json deleted file mode 100644 index 15840638..00000000 --- a/.sqlx/query-6dea9846f586c9e05dff692c1cde65ae6f7e7c870cb9c2951b4370c5abbd3730.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n UPDATE chat_messages\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = 'account',\n deleted_owner_id = $1,\n version = version + 1\n WHERE user_id = $1\n AND deleted_at IS NULL\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8" - ] - }, - "nullable": [] - }, - "hash": "6dea9846f586c9e05dff692c1cde65ae6f7e7c870cb9c2951b4370c5abbd3730" -} diff --git a/.sqlx/query-a39ae0eacda654a006e3f07e1908688f56e8010227bb28dc0388a29690adc186.json b/.sqlx/query-6eb23a29af2a778ab562fc389ffcbb89f6c77718cfdc5a6f67ed0d408dab107f.json similarity index 97% rename from .sqlx/query-a39ae0eacda654a006e3f07e1908688f56e8010227bb28dc0388a29690adc186.json rename to .sqlx/query-6eb23a29af2a778ab562fc389ffcbb89f6c77718cfdc5a6f67ed0d408dab107f.json index bf966eeb..8837f3d0 100644 --- a/.sqlx/query-a39ae0eacda654a006e3f07e1908688f56e8010227bb28dc0388a29690adc186.json +++ b/.sqlx/query-6eb23a29af2a778ab562fc389ffcbb89f6c77718cfdc5a6f67ed0d408dab107f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1 AND id = $2\n AND deletion_source IS DISTINCT FROM 'account'\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1 AND id = $2\n AND deletion_source IS DISTINCT FROM $3\n ", "describe": { "columns": [ { @@ -183,7 +183,8 @@ "parameters": { "Left": [ "Int8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -205,5 +206,5 @@ false ] }, - "hash": "a39ae0eacda654a006e3f07e1908688f56e8010227bb28dc0388a29690adc186" + "hash": "6eb23a29af2a778ab562fc389ffcbb89f6c77718cfdc5a6f67ed0d408dab107f" } diff --git a/.sqlx/query-b34aff665e90a2754b82448da1e083032f40f11322aca94926186af90b086397.json b/.sqlx/query-70d766384a03de012c33b406e9f9b7715a01132bc138cb5ad37e510c30ed543b.json similarity index 92% rename from .sqlx/query-b34aff665e90a2754b82448da1e083032f40f11322aca94926186af90b086397.json rename to .sqlx/query-70d766384a03de012c33b406e9f9b7715a01132bc138cb5ad37e510c30ed543b.json index d63bbb55..395ae36d 100644 --- a/.sqlx/query-b34aff665e90a2754b82448da1e083032f40f11322aca94926186af90b086397.json +++ b/.sqlx/query-70d766384a03de012c33b406e9f9b7715a01132bc138cb5ad37e510c30ed543b.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH search_terms AS (\n SELECT websearch_to_tsquery('simple', $2) AS tsquery\n )\n SELECT m.id AS \"id!\",\n m.room_id AS \"room_id!: RoomId\",\n m.user_id AS \"user_id?: UserId\",\n m.client_message_id,\n m.content AS \"content!\",\n m.message_type AS \"message_type!: ChatMessageType\",\n m.status AS \"status!: ChatMessageStatus\",\n m.version AS \"version!\",\n m.reply_to_message_id,\n m.reply_to_message_created_at,\n m.metadata AS \"metadata?: ChatMetadata\",\n m.edited_at,\n m.deleted_at,\n m.deleted_by AS \"deleted_by?: UserId\",\n m.delete_reason,\n m.created_at AS \"created_at!\"\n FROM chat_messages m\n CROSS JOIN search_terms st\n WHERE m.room_id = $1\n AND m.deletion_source IS DISTINCT FROM 'account'\n AND (m.content_search @@ st.tsquery OR m.content ILIKE $3 ESCAPE '\\')\n AND ($4 OR m.status <> $5)\n AND ($6::bigint IS NULL OR m.user_id = $6)\n ORDER BY m.created_at DESC, m.id DESC\n LIMIT $7\n ", + "query": "\n WITH search_terms AS (\n SELECT websearch_to_tsquery('simple', $2) AS tsquery\n )\n SELECT m.id AS \"id!\",\n m.room_id AS \"room_id!: RoomId\",\n m.user_id AS \"user_id?: UserId\",\n m.client_message_id,\n m.content AS \"content!\",\n m.message_type AS \"message_type!: ChatMessageType\",\n m.status AS \"status!: ChatMessageStatus\",\n m.version AS \"version!\",\n m.reply_to_message_id,\n m.reply_to_message_created_at,\n m.metadata AS \"metadata?: ChatMetadata\",\n m.edited_at,\n m.deleted_at,\n m.deleted_by AS \"deleted_by?: UserId\",\n m.delete_reason,\n m.created_at AS \"created_at!\"\n FROM chat_messages m\n CROSS JOIN search_terms st\n WHERE m.room_id = $1\n AND m.deletion_source IS DISTINCT FROM $8\n AND (m.content_search @@ st.tsquery OR m.content ILIKE $3 ESCAPE '\\')\n AND ($4 OR m.status <> $5)\n AND ($6::bigint IS NULL OR m.user_id = $6)\n ORDER BY m.created_at DESC, m.id DESC\n LIMIT $7\n ", "describe": { "columns": [ { @@ -188,7 +188,8 @@ "Bool", "Int2", "Int8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -210,5 +211,5 @@ false ] }, - "hash": "b34aff665e90a2754b82448da1e083032f40f11322aca94926186af90b086397" + "hash": "70d766384a03de012c33b406e9f9b7715a01132bc138cb5ad37e510c30ed543b" } diff --git a/.sqlx/query-c8d1064801ecacd9f0e86e218dfbe80e3dcae9fa69b89afebdd40e0cd340c1ba.json b/.sqlx/query-72131d066a1b6ab6caad963e75f90ad8cd167eb6257faf7346f24a0a9c7e51d3.json similarity index 81% rename from .sqlx/query-c8d1064801ecacd9f0e86e218dfbe80e3dcae9fa69b89afebdd40e0cd340c1ba.json rename to .sqlx/query-72131d066a1b6ab6caad963e75f90ad8cd167eb6257faf7346f24a0a9c7e51d3.json index 2da1252a..d32e1697 100644 --- a/.sqlx/query-c8d1064801ecacd9f0e86e218dfbe80e3dcae9fa69b89afebdd40e0cd340c1ba.json +++ b/.sqlx/query-72131d066a1b6ab6caad963e75f90ad8cd167eb6257faf7346f24a0a9c7e51d3.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO media (\n room_id, creator_id, name, position, source_provider, source_config,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'recent-media', 2.0, 1, '{}'::JSONB, $3, 'user')\n RETURNING id", + "query": "INSERT INTO media (\n room_id, creator_id, name, position, source_provider, source_config,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'recent-media', 2.0, 1, '{}'::JSONB, $3, $4)\n RETURNING id", "describe": { "columns": [ { @@ -19,12 +19,13 @@ "Left": [ "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "c8d1064801ecacd9f0e86e218dfbe80e3dcae9fa69b89afebdd40e0cd340c1ba" + "hash": "72131d066a1b6ab6caad963e75f90ad8cd167eb6257faf7346f24a0a9c7e51d3" } diff --git a/.sqlx/query-8c4a7c5ee5e786fbc180032cb528d11dd2ccc58c8c54da3d79a8374e796775d3.json b/.sqlx/query-75b397a4c143b461fdd9c7f6e8fc7a2fb7d384cec7637946492ae29db442a944.json similarity index 51% rename from .sqlx/query-8c4a7c5ee5e786fbc180032cb528d11dd2ccc58c8c54da3d79a8374e796775d3.json rename to .sqlx/query-75b397a4c143b461fdd9c7f6e8fc7a2fb7d384cec7637946492ae29db442a944.json index fd9300f8..209c5168 100644 --- a/.sqlx/query-8c4a7c5ee5e786fbc180032cb528d11dd2ccc58c8c54da3d79a8374e796775d3.json +++ b/.sqlx/query-75b397a4c143b461fdd9c7f6e8fc7a2fb7d384cec7637946492ae29db442a944.json @@ -1,15 +1,16 @@ { "db_name": "PostgreSQL", - "query": "UPDATE playlists SET deleted_at = $2, deletion_source = COALESCE(deletion_source, 'room'), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "query": "UPDATE playlists SET deleted_at = $2, deletion_source = COALESCE(deletion_source, $3), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { "Left": [ "Int8Array", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [] }, - "hash": "8c4a7c5ee5e786fbc180032cb528d11dd2ccc58c8c54da3d79a8374e796775d3" + "hash": "75b397a4c143b461fdd9c7f6e8fc7a2fb7d384cec7637946492ae29db442a944" } diff --git a/.sqlx/query-75e7484d768a7b1a0d97ffe624ad054cf1c3b4638889e10ae84f8ff07fe191b7.json b/.sqlx/query-75e7484d768a7b1a0d97ffe624ad054cf1c3b4638889e10ae84f8ff07fe191b7.json deleted file mode 100644 index 56ae2532..00000000 --- a/.sqlx/query-75e7484d768a7b1a0d97ffe624ad054cf1c3b4638889e10ae84f8ff07fe191b7.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE media SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, 'account'), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8Array", - "Int8" - ] - }, - "nullable": [] - }, - "hash": "75e7484d768a7b1a0d97ffe624ad054cf1c3b4638889e10ae84f8ff07fe191b7" -} diff --git a/.sqlx/query-eb4f45f823dc9895f89e3513f95213e9df3745bbeb8d9aac980f54d8a9ca9a1d.json b/.sqlx/query-78aff25b51e3b6961ae016df9aac143aad89c410cdb98cc0930310274ec46f48.json similarity index 59% rename from .sqlx/query-eb4f45f823dc9895f89e3513f95213e9df3745bbeb8d9aac980f54d8a9ca9a1d.json rename to .sqlx/query-78aff25b51e3b6961ae016df9aac143aad89c410cdb98cc0930310274ec46f48.json index bde7d709..5b56d759 100644 --- a/.sqlx/query-eb4f45f823dc9895f89e3513f95213e9df3745bbeb8d9aac980f54d8a9ca9a1d.json +++ b/.sqlx/query-78aff25b51e3b6961ae016df9aac143aad89c410cdb98cc0930310274ec46f48.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "DELETE FROM auth_oauth2_identities WHERE id = ANY($1) AND deletion_source = 'user'", + "query": "DELETE FROM auth_oauth2_identities WHERE id = ANY($1) AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8Array" + "Int8Array", + "Int2" ] }, "nullable": [] }, - "hash": "eb4f45f823dc9895f89e3513f95213e9df3745bbeb8d9aac980f54d8a9ca9a1d" + "hash": "78aff25b51e3b6961ae016df9aac143aad89c410cdb98cc0930310274ec46f48" } diff --git a/.sqlx/query-182d24681524f648eeb0b4e7795dcd7db945381416ffacdc65f26b9d2580ea52.json b/.sqlx/query-78e8473ad517877a39a58de3cc96a488c82d477e5e29975e7f3f2e4ccb10e29c.json similarity index 78% rename from .sqlx/query-182d24681524f648eeb0b4e7795dcd7db945381416ffacdc65f26b9d2580ea52.json rename to .sqlx/query-78e8473ad517877a39a58de3cc96a488c82d477e5e29975e7f3f2e4ccb10e29c.json index 9809d22b..a8d3a554 100644 --- a/.sqlx/query-182d24681524f648eeb0b4e7795dcd7db945381416ffacdc65f26b9d2580ea52.json +++ b/.sqlx/query-78e8473ad517877a39a58de3cc96a488c82d477e5e29975e7f3f2e4ccb10e29c.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO playlists (\n room_id, creator_id, name, position, deleted_at, deletion_source\n )\n VALUES ($1, $2, 'retained-user-parent', 1.0, $3, 'user')\n RETURNING id", + "query": "INSERT INTO playlists (\n room_id, creator_id, name, position, deleted_at, deletion_source\n )\n VALUES ($1, $2, 'retained-user-parent', 1.0, $3, $4)\n RETURNING id", "describe": { "columns": [ { @@ -19,12 +19,13 @@ "Left": [ "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "182d24681524f648eeb0b4e7795dcd7db945381416ffacdc65f26b9d2580ea52" + "hash": "78e8473ad517877a39a58de3cc96a488c82d477e5e29975e7f3f2e4ccb10e29c" } diff --git a/.sqlx/query-7929ab3dec6f9c0f1ebf140e7c9fd43632f2069180747fa2b41480a8e4c37473.json b/.sqlx/query-7929ab3dec6f9c0f1ebf140e7c9fd43632f2069180747fa2b41480a8e4c37473.json new file mode 100644 index 00000000..eedd02b8 --- /dev/null +++ b/.sqlx/query-7929ab3dec6f9c0f1ebf140e7c9fd43632f2069180747fa2b41480a8e4c37473.json @@ -0,0 +1,30 @@ +{ + "db_name": "PostgreSQL", + "query": "\n SELECT p.id\n FROM playlists p\n WHERE p.deletion_source = $3\n AND p.deleted_at <= NOW() - make_interval(days => $1)\n AND NOT EXISTS (SELECT 1 FROM media m WHERE m.playlist_id = p.id)\n AND NOT EXISTS (SELECT 1 FROM playlists child WHERE child.parent_id = p.id)\n ORDER BY p.deleted_at ASC, p.id ASC\n LIMIT $2\n FOR UPDATE OF p SKIP LOCKED\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "id", + "type_info": "Int8", + "origin": { + "Table": { + "table": "playlists", + "name": "id" + } + } + } + ], + "parameters": { + "Left": [ + "Int4", + "Int8", + "Int2" + ] + }, + "nullable": [ + false + ] + }, + "hash": "7929ab3dec6f9c0f1ebf140e7c9fd43632f2069180747fa2b41480a8e4c37473" +} diff --git a/.sqlx/query-45c81cde874df8cc413eef9d236ea6010842e8a5ad7cb40a920daf891afc0aa8.json b/.sqlx/query-7c17e55babd0d5e1650a7f56ae4ec7f60843d585f5740ec2cbdad1989300dcde.json similarity index 53% rename from .sqlx/query-45c81cde874df8cc413eef9d236ea6010842e8a5ad7cb40a920daf891afc0aa8.json rename to .sqlx/query-7c17e55babd0d5e1650a7f56ae4ec7f60843d585f5740ec2cbdad1989300dcde.json index e08fc6bf..1d9f7884 100644 --- a/.sqlx/query-45c81cde874df8cc413eef9d236ea6010842e8a5ad7cb40a920daf891afc0aa8.json +++ b/.sqlx/query-7c17e55babd0d5e1650a7f56ae4ec7f60843d585f5740ec2cbdad1989300dcde.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = 'user',\n version = version + 1\n WHERE playlist_id = $1 AND deleted_at IS NULL\n ", + "query": "\n UPDATE media\n SET deleted_at = CURRENT_TIMESTAMP,\n deletion_source = $2,\n version = version + 1\n WHERE id = ANY($1) AND deleted_at IS NULL\n ", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8Array", + "Int2" ] }, "nullable": [] }, - "hash": "45c81cde874df8cc413eef9d236ea6010842e8a5ad7cb40a920daf891afc0aa8" + "hash": "7c17e55babd0d5e1650a7f56ae4ec7f60843d585f5740ec2cbdad1989300dcde" } diff --git a/.sqlx/query-7fccaa1d155211a5dce41f0fefd1b9f4a705aab24883f53ffa3646c72b214fb3.json b/.sqlx/query-7fccaa1d155211a5dce41f0fefd1b9f4a705aab24883f53ffa3646c72b214fb3.json deleted file mode 100644 index 257a9c72..00000000 --- a/.sqlx/query-7fccaa1d155211a5dce41f0fefd1b9f4a705aab24883f53ffa3646c72b214fb3.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n SELECT p.id\n FROM playlists p\n WHERE p.deletion_source = 'user'\n AND p.deleted_at <= NOW() - make_interval(days => $1)\n AND NOT EXISTS (SELECT 1 FROM media m WHERE m.playlist_id = p.id)\n AND NOT EXISTS (SELECT 1 FROM playlists child WHERE child.parent_id = p.id)\n ORDER BY p.deleted_at ASC, p.id ASC\n LIMIT $2\n FOR UPDATE OF p SKIP LOCKED\n ", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "id", - "type_info": "Int8", - "origin": { - "Table": { - "table": "playlists", - "name": "id" - } - } - } - ], - "parameters": { - "Left": [ - "Int4", - "Int8" - ] - }, - "nullable": [ - false - ] - }, - "hash": "7fccaa1d155211a5dce41f0fefd1b9f4a705aab24883f53ffa3646c72b214fb3" -} diff --git a/.sqlx/query-9ddf2080421c615ff9fe7080bec060814d216d289b9182800baea3209f000935.json b/.sqlx/query-801489793c34385e1ddc0468160e8f7bda1b750d27b2c0d7c956193fca0cb4f0.json similarity index 57% rename from .sqlx/query-9ddf2080421c615ff9fe7080bec060814d216d289b9182800baea3209f000935.json rename to .sqlx/query-801489793c34385e1ddc0468160e8f7bda1b750d27b2c0d7c956193fca0cb4f0.json index 525e6beb..cd7120da 100644 --- a/.sqlx/query-9ddf2080421c615ff9fe7080bec060814d216d289b9182800baea3209f000935.json +++ b/.sqlx/query-801489793c34385e1ddc0468160e8f7bda1b750d27b2c0d7c956193fca0cb4f0.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id\n FROM auth_email_identities\n WHERE deletion_source = 'user'\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", + "query": "\n SELECT id\n FROM auth_email_identities\n WHERE deletion_source = $3\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", "describe": { "columns": [ { @@ -18,12 +18,13 @@ "parameters": { "Left": [ "Int4", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ false ] }, - "hash": "9ddf2080421c615ff9fe7080bec060814d216d289b9182800baea3209f000935" + "hash": "801489793c34385e1ddc0468160e8f7bda1b750d27b2c0d7c956193fca0cb4f0" } diff --git a/.sqlx/query-c64dcca5021ec625d22d5c5d8e900d58cd80782b04c5ca9780256effe641d763.json b/.sqlx/query-81a1e2c3230e42a42679934f5ec9a481d65e5f04e3310196af2975fc4566515f.json similarity index 93% rename from .sqlx/query-c64dcca5021ec625d22d5c5d8e900d58cd80782b04c5ca9780256effe641d763.json rename to .sqlx/query-81a1e2c3230e42a42679934f5ec9a481d65e5f04e3310196af2975fc4566515f.json index 29b2fe36..d0daaa1a 100644 --- a/.sqlx/query-c64dcca5021ec625d22d5c5d8e900d58cd80782b04c5ca9780256effe641d763.json +++ b/.sqlx/query-81a1e2c3230e42a42679934f5ec9a481d65e5f04e3310196af2975fc4566515f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n AND ($2 OR status <> $3)\n AND (created_at, id) < ($4, $5)\n ORDER BY created_at DESC, id DESC\n LIMIT $6\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM $7\n AND ($2 OR status <> $3)\n AND (created_at, id) < ($4, $5)\n ORDER BY created_at DESC, id DESC\n LIMIT $6\n ", "describe": { "columns": [ { @@ -187,7 +187,8 @@ "Int2", "Timestamptz", "Int8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -209,5 +210,5 @@ false ] }, - "hash": "c64dcca5021ec625d22d5c5d8e900d58cd80782b04c5ca9780256effe641d763" + "hash": "81a1e2c3230e42a42679934f5ec9a481d65e5f04e3310196af2975fc4566515f" } diff --git a/.sqlx/query-0e2d7ba9a31d338c1e27df00c2b49128b39d5d1efdb8855a8a03444b174945a9.json b/.sqlx/query-850e03b34b50be878b6c5ace71c510266c8e2be81a3979016285cbe06432005e.json similarity index 76% rename from .sqlx/query-0e2d7ba9a31d338c1e27df00c2b49128b39d5d1efdb8855a8a03444b174945a9.json rename to .sqlx/query-850e03b34b50be878b6c5ace71c510266c8e2be81a3979016285cbe06432005e.json index a639f992..b208e842 100644 --- a/.sqlx/query-0e2d7ba9a31d338c1e27df00c2b49128b39d5d1efdb8855a8a03444b174945a9.json +++ b/.sqlx/query-850e03b34b50be878b6c5ace71c510266c8e2be81a3979016285cbe06432005e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"user_id!: UserId\",\n deletion_source,\n deletion_reason,\n deleted_by AS \"deleted_by?: UserId\",\n restored_at,\n restored_by AS \"restored_by?: UserId\"\n FROM users\n WHERE id = ANY($1)\n ", + "query": "\n SELECT id AS \"user_id!: UserId\",\n deletion_source AS \"deletion_source?: DeletionSource\",\n deletion_reason,\n deleted_by AS \"deleted_by?: UserId\",\n restored_at,\n restored_by AS \"restored_by?: UserId\"\n FROM users\n WHERE id = ANY($1)\n ", "describe": { "columns": [ { @@ -16,8 +16,8 @@ }, { "ordinal": 1, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "users", @@ -84,5 +84,5 @@ true ] }, - "hash": "0e2d7ba9a31d338c1e27df00c2b49128b39d5d1efdb8855a8a03444b174945a9" + "hash": "850e03b34b50be878b6c5ace71c510266c8e2be81a3979016285cbe06432005e" } diff --git a/.sqlx/query-a8369af70cac41f43ecbb3ecaa953fcbdb8202b59340ad25703462be5a8300bb.json b/.sqlx/query-85e58a79068e59e3107333d23b60d611e911505e0022355f66324abf70ab4a50.json similarity index 69% rename from .sqlx/query-a8369af70cac41f43ecbb3ecaa953fcbdb8202b59340ad25703462be5a8300bb.json rename to .sqlx/query-85e58a79068e59e3107333d23b60d611e911505e0022355f66324abf70ab4a50.json index 0715359f..3b349a3e 100644 --- a/.sqlx/query-a8369af70cac41f43ecbb3ecaa953fcbdb8202b59340ad25703462be5a8300bb.json +++ b/.sqlx/query-85e58a79068e59e3107333d23b60d611e911505e0022355f66324abf70ab4a50.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT deleted_at, deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\" FROM chat_messages WHERE room_id = $1", + "query": "SELECT deleted_at,\n deletion_source AS \"deletion_source?: DeletionSource\",\n deleted_owner_id AS \"deleted_owner_id: UserId\"\n FROM chat_messages WHERE room_id = $1", "describe": { "columns": [ { @@ -16,8 +16,8 @@ }, { "ordinal": 1, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "chat_messages", @@ -48,5 +48,5 @@ true ] }, - "hash": "a8369af70cac41f43ecbb3ecaa953fcbdb8202b59340ad25703462be5a8300bb" + "hash": "85e58a79068e59e3107333d23b60d611e911505e0022355f66324abf70ab4a50" } diff --git a/.sqlx/query-61a24054b1808d7dcc54787240d245bf221c74a3677c6b57c02fcacbc62513af.json b/.sqlx/query-8a45101fba476921897c8db4b37525d0f2bf1bfb78371356127b4c47af23293f.json similarity index 56% rename from .sqlx/query-61a24054b1808d7dcc54787240d245bf221c74a3677c6b57c02fcacbc62513af.json rename to .sqlx/query-8a45101fba476921897c8db4b37525d0f2bf1bfb78371356127b4c47af23293f.json index 4ba0f8e6..85b8ce39 100644 --- a/.sqlx/query-61a24054b1808d7dcc54787240d245bf221c74a3677c6b57c02fcacbc62513af.json +++ b/.sqlx/query-8a45101fba476921897c8db4b37525d0f2bf1bfb78371356127b4c47af23293f.json @@ -1,16 +1,18 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO auth_oauth2_identities (\n provider_type, provider_instance_name, provider_user_id,\n user_id, username, deleted_at, deletion_source\n )\n VALUES\n (2, 'github', 'expired-unbound', $1, 'expired', $2, 'user'),\n (2, 'github', 'recent-unbound', $1, 'recent', $3, 'user'),\n (2, 'github', 'account-retained', $1, 'account', $2, 'account')", + "query": "INSERT INTO auth_oauth2_identities (\n provider_type, provider_instance_name, provider_user_id,\n user_id, username, deleted_at, deletion_source\n )\n VALUES\n (2, 'github', 'expired-unbound', $1, 'expired', $2, $4),\n (2, 'github', 'recent-unbound', $1, 'recent', $3, $4),\n (2, 'github', 'account-retained', $1, 'account', $2, $5)", "describe": { "columns": [], "parameters": { "Left": [ "Int8", "Timestamptz", - "Timestamptz" + "Timestamptz", + "Int2", + "Int2" ] }, "nullable": [] }, - "hash": "61a24054b1808d7dcc54787240d245bf221c74a3677c6b57c02fcacbc62513af" + "hash": "8a45101fba476921897c8db4b37525d0f2bf1bfb78371356127b4c47af23293f" } diff --git a/.sqlx/query-2e3df69588c24c225474f23f4d19028fe04b24e2b75c2e62860cb7941bce560f.json b/.sqlx/query-8d4a4914427075127768d878a628470d8ae24168f9ac340ca3be9a30cadecc11.json similarity index 78% rename from .sqlx/query-2e3df69588c24c225474f23f4d19028fe04b24e2b75c2e62860cb7941bce560f.json rename to .sqlx/query-8d4a4914427075127768d878a628470d8ae24168f9ac340ca3be9a30cadecc11.json index 9ad18a60..9975ff7f 100644 --- a/.sqlx/query-2e3df69588c24c225474f23f4d19028fe04b24e2b75c2e62860cb7941bce560f.json +++ b/.sqlx/query-8d4a4914427075127768d878a628470d8ae24168f9ac340ca3be9a30cadecc11.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH candidates AS (\n SELECT id,\n room_id,\n user_id,\n client_message_id,\n content,\n message_type,\n status,\n version,\n reply_to_message_id,\n reply_to_message_created_at,\n metadata,\n edited_at,\n deleted_at,\n deleted_by,\n delete_reason,\n created_at,\n CASE\n WHEN jsonb_typeof(metadata #> '{playback,positionSeconds}') = 'number'\n THEN (metadata #>> '{playback,positionSeconds}')::double precision\n ELSE NULL\n END AS playback_position\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n AND ($2 OR status <> $3)\n AND ($4::text IS NULL OR metadata #>> '{playback,mediaId}' = $4)\n AND ($5::text IS NULL OR metadata #>> '{playback,playlistId}' = $5)\n AND ($6::text IS NULL OR metadata #>> '{playback,targetHash}' = $6)\n AND message_type = ANY($7::smallint[])\n )\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM candidates\n WHERE playback_position BETWEEN $8 AND $9\n ORDER BY playback_position ASC, created_at ASC, id ASC\n LIMIT $10\n ", + "query": "\n WITH candidates AS (\n SELECT id,\n room_id,\n user_id,\n client_message_id,\n content,\n message_type,\n status,\n version,\n reply_to_message_id,\n reply_to_message_created_at,\n metadata,\n edited_at,\n deleted_at,\n deleted_by,\n delete_reason,\n created_at,\n CASE\n WHEN jsonb_typeof(metadata #> '{playback,positionSeconds}') = 'number'\n THEN (metadata #>> '{playback,positionSeconds}')::double precision\n ELSE NULL\n END AS playback_position\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM $11\n AND ($2 OR status <> $3)\n AND ($4::text IS NULL OR metadata #>> '{playback,mediaId}' = $4)\n AND ($5::text IS NULL OR metadata #>> '{playback,playlistId}' = $5)\n AND ($6::text IS NULL OR metadata #>> '{playback,targetHash}' = $6)\n AND message_type = ANY($7::smallint[])\n )\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM candidates\n WHERE playback_position BETWEEN $8 AND $9\n ORDER BY playback_position ASC, created_at ASC, id ASC\n LIMIT $10\n ", "describe": { "columns": [ { @@ -191,7 +191,8 @@ "Int2Array", "Float8", "Float8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -213,5 +214,5 @@ false ] }, - "hash": "2e3df69588c24c225474f23f4d19028fe04b24e2b75c2e62860cb7941bce560f" + "hash": "8d4a4914427075127768d878a628470d8ae24168f9ac340ca3be9a30cadecc11" } diff --git a/.sqlx/query-a7642501eed21b261c3f6e9c7805d0f5c6e71d2eda2db11e31014c60934534a6.json b/.sqlx/query-975bc97ad98730d63ef06dfa793c14cb0ae65f95937af05ea2bdf0e272edae68.json similarity index 75% rename from .sqlx/query-a7642501eed21b261c3f6e9c7805d0f5c6e71d2eda2db11e31014c60934534a6.json rename to .sqlx/query-975bc97ad98730d63ef06dfa793c14cb0ae65f95937af05ea2bdf0e272edae68.json index 7bf8b3f8..8d8312cc 100644 --- a/.sqlx/query-a7642501eed21b261c3f6e9c7805d0f5c6e71d2eda2db11e31014c60934534a6.json +++ b/.sqlx/query-975bc97ad98730d63ef06dfa793c14cb0ae65f95937af05ea2bdf0e272edae68.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO playlists (\n room_id, creator_id, name, parent_id, position,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'expired-child', $3, 1.0, $4, 'user')\n RETURNING id", + "query": "INSERT INTO playlists (\n room_id, creator_id, name, parent_id, position,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'retained-other-user-child', $3, 1.0, $4, $5)\n RETURNING id", "describe": { "columns": [ { @@ -20,12 +20,13 @@ "Int8", "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "a7642501eed21b261c3f6e9c7805d0f5c6e71d2eda2db11e31014c60934534a6" + "hash": "975bc97ad98730d63ef06dfa793c14cb0ae65f95937af05ea2bdf0e272edae68" } diff --git a/.sqlx/query-af3cd795fc7ddcee9cf3721a670425077ec4faf8450ef3c72d722a7eb84fa5fb.json b/.sqlx/query-9d17f87cf916eb522d7b53dd1212ef396e8733df3e353f42601673efec3add26.json similarity index 96% rename from .sqlx/query-af3cd795fc7ddcee9cf3721a670425077ec4faf8450ef3c72d722a7eb84fa5fb.json rename to .sqlx/query-9d17f87cf916eb522d7b53dd1212ef396e8733df3e353f42601673efec3add26.json index 6cf1982d..79492a53 100644 --- a/.sqlx/query-af3cd795fc7ddcee9cf3721a670425077ec4faf8450ef3c72d722a7eb84fa5fb.json +++ b/.sqlx/query-9d17f87cf916eb522d7b53dd1212ef396e8733df3e353f42601673efec3add26.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND id = $2\n AND deletion_source IS DISTINCT FROM 'account'\n FOR UPDATE\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND id = $2\n AND deletion_source IS DISTINCT FROM $3\n FOR UPDATE\n ", "describe": { "columns": [ { @@ -183,7 +183,8 @@ "parameters": { "Left": [ "Int8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -205,5 +206,5 @@ false ] }, - "hash": "af3cd795fc7ddcee9cf3721a670425077ec4faf8450ef3c72d722a7eb84fa5fb" + "hash": "9d17f87cf916eb522d7b53dd1212ef396e8733df3e353f42601673efec3add26" } diff --git a/.sqlx/query-54833a98810c9d8f48c0a57121346d256cce55c49d1be623ab7d0336be3317af.json b/.sqlx/query-9f1b41e87c6a136f880ff89356befe073e9c994a370a63b5a44402f596847283.json similarity index 93% rename from .sqlx/query-54833a98810c9d8f48c0a57121346d256cce55c49d1be623ab7d0336be3317af.json rename to .sqlx/query-9f1b41e87c6a136f880ff89356befe073e9c994a370a63b5a44402f596847283.json index be2eae9e..cab5c10d 100644 --- a/.sqlx/query-54833a98810c9d8f48c0a57121346d256cce55c49d1be623ab7d0336be3317af.json +++ b/.sqlx/query-9f1b41e87c6a136f880ff89356befe073e9c994a370a63b5a44402f596847283.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n AND ($2 OR status <> $3)\n AND (created_at, id) > ($4, $5)\n ORDER BY created_at ASC, id ASC\n LIMIT $6\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM $7\n AND ($2 OR status <> $3)\n AND (created_at, id) > ($4, $5)\n ORDER BY created_at ASC, id ASC\n LIMIT $6\n ", "describe": { "columns": [ { @@ -187,7 +187,8 @@ "Int2", "Timestamptz", "Int8", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -209,5 +210,5 @@ false ] }, - "hash": "54833a98810c9d8f48c0a57121346d256cce55c49d1be623ab7d0336be3317af" + "hash": "9f1b41e87c6a136f880ff89356befe073e9c994a370a63b5a44402f596847283" } diff --git a/.sqlx/query-d620960cfb742737471e5e0a38e5a850bbd8bdb4de6a4a79bbf446ba4065343e.json b/.sqlx/query-9f5de1c1b9d973a7a6583a234327911db4b169a90a6c69c83f53ae491d1d1075.json similarity index 52% rename from .sqlx/query-d620960cfb742737471e5e0a38e5a850bbd8bdb4de6a4a79bbf446ba4065343e.json rename to .sqlx/query-9f5de1c1b9d973a7a6583a234327911db4b169a90a6c69c83f53ae491d1d1075.json index daeae2ae..cf417edb 100644 --- a/.sqlx/query-d620960cfb742737471e5e0a38e5a850bbd8bdb4de6a4a79bbf446ba4065343e.json +++ b/.sqlx/query-9f5de1c1b9d973a7a6583a234327911db4b169a90a6c69c83f53ae491d1d1075.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_type = $2 AND deleted_at IS NULL", + "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { @@ -11,5 +11,5 @@ }, "nullable": [] }, - "hash": "d620960cfb742737471e5e0a38e5a850bbd8bdb4de6a4a79bbf446ba4065343e" + "hash": "9f5de1c1b9d973a7a6583a234327911db4b169a90a6c69c83f53ae491d1d1075" } diff --git a/.sqlx/query-0e06b792f51d3fea6c21ed913e090b4e0fa8f5f7e80af91a9142930a1855d209.json b/.sqlx/query-9fdaedea93b6f7c648aee7db19a19958f5619cd09b44ff526e1a991c73167788.json similarity index 52% rename from .sqlx/query-0e06b792f51d3fea6c21ed913e090b4e0fa8f5f7e80af91a9142930a1855d209.json rename to .sqlx/query-9fdaedea93b6f7c648aee7db19a19958f5619cd09b44ff526e1a991c73167788.json index cecc1f50..3794cb72 100644 --- a/.sqlx/query-0e06b792f51d3fea6c21ed913e090b4e0fa8f5f7e80af91a9142930a1855d209.json +++ b/.sqlx/query-9fdaedea93b6f7c648aee7db19a19958f5619cd09b44ff526e1a991c73167788.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'account' WHERE user_id = $1 AND deleted_at IS NULL", + "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2 WHERE user_id = $1 AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "0e06b792f51d3fea6c21ed913e090b4e0fa8f5f7e80af91a9142930a1855d209" + "hash": "9fdaedea93b6f7c648aee7db19a19958f5619cd09b44ff526e1a991c73167788" } diff --git a/.sqlx/query-4891bbba39b18c96b2f6695f98367a4dbd080053602dd0260127841624e6046f.json b/.sqlx/query-a5209a475ad100c1d7348d9a6a9d9e5b9ad22fe88c407c16390c3c50325ac59a.json similarity index 80% rename from .sqlx/query-4891bbba39b18c96b2f6695f98367a4dbd080053602dd0260127841624e6046f.json rename to .sqlx/query-a5209a475ad100c1d7348d9a6a9d9e5b9ad22fe88c407c16390c3c50325ac59a.json index 1aef271d..d64e6218 100644 --- a/.sqlx/query-4891bbba39b18c96b2f6695f98367a4dbd080053602dd0260127841624e6046f.json +++ b/.sqlx/query-a5209a475ad100c1d7348d9a6a9d9e5b9ad22fe88c407c16390c3c50325ac59a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT COUNT(*) AS \"count!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.event_type = $3\n AND m.status <> $4\n AND m.deletion_source IS DISTINCT FROM 'account'\n AND (m.user_id IS NULL OR m.user_id <> $5)\n ", + "query": "\n SELECT COUNT(*) AS \"count!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.event_type = $3\n AND m.status <> $4\n AND m.deletion_source IS DISTINCT FROM $6\n AND (m.user_id IS NULL OR m.user_id <> $5)\n ", "describe": { "columns": [ { @@ -16,12 +16,13 @@ "Int8", "Text", "Int2", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ null ] }, - "hash": "4891bbba39b18c96b2f6695f98367a4dbd080053602dd0260127841624e6046f" + "hash": "a5209a475ad100c1d7348d9a6a9d9e5b9ad22fe88c407c16390c3c50325ac59a" } diff --git a/.sqlx/query-b85073e85e9ab0ed1aee14edd206eb1f0fe978ad74ce00a40e6e9d2b6fc0a773.json b/.sqlx/query-a5e9dca4afbc8698f2d853cf8d20e724c3e513e3561f188760f6bebf03446da9.json similarity index 84% rename from .sqlx/query-b85073e85e9ab0ed1aee14edd206eb1f0fe978ad74ce00a40e6e9d2b6fc0a773.json rename to .sqlx/query-a5e9dca4afbc8698f2d853cf8d20e724c3e513e3561f188760f6bebf03446da9.json index 91751574..cde08fcd 100644 --- a/.sqlx/query-b85073e85e9ab0ed1aee14edd206eb1f0fe978ad74ce00a40e6e9d2b6fc0a773.json +++ b/.sqlx/query-a5e9dca4afbc8698f2d853cf8d20e724c3e513e3561f188760f6bebf03446da9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM 'account'\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.event_type = ANY($3::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($5::text[])\n ORDER BY sequence ASC\n LIMIT $4\n ", + "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM $6\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.event_type = ANY($3::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($5::text[])\n ORDER BY sequence ASC\n LIMIT $4\n ", "describe": { "columns": [ { @@ -76,7 +76,8 @@ "Int8", "TextArray", "Int8", - "TextArray" + "TextArray", + "Int2" ] }, "nullable": [ @@ -88,5 +89,5 @@ false ] }, - "hash": "b85073e85e9ab0ed1aee14edd206eb1f0fe978ad74ce00a40e6e9d2b6fc0a773" + "hash": "a5e9dca4afbc8698f2d853cf8d20e724c3e513e3561f188760f6bebf03446da9" } diff --git a/.sqlx/query-99b5489abb69c8e1fbe991d6fca4f0e7752cfd5b716efe695f8bb99f6ac6516b.json b/.sqlx/query-a7b78b24b782ed6d90602a26b7a901e4109ee382d4b62807ce747bd7c3186c88.json similarity index 70% rename from .sqlx/query-99b5489abb69c8e1fbe991d6fca4f0e7752cfd5b716efe695f8bb99f6ac6516b.json rename to .sqlx/query-a7b78b24b782ed6d90602a26b7a901e4109ee382d4b62807ce747bd7c3186c88.json index 3ae3f741..6b1b95e2 100644 --- a/.sqlx/query-99b5489abb69c8e1fbe991d6fca4f0e7752cfd5b716efe695f8bb99f6ac6516b.json +++ b/.sqlx/query-a7b78b24b782ed6d90602a26b7a901e4109ee382d4b62807ce747bd7c3186c88.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT event_id AS \"event_id!\",\n sequence,\n resource_type AS \"resource_type!\",\n event_type AS \"event_type!\",\n payload AS \"payload?: sqlx::types::Json\"\n FROM room_resource_events e\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.resource_type = ANY($3::TEXT[])\n AND NOT (\n (e.resource_type = 'chat_pins'\n AND e.aggregate_type = 'chat_message'\n AND EXISTS (\n SELECT 1\n FROM chat_messages m\n WHERE m.room_id = e.room_id\n AND e.aggregate_id = m.id::TEXT\n AND m.deletion_source = 'account'\n ))\n OR (e.resource_type = 'media'\n AND EXISTS (\n SELECT 1\n FROM media m\n WHERE m.room_id = e.room_id\n AND e.resource_id = m.id::TEXT\n AND m.deletion_source = 'account'\n ))\n OR (e.resource_type = 'playlist'\n AND EXISTS (\n SELECT 1\n FROM playlists p\n WHERE p.room_id = e.room_id\n AND e.resource_id = p.id::TEXT\n AND p.deletion_source = 'account'\n ))\n )\n ORDER BY sequence ASC\n LIMIT $4\n ", + "query": "\n SELECT event_id AS \"event_id!\",\n sequence,\n resource_type AS \"resource_type!\",\n event_type AS \"event_type!\",\n payload AS \"payload?: sqlx::types::Json\"\n FROM room_resource_events e\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.resource_type = ANY($3::TEXT[])\n AND NOT (\n (e.resource_type = 'chat_pins'\n AND e.aggregate_type = 'chat_message'\n AND EXISTS (\n SELECT 1\n FROM chat_messages m\n WHERE m.room_id = e.room_id\n AND e.aggregate_id = m.id::TEXT\n AND m.deletion_source = $5\n ))\n OR (e.resource_type = 'media'\n AND EXISTS (\n SELECT 1\n FROM media m\n WHERE m.room_id = e.room_id\n AND e.resource_id = m.id::TEXT\n AND m.deletion_source = $5\n ))\n OR (e.resource_type = 'playlist'\n AND EXISTS (\n SELECT 1\n FROM playlists p\n WHERE p.room_id = e.room_id\n AND e.resource_id = p.id::TEXT\n AND p.deletion_source = $5\n ))\n )\n ORDER BY sequence ASC\n LIMIT $4\n ", "describe": { "columns": [ { @@ -64,7 +64,8 @@ "Int8", "Int8", "TextArray", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -75,5 +76,5 @@ true ] }, - "hash": "99b5489abb69c8e1fbe991d6fca4f0e7752cfd5b716efe695f8bb99f6ac6516b" + "hash": "a7b78b24b782ed6d90602a26b7a901e4109ee382d4b62807ce747bd7c3186c88" } diff --git a/.sqlx/query-2efaf94474693dce6d413ab6835a4a604b2d6f755f879c718915459cbd472ee0.json b/.sqlx/query-a984111b0cfde4698b6e36456a7f1a199c1bc34b538b946fa79efd04cb1e125c.json similarity index 73% rename from .sqlx/query-2efaf94474693dce6d413ab6835a4a604b2d6f755f879c718915459cbd472ee0.json rename to .sqlx/query-a984111b0cfde4698b6e36456a7f1a199c1bc34b538b946fa79efd04cb1e125c.json index edf22d37..991affbb 100644 --- a/.sqlx/query-2efaf94474693dce6d413ab6835a4a604b2d6f755f879c718915459cbd472ee0.json +++ b/.sqlx/query-a984111b0cfde4698b6e36456a7f1a199c1bc34b538b946fa79efd04cb1e125c.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE media SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "query": "UPDATE media SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "2efaf94474693dce6d413ab6835a4a604b2d6f755f879c718915459cbd472ee0" + "hash": "a984111b0cfde4698b6e36456a7f1a199c1bc34b538b946fa79efd04cb1e125c" } diff --git a/.sqlx/query-c3d2613d33ace5ab133d0bd41cfdf4bb94f92f6e3607685a75010284b91ab3e3.json b/.sqlx/query-ac8705d2ecc6d76f2601c07c1005997d426ba4c19c56def607b2363f03bb6053.json similarity index 69% rename from .sqlx/query-c3d2613d33ace5ab133d0bd41cfdf4bb94f92f6e3607685a75010284b91ab3e3.json rename to .sqlx/query-ac8705d2ecc6d76f2601c07c1005997d426ba4c19c56def607b2363f03bb6053.json index 1ebbf8d0..7f8c1cb9 100644 --- a/.sqlx/query-c3d2613d33ace5ab133d0bd41cfdf4bb94f92f6e3607685a75010284b91ab3e3.json +++ b/.sqlx/query-ac8705d2ecc6d76f2601c07c1005997d426ba4c19c56def607b2363f03bb6053.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT deleted_at, deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\" FROM chat_messages WHERE id = $1", + "query": "SELECT deleted_at,\n deletion_source AS \"deletion_source?: DeletionSource\",\n deleted_owner_id AS \"deleted_owner_id: UserId\"\n FROM chat_messages WHERE id = $1", "describe": { "columns": [ { @@ -16,8 +16,8 @@ }, { "ordinal": 1, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "chat_messages", @@ -48,5 +48,5 @@ true ] }, - "hash": "c3d2613d33ace5ab133d0bd41cfdf4bb94f92f6e3607685a75010284b91ab3e3" + "hash": "ac8705d2ecc6d76f2601c07c1005997d426ba4c19c56def607b2363f03bb6053" } diff --git a/.sqlx/query-12c0f3d8df26cfa4088a0fb2bc70379649f2793ad66cc672b36189bc2caced9b.json b/.sqlx/query-ae1ee546bf987fca6961ef335e1888a155e8524ab0030946ba31691bf0637df1.json similarity index 57% rename from .sqlx/query-12c0f3d8df26cfa4088a0fb2bc70379649f2793ad66cc672b36189bc2caced9b.json rename to .sqlx/query-ae1ee546bf987fca6961ef335e1888a155e8524ab0030946ba31691bf0637df1.json index 1a56558e..f5d87594 100644 --- a/.sqlx/query-12c0f3d8df26cfa4088a0fb2bc70379649f2793ad66cc672b36189bc2caced9b.json +++ b/.sqlx/query-ae1ee546bf987fca6961ef335e1888a155e8524ab0030946ba31691bf0637df1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id\n FROM media\n WHERE deletion_source = 'user'\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", + "query": "\n SELECT id\n FROM media\n WHERE deletion_source = $3\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", "describe": { "columns": [ { @@ -18,12 +18,13 @@ "parameters": { "Left": [ "Int4", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ false ] }, - "hash": "12c0f3d8df26cfa4088a0fb2bc70379649f2793ad66cc672b36189bc2caced9b" + "hash": "ae1ee546bf987fca6961ef335e1888a155e8524ab0030946ba31691bf0637df1" } diff --git a/.sqlx/query-a48e93914e7da1b54e4e3bda821cd5378c1aa78d6fcdc594e53e48d616bbac1d.json b/.sqlx/query-aefce15f16b15769555782462796a3b3051e2282908c5842d99c168e066d3d3b.json similarity index 73% rename from .sqlx/query-a48e93914e7da1b54e4e3bda821cd5378c1aa78d6fcdc594e53e48d616bbac1d.json rename to .sqlx/query-aefce15f16b15769555782462796a3b3051e2282908c5842d99c168e066d3d3b.json index b57b281d..41b6dc34 100644 --- a/.sqlx/query-a48e93914e7da1b54e4e3bda821cd5378c1aa78d6fcdc594e53e48d616bbac1d.json +++ b/.sqlx/query-aefce15f16b15769555782462796a3b3051e2282908c5842d99c168e066d3d3b.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE rooms SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "query": "UPDATE rooms SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "a48e93914e7da1b54e4e3bda821cd5378c1aa78d6fcdc594e53e48d616bbac1d" + "hash": "aefce15f16b15769555782462796a3b3051e2282908c5842d99c168e066d3d3b" } diff --git a/.sqlx/query-eef6d749a326f257725d1d80e2b59eda5e298ef184295478d38d4dc7fa0d2c2f.json b/.sqlx/query-b20075762e6c3eb2863edf72b07e669806bf688831a3d8b67f022539e2705c75.json similarity index 62% rename from .sqlx/query-eef6d749a326f257725d1d80e2b59eda5e298ef184295478d38d4dc7fa0d2c2f.json rename to .sqlx/query-b20075762e6c3eb2863edf72b07e669806bf688831a3d8b67f022539e2705c75.json index 5a0bae9c..d294fa2a 100644 --- a/.sqlx/query-eef6d749a326f257725d1d80e2b59eda5e298ef184295478d38d4dc7fa0d2c2f.json +++ b/.sqlx/query-b20075762e6c3eb2863edf72b07e669806bf688831a3d8b67f022539e2705c75.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "DELETE FROM media WHERE id = ANY($1) AND deletion_source = 'user'", + "query": "DELETE FROM media WHERE id = ANY($1) AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8Array" + "Int8Array", + "Int2" ] }, "nullable": [] }, - "hash": "eef6d749a326f257725d1d80e2b59eda5e298ef184295478d38d4dc7fa0d2c2f" + "hash": "b20075762e6c3eb2863edf72b07e669806bf688831a3d8b67f022539e2705c75" } diff --git a/.sqlx/query-4d9903c5f769ec59389f09d20fa213de19b9c2cbd81e3a55a9fd9a0173b294b0.json b/.sqlx/query-b51ea6efdf6ccb7f7ec928292cdfd04ed177c3d26047e5cf77bb33959d560590.json similarity index 62% rename from .sqlx/query-4d9903c5f769ec59389f09d20fa213de19b9c2cbd81e3a55a9fd9a0173b294b0.json rename to .sqlx/query-b51ea6efdf6ccb7f7ec928292cdfd04ed177c3d26047e5cf77bb33959d560590.json index 65ca9c05..437f9d1c 100644 --- a/.sqlx/query-4d9903c5f769ec59389f09d20fa213de19b9c2cbd81e3a55a9fd9a0173b294b0.json +++ b/.sqlx/query-b51ea6efdf6ccb7f7ec928292cdfd04ed177c3d26047e5cf77bb33959d560590.json @@ -1,15 +1,16 @@ { "db_name": "PostgreSQL", - "query": "UPDATE users SET deleted_at = $2, deletion_source = 'account' WHERE id = $1", + "query": "UPDATE users SET deleted_at = $2, deletion_source = $3 WHERE id = $1", "describe": { "columns": [], "parameters": { "Left": [ "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [] }, - "hash": "4d9903c5f769ec59389f09d20fa213de19b9c2cbd81e3a55a9fd9a0173b294b0" + "hash": "b51ea6efdf6ccb7f7ec928292cdfd04ed177c3d26047e5cf77bb33959d560590" } diff --git a/.sqlx/query-bc8dd45684c9666ee0923b15143eb4bd7e1ab855897ab02b2a28c1c57c92780c.json b/.sqlx/query-bc8dd45684c9666ee0923b15143eb4bd7e1ab855897ab02b2a28c1c57c92780c.json deleted file mode 100644 index d70fd710..00000000 --- a/.sqlx/query-bc8dd45684c9666ee0923b15143eb4bd7e1ab855897ab02b2a28c1c57c92780c.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE media SET deletion_source = 'account', deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8Array", - "Int8" - ] - }, - "nullable": [] - }, - "hash": "bc8dd45684c9666ee0923b15143eb4bd7e1ab855897ab02b2a28c1c57c92780c" -} diff --git a/.sqlx/query-bdb06a95f63ee0e5ce3443b79d54fa0816e283e0049ec872e428ddee1fed4bce.json b/.sqlx/query-bdb06a95f63ee0e5ce3443b79d54fa0816e283e0049ec872e428ddee1fed4bce.json new file mode 100644 index 00000000..134d3c2b --- /dev/null +++ b/.sqlx/query-bdb06a95f63ee0e5ce3443b79d54fa0816e283e0049ec872e428ddee1fed4bce.json @@ -0,0 +1,16 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $3, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_type = $2 AND deleted_at IS NULL", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Int8", + "Int2", + "Int2" + ] + }, + "nullable": [] + }, + "hash": "bdb06a95f63ee0e5ce3443b79d54fa0816e283e0049ec872e428ddee1fed4bce" +} diff --git a/.sqlx/query-1e79e516d2cdaa2665466c987d073ae5df059d85d929c9574120452e59353297.json b/.sqlx/query-bf1f616bd6121edeabd535be131e13debfb83852f9b10a59fb5c707af0e9034c.json similarity index 76% rename from .sqlx/query-1e79e516d2cdaa2665466c987d073ae5df059d85d929c9574120452e59353297.json rename to .sqlx/query-bf1f616bd6121edeabd535be131e13debfb83852f9b10a59fb5c707af0e9034c.json index d852176b..0d93f512 100644 --- a/.sqlx/query-1e79e516d2cdaa2665466c987d073ae5df059d85d929c9574120452e59353297.json +++ b/.sqlx/query-bf1f616bd6121edeabd535be131e13debfb83852f9b10a59fb5c707af0e9034c.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"user_id!: UserId\",\n deletion_source,\n deletion_reason,\n deleted_by AS \"deleted_by?: UserId\",\n restored_at,\n restored_by AS \"restored_by?: UserId\"\n FROM users\n WHERE id = $1\n ", + "query": "\n SELECT id AS \"user_id!: UserId\",\n deletion_source AS \"deletion_source?: DeletionSource\",\n deletion_reason,\n deleted_by AS \"deleted_by?: UserId\",\n restored_at,\n restored_by AS \"restored_by?: UserId\"\n FROM users\n WHERE id = $1\n ", "describe": { "columns": [ { @@ -16,8 +16,8 @@ }, { "ordinal": 1, - "name": "deletion_source", - "type_info": "Text", + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", "origin": { "Table": { "table": "users", @@ -84,5 +84,5 @@ true ] }, - "hash": "1e79e516d2cdaa2665466c987d073ae5df059d85d929c9574120452e59353297" + "hash": "bf1f616bd6121edeabd535be131e13debfb83852f9b10a59fb5c707af0e9034c" } diff --git a/.sqlx/query-aa359894297c22c4ae9ef5be503e2ecf040f3567a70a77cf57194581dd0d6cc8.json b/.sqlx/query-c14e0dd76034347a0d93741d46daceea60321ca9b594548c70fd502b030c8b0e.json similarity index 76% rename from .sqlx/query-aa359894297c22c4ae9ef5be503e2ecf040f3567a70a77cf57194581dd0d6cc8.json rename to .sqlx/query-c14e0dd76034347a0d93741d46daceea60321ca9b594548c70fd502b030c8b0e.json index 5c934079..81ea884f 100644 --- a/.sqlx/query-aa359894297c22c4ae9ef5be503e2ecf040f3567a70a77cf57194581dd0d6cc8.json +++ b/.sqlx/query-c14e0dd76034347a0d93741d46daceea60321ca9b594548c70fd502b030c8b0e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO media (\n playlist_id, room_id, creator_id, name, position,\n source_provider, source_config, deleted_at, deletion_source\n )\n VALUES ($1, $2, $3, 'retained-child-media', 1.0,\n 1, '{}'::JSONB, $4, 'user')\n RETURNING id", + "query": "INSERT INTO media (\n playlist_id, room_id, creator_id, name, position,\n source_provider, source_config, deleted_at, deletion_source\n )\n VALUES ($1, $2, $3, 'retained-child-media', 1.0,\n 1, '{}'::JSONB, $4, $5)\n RETURNING id", "describe": { "columns": [ { @@ -20,12 +20,13 @@ "Int8", "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "aa359894297c22c4ae9ef5be503e2ecf040f3567a70a77cf57194581dd0d6cc8" + "hash": "c14e0dd76034347a0d93741d46daceea60321ca9b594548c70fd502b030c8b0e" } diff --git a/.sqlx/query-686f16b50f165abdc476b09b3ff3fc7488370e6e038998e5ab9b6fbb3d537e24.json b/.sqlx/query-c29ca718297fe912a9f9a2fd31f9931c0796c5954a8d48e1e2e4ed454d22157d.json similarity index 58% rename from .sqlx/query-686f16b50f165abdc476b09b3ff3fc7488370e6e038998e5ab9b6fbb3d537e24.json rename to .sqlx/query-c29ca718297fe912a9f9a2fd31f9931c0796c5954a8d48e1e2e4ed454d22157d.json index 1361563a..4e17779a 100644 --- a/.sqlx/query-686f16b50f165abdc476b09b3ff3fc7488370e6e038998e5ab9b6fbb3d537e24.json +++ b/.sqlx/query-c29ca718297fe912a9f9a2fd31f9931c0796c5954a8d48e1e2e4ed454d22157d.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO auth_email_identities (\n user_id, email, deleted_at, deletion_source\n )\n VALUES\n ($1, 'expired-unbound@example.com', $4, 'user'),\n ($2, 'recent-unbound@example.com', $5, 'user'),\n ($3, 'account-retained@example.com', $4, 'account')", + "query": "INSERT INTO auth_email_identities (\n user_id, email, deleted_at, deletion_source\n )\n VALUES\n ($1, 'expired-unbound@example.com', $4, $6),\n ($2, 'recent-unbound@example.com', $5, $6),\n ($3, 'account-retained@example.com', $4, $7)", "describe": { "columns": [], "parameters": { @@ -9,10 +9,12 @@ "Int8", "Int8", "Timestamptz", - "Timestamptz" + "Timestamptz", + "Int2", + "Int2" ] }, "nullable": [] }, - "hash": "686f16b50f165abdc476b09b3ff3fc7488370e6e038998e5ab9b6fbb3d537e24" + "hash": "c29ca718297fe912a9f9a2fd31f9931c0796c5954a8d48e1e2e4ed454d22157d" } diff --git a/.sqlx/query-2267c85c54547cb9d753b0027792b0543b9b6849ef82927593d513976065ec2a.json b/.sqlx/query-c37c8b961170e850d399cb2acd8b1443dd6131c58ea1bf063427cea5d32ac713.json similarity index 93% rename from .sqlx/query-2267c85c54547cb9d753b0027792b0543b9b6849ef82927593d513976065ec2a.json rename to .sqlx/query-c37c8b961170e850d399cb2acd8b1443dd6131c58ea1bf063427cea5d32ac713.json index f1037e3e..0dd79942 100644 --- a/.sqlx/query-2267c85c54547cb9d753b0027792b0543b9b6849ef82927593d513976065ec2a.json +++ b/.sqlx/query-c37c8b961170e850d399cb2acd8b1443dd6131c58ea1bf063427cea5d32ac713.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n AND ($2 OR status <> $3)\n AND (created_at, id) < ($4, $5)\n AND message_type = ANY($7::smallint[])\n ORDER BY created_at DESC, id DESC\n LIMIT $6\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM $8\n AND ($2 OR status <> $3)\n AND (created_at, id) < ($4, $5)\n AND message_type = ANY($7::smallint[])\n ORDER BY created_at DESC, id DESC\n LIMIT $6\n ", "describe": { "columns": [ { @@ -188,7 +188,8 @@ "Timestamptz", "Int8", "Int8", - "Int2Array" + "Int2Array", + "Int2" ] }, "nullable": [ @@ -210,5 +211,5 @@ false ] }, - "hash": "2267c85c54547cb9d753b0027792b0543b9b6849ef82927593d513976065ec2a" + "hash": "c37c8b961170e850d399cb2acd8b1443dd6131c58ea1bf063427cea5d32ac713" } diff --git a/.sqlx/query-c4749af0313cbf1f69aac17f06d58963b7cf428826dde90ac460257f309db38b.json b/.sqlx/query-c4749af0313cbf1f69aac17f06d58963b7cf428826dde90ac460257f309db38b.json index b6c145d5..d5602761 100644 --- a/.sqlx/query-c4749af0313cbf1f69aac17f06d58963b7cf428826dde90ac460257f309db38b.json +++ b/.sqlx/query-c4749af0313cbf1f69aac17f06d58963b7cf428826dde90ac460257f309db38b.json @@ -7,7 +7,7 @@ "Left": [ "Int8", "Timestamptz", - "Text", + "Int2", "Int8", "Timestamptz" ] diff --git a/.sqlx/query-c4a567aefe592a2ce0b97e54766d32255237a966851993ffcab6dc4d0be07c72.json b/.sqlx/query-c8e14f5b2b2128eca3a2bf9b66a73edbd10b35bc7c14140a54cbd828459420d3.json similarity index 68% rename from .sqlx/query-c4a567aefe592a2ce0b97e54766d32255237a966851993ffcab6dc4d0be07c72.json rename to .sqlx/query-c8e14f5b2b2128eca3a2bf9b66a73edbd10b35bc7c14140a54cbd828459420d3.json index b6abc9f7..870b6b9e 100644 --- a/.sqlx/query-c4a567aefe592a2ce0b97e54766d32255237a966851993ffcab6dc4d0be07c72.json +++ b/.sqlx/query-c8e14f5b2b2128eca3a2bf9b66a73edbd10b35bc7c14140a54cbd828459420d3.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id, created_at\n FROM chat_messages\n WHERE deletion_source = 'user'\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, created_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", + "query": "\n SELECT id, created_at\n FROM chat_messages\n WHERE deletion_source = $3\n AND deleted_at <= NOW() - make_interval(days => $1)\n ORDER BY deleted_at ASC, created_at ASC, id ASC\n LIMIT $2\n FOR UPDATE SKIP LOCKED\n ", "describe": { "columns": [ { @@ -29,7 +29,8 @@ "parameters": { "Left": [ "Int4", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -37,5 +38,5 @@ false ] }, - "hash": "c4a567aefe592a2ce0b97e54766d32255237a966851993ffcab6dc4d0be07c72" + "hash": "c8e14f5b2b2128eca3a2bf9b66a73edbd10b35bc7c14140a54cbd828459420d3" } diff --git a/.sqlx/query-6c1976761371e9d770038cc35ce7f5b27ae9cc6471eeed1511183a8d4f39fea4.json b/.sqlx/query-cb5e880fb39d40ef76f8aa7106b7786dc0203758ef5f1eef25e90849c5cd0859.json similarity index 85% rename from .sqlx/query-6c1976761371e9d770038cc35ce7f5b27ae9cc6471eeed1511183a8d4f39fea4.json rename to .sqlx/query-cb5e880fb39d40ef76f8aa7106b7786dc0203758ef5f1eef25e90849c5cd0859.json index 61793287..f6c6268c 100644 --- a/.sqlx/query-6c1976761371e9d770038cc35ce7f5b27ae9cc6471eeed1511183a8d4f39fea4.json +++ b/.sqlx/query-cb5e880fb39d40ef76f8aa7106b7786dc0203758ef5f1eef25e90849c5cd0859.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM 'account'\n WHERE e.event_type = $1\n AND e.room_id = $2\n AND e.message_id = $3\n AND e.message_created_at = $4\n ORDER BY sequence ASC\n LIMIT 1\n ", + "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM $5\n WHERE e.event_type = $1\n AND e.room_id = $2\n AND e.message_id = $3\n AND e.message_created_at = $4\n ORDER BY sequence ASC\n LIMIT 1\n ", "describe": { "columns": [ { @@ -75,7 +75,8 @@ "Text", "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ @@ -87,5 +88,5 @@ false ] }, - "hash": "6c1976761371e9d770038cc35ce7f5b27ae9cc6471eeed1511183a8d4f39fea4" + "hash": "cb5e880fb39d40ef76f8aa7106b7786dc0203758ef5f1eef25e90849c5cd0859" } diff --git a/.sqlx/query-a97a2e35e6c6112c3b6a808adf63dfb211c4cf01440e3fc82b4b235d06fc2e9b.json b/.sqlx/query-cb7d1e5485554355d574768b83f600497ba6e871a04efe1633c804a9ba0a27f1.json similarity index 74% rename from .sqlx/query-a97a2e35e6c6112c3b6a808adf63dfb211c4cf01440e3fc82b4b235d06fc2e9b.json rename to .sqlx/query-cb7d1e5485554355d574768b83f600497ba6e871a04efe1633c804a9ba0a27f1.json index f640a02b..2cbc0f5d 100644 --- a/.sqlx/query-a97a2e35e6c6112c3b6a808adf63dfb211c4cf01440e3fc82b4b235d06fc2e9b.json +++ b/.sqlx/query-cb7d1e5485554355d574768b83f600497ba6e871a04efe1633c804a9ba0a27f1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO playlists (\n room_id, creator_id, name, cover_file_reference_id, position,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'expired-parent', $3, 1.0, $4, 'user')\n RETURNING id", + "query": "INSERT INTO playlists (\n room_id, creator_id, name, cover_file_reference_id, position,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'expired-parent', $3, 1.0, $4, $5)\n RETURNING id", "describe": { "columns": [ { @@ -20,12 +20,13 @@ "Int8", "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "a97a2e35e6c6112c3b6a808adf63dfb211c4cf01440e3fc82b4b235d06fc2e9b" + "hash": "cb7d1e5485554355d574768b83f600497ba6e871a04efe1633c804a9ba0a27f1" } diff --git a/.sqlx/query-b8b6ba69c802cd10ce3288b2e885982ead7d34749dd6fb9fac441ccebd5df387.json b/.sqlx/query-cc1770204bc4418886bfffea97a54c3d7e2de4ed3aa0a06941aad7fde4e97689.json similarity index 64% rename from .sqlx/query-b8b6ba69c802cd10ce3288b2e885982ead7d34749dd6fb9fac441ccebd5df387.json rename to .sqlx/query-cc1770204bc4418886bfffea97a54c3d7e2de4ed3aa0a06941aad7fde4e97689.json index 6d88f549..54562330 100644 --- a/.sqlx/query-b8b6ba69c802cd10ce3288b2e885982ead7d34749dd6fb9fac441ccebd5df387.json +++ b/.sqlx/query-cc1770204bc4418886bfffea97a54c3d7e2de4ed3aa0a06941aad7fde4e97689.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT COUNT(*) AS \"count!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n AND status <> $2\n AND (user_id IS NULL OR user_id <> $3)\n AND (created_at, id) > ($4, $5)\n ", + "query": "\n SELECT COUNT(*) AS \"count!\"\n FROM chat_messages\n WHERE room_id = $1\n AND deletion_source IS DISTINCT FROM $6\n AND status <> $2\n AND (user_id IS NULL OR user_id <> $3)\n AND (created_at, id) > ($4, $5)\n ", "describe": { "columns": [ { @@ -16,12 +16,13 @@ "Int2", "Int8", "Timestamptz", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ null ] }, - "hash": "b8b6ba69c802cd10ce3288b2e885982ead7d34749dd6fb9fac441ccebd5df387" + "hash": "cc1770204bc4418886bfffea97a54c3d7e2de4ed3aa0a06941aad7fde4e97689" } diff --git a/.sqlx/query-f019088abddb82d5543e79c31c8b1c6a8825c75820f334a81734c6225b7bda98.json b/.sqlx/query-d23209162da8e8d4c641451628549493fef6145f85ed98a7e8980019588fd35e.json similarity index 88% rename from .sqlx/query-f019088abddb82d5543e79c31c8b1c6a8825c75820f334a81734c6225b7bda98.json rename to .sqlx/query-d23209162da8e8d4c641451628549493fef6145f85ed98a7e8980019588fd35e.json index 77d3cbc8..ab94933a 100644 --- a/.sqlx/query-f019088abddb82d5543e79c31c8b1c6a8825c75820f334a81734c6225b7bda98.json +++ b/.sqlx/query-d23209162da8e8d4c641451628549493fef6145f85ed98a7e8980019588fd35e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM 'account'\n WHERE e.room_id = $1\n AND e.event_id = $2\n AND e.event_type = ANY($3::text[])\n ", + "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM $4\n WHERE e.room_id = $1\n AND e.event_id = $2\n AND e.event_type = ANY($3::text[])\n ", "describe": { "columns": [ { @@ -74,7 +74,8 @@ "Left": [ "Int8", "Text", - "TextArray" + "TextArray", + "Int2" ] }, "nullable": [ @@ -86,5 +87,5 @@ false ] }, - "hash": "f019088abddb82d5543e79c31c8b1c6a8825c75820f334a81734c6225b7bda98" + "hash": "d23209162da8e8d4c641451628549493fef6145f85ed98a7e8980019588fd35e" } diff --git a/.sqlx/query-d1233d6be2c74539044190bba38a4eb335ba5074216e053d1294a8ec587d089c.json b/.sqlx/query-d5c0f74e4e294da8af9aee0a3521b2bdfdba9752f3e4fe5559d24d8cc4c132c1.json similarity index 50% rename from .sqlx/query-d1233d6be2c74539044190bba38a4eb335ba5074216e053d1294a8ec587d089c.json rename to .sqlx/query-d5c0f74e4e294da8af9aee0a3521b2bdfdba9752f3e4fe5559d24d8cc4c132c1.json index b1587db5..95499255 100644 --- a/.sqlx/query-d1233d6be2c74539044190bba38a4eb335ba5074216e053d1294a8ec587d089c.json +++ b/.sqlx/query-d5c0f74e4e294da8af9aee0a3521b2bdfdba9752f3e4fe5559d24d8cc4c132c1.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE media SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "query": "UPDATE media SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { "Left": [ - "Int8Array" + "Int8Array", + "Int2" ] }, "nullable": [] }, - "hash": "d1233d6be2c74539044190bba38a4eb335ba5074216e053d1294a8ec587d089c" + "hash": "d5c0f74e4e294da8af9aee0a3521b2bdfdba9752f3e4fe5559d24d8cc4c132c1" } diff --git a/.sqlx/query-55f721d0f7d54c3c35813890dd8d1eb83504ee94a27dc84ff216936e2f6f7baa.json b/.sqlx/query-dbcdecd03e020ac5b53eb2039a436cb01dff04151c599a183ef374bcb53c10c9.json similarity index 96% rename from .sqlx/query-55f721d0f7d54c3c35813890dd8d1eb83504ee94a27dc84ff216936e2f6f7baa.json rename to .sqlx/query-dbcdecd03e020ac5b53eb2039a436cb01dff04151c599a183ef374bcb53c10c9.json index 0483afa4..7d10c68e 100644 --- a/.sqlx/query-55f721d0f7d54c3c35813890dd8d1eb83504ee94a27dc84ff216936e2f6f7baa.json +++ b/.sqlx/query-dbcdecd03e020ac5b53eb2039a436cb01dff04151c599a183ef374bcb53c10c9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND id = $2\n AND created_at = $3\n AND deletion_source IS DISTINCT FROM 'account'\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE room_id = $1\n AND id = $2\n AND created_at = $3\n AND deletion_source IS DISTINCT FROM $4\n ", "describe": { "columns": [ { @@ -184,7 +184,8 @@ "Left": [ "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ @@ -206,5 +207,5 @@ false ] }, - "hash": "55f721d0f7d54c3c35813890dd8d1eb83504ee94a27dc84ff216936e2f6f7baa" + "hash": "dbcdecd03e020ac5b53eb2039a436cb01dff04151c599a183ef374bcb53c10c9" } diff --git a/.sqlx/query-dc17744ebe91863fddb9451cd478c65b246bd3a47ffb033196f550b05d105b91.json b/.sqlx/query-dc17744ebe91863fddb9451cd478c65b246bd3a47ffb033196f550b05d105b91.json new file mode 100644 index 00000000..ed9c3683 --- /dev/null +++ b/.sqlx/query-dc17744ebe91863fddb9451cd478c65b246bd3a47ffb033196f550b05d105b91.json @@ -0,0 +1,31 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT deletion_source AS \"deletion_source?: DeletionSource\",\n deleted_owner_id AS \"deleted_owner_id: UserId\"\n FROM playlists\n WHERE id = ANY($1)\n UNION ALL\n SELECT deletion_source, deleted_owner_id\n FROM media\n WHERE id = ANY($2)", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "deletion_source?: DeletionSource", + "type_info": "Int2", + "origin": "Expression" + }, + { + "ordinal": 1, + "name": "deleted_owner_id: UserId", + "type_info": "Int8", + "origin": "Expression" + } + ], + "parameters": { + "Left": [ + "Int8Array", + "Int8Array" + ] + }, + "nullable": [ + null, + null + ] + }, + "hash": "dc17744ebe91863fddb9451cd478c65b246bd3a47ffb033196f550b05d105b91" +} diff --git a/.sqlx/query-09fa0580514eeea7c4a8225bb57f6b1ab1649bcdbc453cb60bc8aa850aa10efe.json b/.sqlx/query-e001208682bfd3a73359448673a167bfa1bc536e8316872683d929e72a352a3e.json similarity index 96% rename from .sqlx/query-09fa0580514eeea7c4a8225bb57f6b1ab1649bcdbc453cb60bc8aa850aa10efe.json rename to .sqlx/query-e001208682bfd3a73359448673a167bfa1bc536e8316872683d929e72a352a3e.json index d6c1a7bf..26ccdddd 100644 --- a/.sqlx/query-09fa0580514eeea7c4a8225bb57f6b1ab1649bcdbc453cb60bc8aa850aa10efe.json +++ b/.sqlx/query-e001208682bfd3a73359448673a167bfa1bc536e8316872683d929e72a352a3e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE id = $1\n AND deletion_source IS DISTINCT FROM 'account'\n ", + "query": "\n SELECT id AS \"id!\",\n room_id AS \"room_id!: RoomId\",\n user_id AS \"user_id?: UserId\",\n client_message_id,\n content AS \"content!\",\n message_type AS \"message_type!: ChatMessageType\",\n status AS \"status!: ChatMessageStatus\",\n version AS \"version!\",\n reply_to_message_id,\n reply_to_message_created_at,\n metadata AS \"metadata?: ChatMetadata\",\n edited_at,\n deleted_at,\n deleted_by AS \"deleted_by?: UserId\",\n delete_reason,\n created_at AS \"created_at!\"\n FROM chat_messages\n WHERE id = $1\n AND deletion_source IS DISTINCT FROM $2\n ", "describe": { "columns": [ { @@ -182,7 +182,8 @@ ], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -204,5 +205,5 @@ false ] }, - "hash": "09fa0580514eeea7c4a8225bb57f6b1ab1649bcdbc453cb60bc8aa850aa10efe" + "hash": "e001208682bfd3a73359448673a167bfa1bc536e8316872683d929e72a352a3e" } diff --git a/.sqlx/query-0912dea60960f3f341cd73365d98b005fe5cb918afbb63eb680e747e62d71999.json b/.sqlx/query-e23d8488c751166834d6609b9d5aa910ef9f2661fda135a539091580600abf1f.json similarity index 87% rename from .sqlx/query-0912dea60960f3f341cd73365d98b005fe5cb918afbb63eb680e747e62d71999.json rename to .sqlx/query-e23d8488c751166834d6609b9d5aa910ef9f2661fda135a539091580600abf1f.json index 3ebcafb2..92818a68 100644 --- a/.sqlx/query-0912dea60960f3f341cd73365d98b005fe5cb918afbb63eb680e747e62d71999.json +++ b/.sqlx/query-e23d8488c751166834d6609b9d5aa910ef9f2661fda135a539091580600abf1f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, provider_instance_name, provider_user_id FROM auth_oauth2_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = 'account' FOR UPDATE", + "query": "SELECT id, provider_instance_name, provider_user_id FROM auth_oauth2_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = $2 FOR UPDATE", "describe": { "columns": [ { @@ -39,7 +39,8 @@ ], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -48,5 +49,5 @@ false ] }, - "hash": "0912dea60960f3f341cd73365d98b005fe5cb918afbb63eb680e747e62d71999" + "hash": "e23d8488c751166834d6609b9d5aa910ef9f2661fda135a539091580600abf1f" } diff --git a/.sqlx/query-86750e5e5c071925cc8384b7431921cc93393312acb095055ee8e0618ac01111.json b/.sqlx/query-e24401b52f480524d7cb087b991002c84b1f076c7d26157777f0d9820ab5b878.json similarity index 85% rename from .sqlx/query-86750e5e5c071925cc8384b7431921cc93393312acb095055ee8e0618ac01111.json rename to .sqlx/query-e24401b52f480524d7cb087b991002c84b1f076c7d26157777f0d9820ab5b878.json index 91375cba..2cf568b6 100644 --- a/.sqlx/query-86750e5e5c071925cc8384b7431921cc93393312acb095055ee8e0618ac01111.json +++ b/.sqlx/query-e24401b52f480524d7cb087b991002c84b1f076c7d26157777f0d9820ab5b878.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM 'account'\n WHERE e.room_id = $1\n AND e.event_type = ANY($2::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($4::text[])\n ORDER BY sequence ASC\n LIMIT $3\n ", + "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM $5\n WHERE e.room_id = $1\n AND e.event_type = ANY($2::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($4::text[])\n ORDER BY sequence ASC\n LIMIT $3\n ", "describe": { "columns": [ { @@ -75,7 +75,8 @@ "Int8", "TextArray", "Int8", - "TextArray" + "TextArray", + "Int2" ] }, "nullable": [ @@ -87,5 +88,5 @@ false ] }, - "hash": "86750e5e5c071925cc8384b7431921cc93393312acb095055ee8e0618ac01111" + "hash": "e24401b52f480524d7cb087b991002c84b1f076c7d26157777f0d9820ab5b878" } diff --git a/.sqlx/query-116e567d2c0aaa7f854d17d1684a80de963702afd90e9b45ddad0cc3f5abaa10.json b/.sqlx/query-e38d7f27787aa416c1f5182f7f5f0c016b8ee2ec830c8f5bd7213e1b833b9388.json similarity index 61% rename from .sqlx/query-116e567d2c0aaa7f854d17d1684a80de963702afd90e9b45ddad0cc3f5abaa10.json rename to .sqlx/query-e38d7f27787aa416c1f5182f7f5f0c016b8ee2ec830c8f5bd7213e1b833b9388.json index 923aff6e..29678481 100644 --- a/.sqlx/query-116e567d2c0aaa7f854d17d1684a80de963702afd90e9b45ddad0cc3f5abaa10.json +++ b/.sqlx/query-e38d7f27787aa416c1f5182f7f5f0c016b8ee2ec830c8f5bd7213e1b833b9388.json @@ -1,16 +1,17 @@ { "db_name": "PostgreSQL", - "query": "UPDATE rooms SET deleted_at = $2, deletion_source = 'account', deleted_owner_id = $1 WHERE id = $3", + "query": "UPDATE rooms SET deleted_at = $2, deletion_source = $4, deleted_owner_id = $1 WHERE id = $3", "describe": { "columns": [], "parameters": { "Left": [ "Int8", "Timestamptz", - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "116e567d2c0aaa7f854d17d1684a80de963702afd90e9b45ddad0cc3f5abaa10" + "hash": "e38d7f27787aa416c1f5182f7f5f0c016b8ee2ec830c8f5bd7213e1b833b9388" } diff --git a/.sqlx/query-9d7f6821997d50a6a52bbe068d4f24d744b586389da976eada9103576d436d77.json b/.sqlx/query-ee0ea9b0155d8ce137603283d6440dee3c7cd926bcacf9acbc08cc8790853439.json similarity index 71% rename from .sqlx/query-9d7f6821997d50a6a52bbe068d4f24d744b586389da976eada9103576d436d77.json rename to .sqlx/query-ee0ea9b0155d8ce137603283d6440dee3c7cd926bcacf9acbc08cc8790853439.json index 4e6cb8ea..55d8f7ca 100644 --- a/.sqlx/query-9d7f6821997d50a6a52bbe068d4f24d744b586389da976eada9103576d436d77.json +++ b/.sqlx/query-ee0ea9b0155d8ce137603283d6440dee3c7cd926bcacf9acbc08cc8790853439.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT email FROM auth_email_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = 'account' FOR UPDATE", + "query": "SELECT email FROM auth_email_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = $2 FOR UPDATE", "describe": { "columns": [ { @@ -17,12 +17,13 @@ ], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [ false ] }, - "hash": "9d7f6821997d50a6a52bbe068d4f24d744b586389da976eada9103576d436d77" + "hash": "ee0ea9b0155d8ce137603283d6440dee3c7cd926bcacf9acbc08cc8790853439" } diff --git a/.sqlx/query-b25120b032bf972b826c63434bb0836ada2f4b397531a36620460a3adc0f921f.json b/.sqlx/query-f035ac6f41e074663f9c3699d9d8f46e4813f53caf92482497c94f1c9ea649a8.json similarity index 81% rename from .sqlx/query-b25120b032bf972b826c63434bb0836ada2f4b397531a36620460a3adc0f921f.json rename to .sqlx/query-f035ac6f41e074663f9c3699d9d8f46e4813f53caf92482497c94f1c9ea649a8.json index 130da9fc..3007f887 100644 --- a/.sqlx/query-b25120b032bf972b826c63434bb0836ada2f4b397531a36620460a3adc0f921f.json +++ b/.sqlx/query-f035ac6f41e074663f9c3699d9d8f46e4813f53caf92482497c94f1c9ea649a8.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO media (\n room_id, creator_id, name, position, source_provider, source_config,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'room-media', 3.0, 1, '{}'::JSONB, $3, 'room')\n RETURNING id", + "query": "INSERT INTO media (\n room_id, creator_id, name, position, source_provider, source_config,\n deleted_at, deletion_source\n )\n VALUES ($1, $2, 'room-media', 3.0, 1, '{}'::JSONB, $3, $4)\n RETURNING id", "describe": { "columns": [ { @@ -19,12 +19,13 @@ "Left": [ "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "b25120b032bf972b826c63434bb0836ada2f4b397531a36620460a3adc0f921f" + "hash": "f035ac6f41e074663f9c3699d9d8f46e4813f53caf92482497c94f1c9ea649a8" } diff --git a/.sqlx/query-f05a2ec292897cafda722cbd9c4afe652371c8ce9c419816bb25a4fad0105ca7.json b/.sqlx/query-f05a2ec292897cafda722cbd9c4afe652371c8ce9c419816bb25a4fad0105ca7.json deleted file mode 100644 index d66deec5..00000000 --- a/.sqlx/query-f05a2ec292897cafda722cbd9c4afe652371c8ce9c419816bb25a4fad0105ca7.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "UPDATE rooms SET deletion_source = 'account', deleted_owner_id = $2 WHERE id = $1", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Int8", - "Int8" - ] - }, - "nullable": [] - }, - "hash": "f05a2ec292897cafda722cbd9c4afe652371c8ce9c419816bb25a4fad0105ca7" -} diff --git a/.sqlx/query-56c4c2099b11f896373004c4c9b4de57a8011c670d969150d5f6f81066a38fca.json b/.sqlx/query-f0f09d46c0aa153736e07720cbd1389f723c7fd9958ccc060fcb36b6bdddab0a.json similarity index 69% rename from .sqlx/query-56c4c2099b11f896373004c4c9b4de57a8011c670d969150d5f6f81066a38fca.json rename to .sqlx/query-f0f09d46c0aa153736e07720cbd1389f723c7fd9958ccc060fcb36b6bdddab0a.json index 2ca85044..c38b4329 100644 --- a/.sqlx/query-56c4c2099b11f896373004c4c9b4de57a8011c670d969150d5f6f81066a38fca.json +++ b/.sqlx/query-f0f09d46c0aa153736e07720cbd1389f723c7fd9958ccc060fcb36b6bdddab0a.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n WITH updated_user AS (\n UPDATE users\n SET updated_at = $2, version = version + 1\n WHERE id = $1 AND deleted_at IS NULL\n RETURNING id, username, signup_method, role,\n avatar_file_reference_id,\n created_at, updated_at,\n version, deleted_at\n ),\n deleted_email AS (\n UPDATE auth_email_identities identity\n SET deleted_at = $2,\n deletion_source = 'user',\n updated_at = $2\n FROM updated_user\n WHERE identity.user_id = updated_user.id\n AND identity.deleted_at IS NULL\n )\n SELECT u.id AS \"id!: UserId\",\n u.username AS \"username!\",\n u.signup_method AS \"signup_method!: SignupMethod\",\n u.role AS \"role!: UserRole\",\n u.avatar_file_reference_id,\n CASE\n WHEN active_ban.user_id IS NULL THEN 1::SMALLINT\n ELSE 2::SMALLINT\n END AS \"status!: UserStatus\",\n (active_ban.user_id IS NOT NULL) AS \"is_banned!\",\n active_ban.starts_at AS banned_at,\n active_ban.banned_by AS \"banned_by?: UserId\",\n active_ban.reason AS banned_reason,\n u.created_at AS \"created_at!\",\n u.updated_at AS \"updated_at!\",\n u.version AS \"version!\",\n u.deleted_at\n FROM updated_user u\n LEFT JOIN LATERAL (\n SELECT ub.user_id,\n ub.starts_at,\n ub.banned_by,\n ub.reason\n FROM user_bans ub\n WHERE ub.user_id = u.id\n AND ub.revoked_at IS NULL\n AND (ub.ends_at IS NULL OR ub.ends_at > CURRENT_TIMESTAMP)\n ORDER BY ub.starts_at DESC\n LIMIT 1\n ) active_ban ON TRUE\n ", + "query": "\n WITH updated_user AS (\n UPDATE users\n SET updated_at = $2, version = version + 1\n WHERE id = $1 AND deleted_at IS NULL\n RETURNING id, username, signup_method, role,\n avatar_file_reference_id,\n created_at, updated_at,\n version, deleted_at\n ),\n deleted_email AS (\n UPDATE auth_email_identities identity\n SET deleted_at = $2,\n deletion_source = $3,\n updated_at = $2\n FROM updated_user\n WHERE identity.user_id = updated_user.id\n AND identity.deleted_at IS NULL\n )\n SELECT u.id AS \"id!: UserId\",\n u.username AS \"username!\",\n u.signup_method AS \"signup_method!: SignupMethod\",\n u.role AS \"role!: UserRole\",\n u.avatar_file_reference_id,\n CASE\n WHEN active_ban.user_id IS NULL THEN 1::SMALLINT\n ELSE 2::SMALLINT\n END AS \"status!: UserStatus\",\n (active_ban.user_id IS NOT NULL) AS \"is_banned!\",\n active_ban.starts_at AS banned_at,\n active_ban.banned_by AS \"banned_by?: UserId\",\n active_ban.reason AS banned_reason,\n u.created_at AS \"created_at!\",\n u.updated_at AS \"updated_at!\",\n u.version AS \"version!\",\n u.deleted_at\n FROM updated_user u\n LEFT JOIN LATERAL (\n SELECT ub.user_id,\n ub.starts_at,\n ub.banned_by,\n ub.reason\n FROM user_bans ub\n WHERE ub.user_id = u.id\n AND ub.revoked_at IS NULL\n AND (ub.ends_at IS NULL OR ub.ends_at > CURRENT_TIMESTAMP)\n ORDER BY ub.starts_at DESC\n LIMIT 1\n ) active_ban ON TRUE\n ", "describe": { "columns": [ { @@ -151,7 +151,8 @@ "parameters": { "Left": [ "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ @@ -171,5 +172,5 @@ true ] }, - "hash": "56c4c2099b11f896373004c4c9b4de57a8011c670d969150d5f6f81066a38fca" + "hash": "f0f09d46c0aa153736e07720cbd1389f723c7fd9958ccc060fcb36b6bdddab0a" } diff --git a/.sqlx/query-c2a3aa6f54d4b6d9e81cbe7414a427eaac14f86606cb899bf4f56b691df98117.json b/.sqlx/query-f185248db097833d41e63fe60cec90e2c268f6f9c7df7c401861396dd0efa79d.json similarity index 70% rename from .sqlx/query-c2a3aa6f54d4b6d9e81cbe7414a427eaac14f86606cb899bf4f56b691df98117.json rename to .sqlx/query-f185248db097833d41e63fe60cec90e2c268f6f9c7df7c401861396dd0efa79d.json index 1e19804c..63f3587f 100644 --- a/.sqlx/query-c2a3aa6f54d4b6d9e81cbe7414a427eaac14f86606cb899bf4f56b691df98117.json +++ b/.sqlx/query-f185248db097833d41e63fe60cec90e2c268f6f9c7df7c401861396dd0efa79d.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE chat_messages SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, deleted_by = NULL, delete_reason = NULL, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "query": "UPDATE chat_messages SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, deleted_by = NULL, delete_reason = NULL, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "c2a3aa6f54d4b6d9e81cbe7414a427eaac14f86606cb899bf4f56b691df98117" + "hash": "f185248db097833d41e63fe60cec90e2c268f6f9c7df7c401861396dd0efa79d" } diff --git a/.sqlx/query-119256c375dbab48576e47d1ab8cff2803aa690f6c557cc7046bc132957c68f1.json b/.sqlx/query-f6997e57f8294eb3629df085b15d7ec9bb5d2d4bccb463e095b7fc8fc7988eb9.json similarity index 50% rename from .sqlx/query-119256c375dbab48576e47d1ab8cff2803aa690f6c557cc7046bc132957c68f1.json rename to .sqlx/query-f6997e57f8294eb3629df085b15d7ec9bb5d2d4bccb463e095b7fc8fc7988eb9.json index 9f1f1eef..437391fa 100644 --- a/.sqlx/query-119256c375dbab48576e47d1ab8cff2803aa690f6c557cc7046bc132957c68f1.json +++ b/.sqlx/query-f6997e57f8294eb3629df085b15d7ec9bb5d2d4bccb463e095b7fc8fc7988eb9.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE playlists SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "query": "UPDATE playlists SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", "describe": { "columns": [], "parameters": { "Left": [ - "Int8Array" + "Int8Array", + "Int2" ] }, "nullable": [] }, - "hash": "119256c375dbab48576e47d1ab8cff2803aa690f6c557cc7046bc132957c68f1" + "hash": "f6997e57f8294eb3629df085b15d7ec9bb5d2d4bccb463e095b7fc8fc7988eb9" } diff --git a/.sqlx/query-cacbfc47bf21441d636801c934c284283b82587dcfd9c83e0acb81c1d8466fb5.json b/.sqlx/query-f719f27a1f7a74715b1ff0826d19571d2cae42928ac98ec434af9b2f9fcd1339.json similarity index 78% rename from .sqlx/query-cacbfc47bf21441d636801c934c284283b82587dcfd9c83e0acb81c1d8466fb5.json rename to .sqlx/query-f719f27a1f7a74715b1ff0826d19571d2cae42928ac98ec434af9b2f9fcd1339.json index e8d8e615..0c58f070 100644 --- a/.sqlx/query-cacbfc47bf21441d636801c934c284283b82587dcfd9c83e0acb81c1d8466fb5.json +++ b/.sqlx/query-f719f27a1f7a74715b1ff0826d19571d2cae42928ac98ec434af9b2f9fcd1339.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO playlists (\n room_id, creator_id, name, position, deleted_at, deletion_source\n )\n VALUES ($1, $2, 'recent-user-delete', 2.0, $3, 'user')\n RETURNING id", + "query": "INSERT INTO playlists (\n room_id, creator_id, name, position, deleted_at, deletion_source\n )\n VALUES ($1, $2, 'recent-user-delete', 2.0, $3, $4)\n RETURNING id", "describe": { "columns": [ { @@ -19,12 +19,13 @@ "Left": [ "Int8", "Int8", - "Timestamptz" + "Timestamptz", + "Int2" ] }, "nullable": [ false ] }, - "hash": "cacbfc47bf21441d636801c934c284283b82587dcfd9c83e0acb81c1d8466fb5" + "hash": "f719f27a1f7a74715b1ff0826d19571d2cae42928ac98ec434af9b2f9fcd1339" } diff --git a/.sqlx/query-8aa7b48477ccd10fddd9f8f9d7381c7c4cc1e626aa6faaf21b4c21b6ff8629b5.json b/.sqlx/query-f947d5c6f21b996d3ecdf3b7e296127dbd7a416151d0d5543e94a23ca8ddb99a.json similarity index 55% rename from .sqlx/query-8aa7b48477ccd10fddd9f8f9d7381c7c4cc1e626aa6faaf21b4c21b6ff8629b5.json rename to .sqlx/query-f947d5c6f21b996d3ecdf3b7e296127dbd7a416151d0d5543e94a23ca8ddb99a.json index a611c8b4..00047ffa 100644 --- a/.sqlx/query-8aa7b48477ccd10fddd9f8f9d7381c7c4cc1e626aa6faaf21b4c21b6ff8629b5.json +++ b/.sqlx/query-f947d5c6f21b996d3ecdf3b7e296127dbd7a416151d0d5543e94a23ca8ddb99a.json @@ -1,14 +1,15 @@ { "db_name": "PostgreSQL", - "query": "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user' WHERE user_id = $1", + "query": "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2 WHERE user_id = $1", "describe": { "columns": [], "parameters": { "Left": [ - "Int8" + "Int8", + "Int2" ] }, "nullable": [] }, - "hash": "8aa7b48477ccd10fddd9f8f9d7381c7c4cc1e626aa6faaf21b4c21b6ff8629b5" + "hash": "f947d5c6f21b996d3ecdf3b7e296127dbd7a416151d0d5543e94a23ca8ddb99a" } diff --git a/.sqlx/query-25a435d6aee391f0fe6b1eb872a328414f07702da4cf735f7086ec198de54184.json b/.sqlx/query-faac538ae5f2f341021d114379930307d8291e161bc8609717e6c57dc72275a6.json similarity index 90% rename from .sqlx/query-25a435d6aee391f0fe6b1eb872a328414f07702da4cf735f7086ec198de54184.json rename to .sqlx/query-faac538ae5f2f341021d114379930307d8291e161bc8609717e6c57dc72275a6.json index b9a5883d..051ff21b 100644 --- a/.sqlx/query-25a435d6aee391f0fe6b1eb872a328414f07702da4cf735f7086ec198de54184.json +++ b/.sqlx/query-faac538ae5f2f341021d114379930307d8291e161bc8609717e6c57dc72275a6.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT p.room_id AS \"room_id!: RoomId\",\n p.message_id AS \"message_id!\",\n p.message_created_at AS \"message_created_at!\",\n p.pinned_by AS \"pinned_by?: UserId\",\n u.username AS pinned_by_username,\n p.note,\n p.pinned_at AS \"pinned_at!\"\n FROM chat_message_pins p\n LEFT JOIN users u ON u.id = p.pinned_by\n JOIN chat_messages m\n ON m.room_id = p.room_id\n AND m.id = p.message_id\n AND m.created_at = p.message_created_at\n WHERE p.room_id = $1\n AND m.status <> $2\n AND m.deletion_source IS DISTINCT FROM 'account'\n ORDER BY p.pinned_at DESC, p.message_id DESC\n LIMIT $3\n ", + "query": "\n SELECT p.room_id AS \"room_id!: RoomId\",\n p.message_id AS \"message_id!\",\n p.message_created_at AS \"message_created_at!\",\n p.pinned_by AS \"pinned_by?: UserId\",\n u.username AS pinned_by_username,\n p.note,\n p.pinned_at AS \"pinned_at!\"\n FROM chat_message_pins p\n LEFT JOIN users u ON u.id = p.pinned_by\n JOIN chat_messages m\n ON m.room_id = p.room_id\n AND m.id = p.message_id\n AND m.created_at = p.message_created_at\n WHERE p.room_id = $1\n AND m.status <> $2\n AND m.deletion_source IS DISTINCT FROM $4\n ORDER BY p.pinned_at DESC, p.message_id DESC\n LIMIT $3\n ", "describe": { "columns": [ { @@ -85,7 +85,8 @@ "Left": [ "Int8", "Int2", - "Int8" + "Int8", + "Int2" ] }, "nullable": [ @@ -98,5 +99,5 @@ false ] }, - "hash": "25a435d6aee391f0fe6b1eb872a328414f07702da4cf735f7086ec198de54184" + "hash": "faac538ae5f2f341021d114379930307d8291e161bc8609717e6c57dc72275a6" } diff --git a/.sqlx/query-1a8697195909dc84dbb3db488035fa45b96b82063ff825d8af62014e22c2fe31.json b/.sqlx/query-fd3d5d8c9d6fb4c42a0728ec2f8ff63bd3f084862bd8b7dfad1399c7efc5266e.json similarity index 84% rename from .sqlx/query-1a8697195909dc84dbb3db488035fa45b96b82063ff825d8af62014e22c2fe31.json rename to .sqlx/query-fd3d5d8c9d6fb4c42a0728ec2f8ff63bd3f084862bd8b7dfad1399c7efc5266e.json index 80a0c1e4..21e4be0d 100644 --- a/.sqlx/query-1a8697195909dc84dbb3db488035fa45b96b82063ff825d8af62014e22c2fe31.json +++ b/.sqlx/query-fd3d5d8c9d6fb4c42a0728ec2f8ff63bd3f084862bd8b7dfad1399c7efc5266e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM 'account'\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.event_type = ANY($3::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($5::text[])\n ORDER BY sequence ASC\n LIMIT $4\n ", + "query": "\n SELECT e.sequence AS \"sequence!\",\n e.event_id AS \"event_id!\",\n e.room_id AS \"room_id?\",\n e.actor_user_id AS \"actor_user_id?\",\n e.payload AS \"event_payload?: sqlx::types::Json\",\n e.occurred_at AS \"occurred_at!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM $6\n WHERE e.room_id = $1\n AND e.sequence > $2\n AND e.event_type = ANY($3::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($5::text[])\n ORDER BY sequence ASC\n LIMIT $4\n ", "describe": { "columns": [ { @@ -76,7 +76,8 @@ "Int8", "TextArray", "Int8", - "TextArray" + "TextArray", + "Int2" ] }, "nullable": [ @@ -88,5 +89,5 @@ false ] }, - "hash": "1a8697195909dc84dbb3db488035fa45b96b82063ff825d8af62014e22c2fe31" + "hash": "fd3d5d8c9d6fb4c42a0728ec2f8ff63bd3f084862bd8b7dfad1399c7efc5266e" } diff --git a/.sqlx/query-2d2a8f46e7cf58abe1666e0ddbc4f0a89754a685386580f928a4d2aab477e390.json b/.sqlx/query-fd8ce1ac18590704e2f26f093db281fc868e7bc866313fbc2a73ce0a41f2251f.json similarity index 72% rename from .sqlx/query-2d2a8f46e7cf58abe1666e0ddbc4f0a89754a685386580f928a4d2aab477e390.json rename to .sqlx/query-fd8ce1ac18590704e2f26f093db281fc868e7bc866313fbc2a73ce0a41f2251f.json index ddcae065..56b4e408 100644 --- a/.sqlx/query-2d2a8f46e7cf58abe1666e0ddbc4f0a89754a685386580f928a4d2aab477e390.json +++ b/.sqlx/query-fd8ce1ac18590704e2f26f093db281fc868e7bc866313fbc2a73ce0a41f2251f.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "\n SELECT e.event_id AS \"event_id?\", e.sequence AS \"sequence!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM 'account'\n WHERE e.room_id = $1\n AND e.event_type = ANY($2::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($3::text[])\n ORDER BY e.sequence DESC\n LIMIT 1\n ", + "query": "\n SELECT e.event_id AS \"event_id?\", e.sequence AS \"sequence!\"\n FROM chat_message_events e\n JOIN chat_messages m\n ON m.room_id = e.room_id\n AND m.id = e.message_id\n AND m.created_at = e.message_created_at\n AND m.deletion_source IS DISTINCT FROM $4\n WHERE e.room_id = $1\n AND e.event_type = ANY($2::text[])\n AND (e.payload #>> '{message,message,messageType}') = ANY($3::text[])\n ORDER BY e.sequence DESC\n LIMIT 1\n ", "describe": { "columns": [ { @@ -30,7 +30,8 @@ "Left": [ "Int8", "TextArray", - "TextArray" + "TextArray", + "Int2" ] }, "nullable": [ @@ -38,5 +39,5 @@ false ] }, - "hash": "2d2a8f46e7cf58abe1666e0ddbc4f0a89754a685386580f928a4d2aab477e390" + "hash": "fd8ce1ac18590704e2f26f093db281fc868e7bc866313fbc2a73ce0a41f2251f" } diff --git a/migrations/20260808001_resource_lifecycle.sql b/migrations/20260808001_resource_lifecycle.sql index 5168ab15..abcffac8 100644 --- a/migrations/20260808001_resource_lifecycle.sql +++ b/migrations/20260808001_resource_lifecycle.sql @@ -1,45 +1,37 @@ -- Unified lifecycle metadata for account-owned resources. -- A deleted row remains recoverable during the configured retention window. ALTER TABLE users - ADD COLUMN IF NOT EXISTS deletion_source TEXT, + ADD COLUMN IF NOT EXISTS deletion_source SMALLINT, ADD COLUMN IF NOT EXISTS deletion_reason TEXT, ADD COLUMN IF NOT EXISTS deleted_by BIGINT REFERENCES users(id) ON DELETE SET NULL, ADD COLUMN IF NOT EXISTS restored_at TIMESTAMPTZ, ADD COLUMN IF NOT EXISTS restored_by BIGINT REFERENCES users(id) ON DELETE SET NULL; ALTER TABLE rooms - ADD COLUMN IF NOT EXISTS deletion_source TEXT, + ADD COLUMN IF NOT EXISTS deletion_source SMALLINT, ADD COLUMN IF NOT EXISTS deleted_owner_id BIGINT REFERENCES users(id) ON DELETE CASCADE; ALTER TABLE playlists ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ, - ADD COLUMN IF NOT EXISTS deletion_source TEXT, + ADD COLUMN IF NOT EXISTS deletion_source SMALLINT, ADD COLUMN IF NOT EXISTS deleted_owner_id BIGINT REFERENCES users(id) ON DELETE CASCADE; ALTER TABLE media ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ, - ADD COLUMN IF NOT EXISTS deletion_source TEXT, + ADD COLUMN IF NOT EXISTS deletion_source SMALLINT, ADD COLUMN IF NOT EXISTS deleted_owner_id BIGINT REFERENCES users(id) ON DELETE CASCADE; ALTER TABLE chat_messages - ADD COLUMN IF NOT EXISTS deletion_source TEXT, + ADD COLUMN IF NOT EXISTS deletion_source SMALLINT, ADD COLUMN IF NOT EXISTS deleted_owner_id BIGINT REFERENCES users(id) ON DELETE CASCADE; ALTER TABLE auth_email_identities ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ, - ADD COLUMN IF NOT EXISTS deletion_source TEXT; + ADD COLUMN IF NOT EXISTS deletion_source SMALLINT; ALTER TABLE auth_oauth2_identities ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMPTZ, - ADD COLUMN IF NOT EXISTS deletion_source TEXT; - --- Before lifecycle metadata existed, chat moderation already used --- `deleted_at` for user-requested message deletion. Preserve that state and --- let the resource retention cleanup retire those historical rows. -UPDATE chat_messages -SET deletion_source = 'user' -WHERE deleted_at IS NOT NULL - AND deletion_source IS NULL; + ADD COLUMN IF NOT EXISTS deletion_source SMALLINT; -- Existing table-level uniqueness prevents a deleted identity from releasing -- its email/provider subject. Replace it with active-row partial indexes. @@ -79,25 +71,3 @@ CREATE INDEX IF NOT EXISTS idx_auth_email_identities_deleted_at ON auth_email_identities(deleted_at) WHERE deleted_at IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_auth_oauth2_identities_deleted_at ON auth_oauth2_identities(deleted_at) WHERE deleted_at IS NOT NULL; - -ALTER TABLE users - ADD CONSTRAINT users_deletion_source_valid - CHECK (deletion_source IS NULL OR deletion_source IN ('account', 'admin', 'system')); -ALTER TABLE playlists - ADD CONSTRAINT playlists_deletion_source_valid - CHECK (deletion_source IS NULL OR deletion_source IN ('account', 'room', 'user')); -ALTER TABLE rooms - ADD CONSTRAINT rooms_deletion_source_valid - CHECK (deletion_source IS NULL OR deletion_source IN ('account', 'user', 'admin')); -ALTER TABLE media - ADD CONSTRAINT media_deletion_source_valid - CHECK (deletion_source IS NULL OR deletion_source IN ('account', 'room', 'user')); -ALTER TABLE chat_messages - ADD CONSTRAINT chat_messages_deletion_source_valid - CHECK (deletion_source IS NULL OR deletion_source IN ('account', 'room', 'user')); -ALTER TABLE auth_email_identities - ADD CONSTRAINT auth_email_identities_deletion_source_valid - CHECK (deletion_source IS NULL OR deletion_source IN ('account', 'user')); -ALTER TABLE auth_oauth2_identities - ADD CONSTRAINT auth_oauth2_identities_deletion_source_valid - CHECK (deletion_source IS NULL OR deletion_source IN ('account', 'user')); diff --git a/synctv-api-common/src/impls/admin/mapping.rs b/synctv-api-common/src/impls/admin/mapping.rs index ae560bb3..0cb7309f 100644 --- a/synctv-api-common/src/impls/admin/mapping.rs +++ b/synctv-api-common/src/impls/admin/mapping.rs @@ -563,7 +563,8 @@ pub(in crate::impls::admin) fn try_admin_user_to_proto( .and_then(|metadata| metadata.restored_at) .map_or(0, |value| value.timestamp()), deletion_source: lifecycle - .and_then(|metadata| metadata.deletion_source.clone()) + .and_then(|metadata| metadata.deletion_source) + .map(|source| source.as_str().to_string()) .unwrap_or_default(), deleted_by: encode_optional_user_id( public_id_codec, diff --git a/synctv-api-common/src/impls/admin/tests.rs b/synctv-api-common/src/impls/admin/tests.rs index daa6c872..b23be9f5 100644 --- a/synctv-api-common/src/impls/admin/tests.rs +++ b/synctv-api-common/src/impls/admin/tests.rs @@ -7,8 +7,8 @@ use std::collections::HashMap; use std::sync::{Arc, Mutex}; use synctv_core::models::{ - FromProviderParams, MemberStatus, PlaylistId, ReviewRequestId, RoomId, RoomRole, RoomStatus, - UserId, UserRole, UserStatus, + DeletionSource, FromProviderParams, MemberStatus, PlaylistId, ReviewRequestId, RoomId, + RoomRole, RoomStatus, UserId, UserRole, UserStatus, }; use synctv_core::service::ProvidersManager; use synctv_core::{ @@ -1718,7 +1718,7 @@ fn test_admin_user_to_proto_preserves_lifecycle_metadata() -> TestResult { user.deleted_at = Some(deleted_at); let lifecycle = synctv_core::models::UserLifecycleMetadata { user_id: user.id, - deletion_source: Some("admin".to_string()), + deletion_source: Some(DeletionSource::Admin), deletion_reason: Some("policy violation".to_string()), deleted_by: Some(actor_id), restored_at: None, diff --git a/synctv-core/src/models/lifecycle.rs b/synctv-core/src/models/lifecycle.rs new file mode 100644 index 00000000..f42c0113 --- /dev/null +++ b/synctv-core/src/models/lifecycle.rs @@ -0,0 +1,60 @@ +use serde::{Deserialize, Serialize}; + +/// Business-level reason that a recoverable resource became unavailable. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] +#[repr(i16)] +pub enum DeletionSource { + Account = 1, + Admin = 2, + System = 3, + Room = 4, + User = 5, +} + +impl DeletionSource { + #[must_use] + pub const fn as_str(self) -> &'static str { + match self { + Self::Account => "account", + Self::Admin => "admin", + Self::System => "system", + Self::Room => "room", + Self::User => "user", + } + } +} + +impl std::fmt::Display for DeletionSource { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str(self.as_str()) + } +} + +i16_enum!(DeletionSource, "Invalid deletion source", { + Account = 1, + Admin = 2, + System = 3, + Room = 4, + User = 5, +}); + +#[cfg(test)] +mod tests { + use super::DeletionSource; + + #[test] + fn deletion_sources_round_trip_storage_codes() { + for source in [ + DeletionSource::Account, + DeletionSource::Admin, + DeletionSource::System, + DeletionSource::Room, + DeletionSource::User, + ] { + let code = i16::from(source); + assert_eq!(DeletionSource::try_from(code), Ok(source)); + } + assert!(DeletionSource::try_from(i16::MAX).is_err()); + } +} diff --git a/synctv-core/src/models/mod.rs b/synctv-core/src/models/mod.rs index 6d80e1d6..e00a81e6 100644 --- a/synctv-core/src/models/mod.rs +++ b/synctv-core/src/models/mod.rs @@ -89,6 +89,7 @@ pub mod content_report; pub mod email_token; pub mod file_storage; pub mod id; +pub mod lifecycle; pub mod media; pub mod notification; pub mod oauth2_client; @@ -156,6 +157,7 @@ pub use id::{ ReviewRequestId, RoomCategoryId, RoomId, RoomLabelId, TypedId, UserId, LOCAL_MANAGEMENT_ACTOR_USER_ID, }; +pub use lifecycle::DeletionSource; pub use media::{ provider_type_code_from_name, provider_type_codes_from_names, provider_type_name_from_code, AcFunPlaybackFormat, AcFunPlaybackMetadata, AcFunPlaybackResourceKind, AlistPlaybackMetadata, diff --git a/synctv-core/src/models/user.rs b/synctv-core/src/models/user.rs index d9042653..26ff9321 100644 --- a/synctv-core/src/models/user.rs +++ b/synctv-core/src/models/user.rs @@ -307,7 +307,7 @@ pub struct User { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct UserLifecycleMetadata { pub user_id: UserId, - pub deletion_source: Option, + pub deletion_source: Option, pub deletion_reason: Option, pub deleted_by: Option, pub restored_at: Option>, diff --git a/synctv-core/src/repository/chat.rs b/synctv-core/src/repository/chat.rs index 8fabcde9..37ad154d 100644 --- a/synctv-core/src/repository/chat.rs +++ b/synctv-core/src/repository/chat.rs @@ -15,7 +15,7 @@ use crate::{ ChatMetadata, ChatPinEvent, ChatPinEventKind, ChatPinEventLog, ChatPinnedMessage, ChatPlaybackMessagesQuery, ChatReactionSummary, ChatReactionUser, ChatReactionUsersCursor, ChatReactionUsersPage, ChatReadState, ChatSearchMessagesPage, ChatSearchMessagesQuery, - EventCursor, NewStoredFile, RoomId, SetChatReaction, User, UserId, + DeletionSource, EventCursor, NewStoredFile, RoomId, SetChatReaction, User, UserId, CHAT_ATTACHMENT_FILENAME_MAX_CHARS, CHAT_ATTACHMENT_ID_MAX_CHARS, CHAT_CLIENT_MESSAGE_ID_MAX_CHARS, CHAT_CLIENT_OPERATION_ID_MAX_CHARS, CHAT_EVENT_ID_MAX_CHARS, CHAT_EVENT_TYPE_MAX_CHARS, CHAT_PIN_NOTE_MAX_CHARS, @@ -531,13 +531,14 @@ impl ChatRepository { AND m.created_at = p.message_created_at WHERE p.room_id = $1 AND m.status <> $2 - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $4 ORDER BY p.pinned_at DESC, p.message_id DESC LIMIT $3 "#, room_id.as_i64(), i16::from(ChatMessageStatus::Deleted), - i64::from(limit) + i64::from(limit), + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await?; @@ -841,11 +842,12 @@ impl ChatRepository { FROM chat_messages WHERE room_id = $1 AND id = $2 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $3 FOR UPDATE "#, request.room_id.as_i64(), - request.message_id + request.message_id, + DeletionSource::Account as DeletionSource, ) .fetch_optional(&mut *tx) .await? @@ -1261,7 +1263,7 @@ impl ChatRepository { ON m.room_id = e.room_id AND m.id = e.message_id AND m.created_at = e.message_created_at - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $6 WHERE e.room_id = $1 AND e.sequence > $2 AND e.event_type = ANY($3::text[]) @@ -1274,6 +1276,7 @@ impl ChatRepository { &event_types, i64::from(limit), &included_message_type_strings, + DeletionSource::Account as DeletionSource, ) .fetch_all(self.pool()) .await? @@ -1292,7 +1295,7 @@ impl ChatRepository { ON m.room_id = e.room_id AND m.id = e.message_id AND m.created_at = e.message_created_at - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $5 WHERE e.room_id = $1 AND e.event_type = ANY($2::text[]) AND (e.payload #>> '{message,message,messageType}') = ANY($4::text[]) @@ -1303,6 +1306,7 @@ impl ChatRepository { &event_types, i64::from(limit), &included_message_type_strings, + DeletionSource::Account as DeletionSource, ) .fetch_all(self.pool()) .await? @@ -1351,7 +1355,7 @@ impl ChatRepository { ON m.room_id = e.room_id AND m.id = e.message_id AND m.created_at = e.message_created_at - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $6 WHERE e.room_id = $1 AND e.sequence > $2 AND e.event_type = ANY($3::text[]) @@ -1364,6 +1368,7 @@ impl ChatRepository { &event_types, i64::from(limit), &included_message_type_strings, + DeletionSource::Account as DeletionSource, ) .fetch_all(self.pool()) .await?; @@ -1395,7 +1400,7 @@ impl ChatRepository { ON m.room_id = e.room_id AND m.id = e.message_id AND m.created_at = e.message_created_at - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $4 WHERE e.room_id = $1 AND e.event_type = ANY($2::text[]) AND (e.payload #>> '{message,message,messageType}') = ANY($3::text[]) @@ -1405,6 +1410,7 @@ impl ChatRepository { room_id.as_i64(), &event_types, &included_message_type_strings, + DeletionSource::Account as DeletionSource, ) .fetch_optional(self.pool()) .await?; @@ -1457,7 +1463,7 @@ impl ChatRepository { ON m.room_id = e.room_id AND m.id = e.message_id AND m.created_at = e.message_created_at - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $5 WHERE e.room_id = $1 AND e.event_type = ANY($2::text[]) AND e.message_id = $3 @@ -1468,7 +1474,8 @@ impl ChatRepository { room_id.as_i64(), &event_types, message_id, - message_created_at + message_created_at, + DeletionSource::Account as DeletionSource, ) .fetch_optional(self.pool()) .await?; @@ -1496,7 +1503,7 @@ impl ChatRepository { ON m.room_id = e.room_id AND m.id = e.message_id AND m.created_at = e.message_created_at - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $5 WHERE e.event_type = $1 AND e.room_id = $2 AND e.message_id = $3 @@ -1507,7 +1514,8 @@ impl ChatRepository { CHAT_MESSAGE_CREATED_EVENT_TYPE, room_id.as_i64(), message_id, - message_created_at + message_created_at, + DeletionSource::Account as DeletionSource, ) .fetch_optional(self.pool()) .await?; @@ -1618,7 +1626,7 @@ impl ChatRepository { SELECT COUNT(*) AS "count!" FROM chat_messages WHERE room_id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $6 AND status <> $2 AND (user_id IS NULL OR user_id <> $3) AND (created_at, id) > ($4, $5) @@ -1627,7 +1635,8 @@ impl ChatRepository { i16::from(ChatMessageStatus::Deleted), user_id.as_i64(), created_at, - message_id + message_id, + DeletionSource::Account as DeletionSource, ) .fetch_one(pool) .await? @@ -1930,14 +1939,15 @@ impl ChatRepository { AND e.sequence > $2 AND e.event_type = $3 AND m.status <> $4 - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $6 AND (m.user_id IS NULL OR m.user_id <> $5) "#, room_id.as_i64(), sequence, CHAT_MESSAGE_CREATED_EVENT_TYPE, i16::from(ChatMessageStatus::Deleted), - user_id.as_i64() + user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .fetch_one(pool) .await?; @@ -1952,14 +1962,15 @@ impl ChatRepository { SELECT COUNT(*) AS "count!" FROM chat_messages WHERE room_id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $4 AND status <> $2 AND (user_id IS NULL OR user_id <> $3) AND created_at >= NOW() - INTERVAL '90 days' "#, room_id.as_i64(), i16::from(ChatMessageStatus::Deleted), - user_id.as_i64() + user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .fetch_one(pool) .await?; @@ -2049,7 +2060,7 @@ impl ChatRepository { created_at AS "created_at!" FROM chat_messages WHERE room_id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $8 AND ($2 OR status <> $3) AND (created_at, id) < ($4, $5) AND message_type = ANY($7::smallint[]) @@ -2063,6 +2074,7 @@ impl ChatRepository { cursor.id, i64::from(limit), &included_message_type_codes, + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await? @@ -2088,7 +2100,7 @@ impl ChatRepository { created_at AS "created_at!" FROM chat_messages WHERE room_id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $6 AND ($2 OR status <> $3) AND created_at >= NOW() - INTERVAL '90 days' AND message_type = ANY($5::smallint[]) @@ -2100,6 +2112,7 @@ impl ChatRepository { i16::from(ChatMessageStatus::Deleted), i64::from(limit), &included_message_type_codes, + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await? @@ -2216,7 +2229,7 @@ impl ChatRepository { FROM chat_messages m CROSS JOIN search_terms st WHERE m.room_id = $1 - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $10 AND (m.content_search @@ st.tsquery OR m.content ILIKE $3 ESCAPE '\') AND ($4 OR m.status <> $5) AND ($6::bigint IS NULL OR m.user_id = $6) @@ -2232,7 +2245,8 @@ impl ChatRepository { user_id, cursor.created_at, cursor.id, - fetch_limit + fetch_limit, + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await? @@ -2262,7 +2276,7 @@ impl ChatRepository { FROM chat_messages m CROSS JOIN search_terms st WHERE m.room_id = $1 - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $8 AND (m.content_search @@ st.tsquery OR m.content ILIKE $3 ESCAPE '\') AND ($4 OR m.status <> $5) AND ($6::bigint IS NULL OR m.user_id = $6) @@ -2275,7 +2289,8 @@ impl ChatRepository { query.include_deleted, i16::from(ChatMessageStatus::Deleted), user_id, - fetch_limit + fetch_limit, + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await? @@ -2358,7 +2373,7 @@ impl ChatRepository { END AS playback_position FROM chat_messages WHERE room_id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $11 AND ($2 OR status <> $3) AND ($4::text IS NULL OR metadata #>> '{playback,mediaId}' = $4) AND ($5::text IS NULL OR metadata #>> '{playback,playlistId}' = $5) @@ -2396,6 +2411,7 @@ impl ChatRepository { start_seconds, end_seconds, i64::from(limit), + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await?; @@ -2464,7 +2480,7 @@ impl ChatRepository { created_at AS "created_at!" FROM chat_messages WHERE room_id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $7 AND ($2 OR status <> $3) AND (created_at, id) < ($4, $5) ORDER BY created_at DESC, id DESC @@ -2475,7 +2491,8 @@ impl ChatRepository { i16::from(ChatMessageStatus::Deleted), anchor.created_at, anchor.id, - i64::from(before_limit) + i64::from(before_limit), + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await?; @@ -2502,7 +2519,7 @@ impl ChatRepository { created_at AS "created_at!" FROM chat_messages WHERE room_id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $7 AND ($2 OR status <> $3) AND (created_at, id) > ($4, $5) ORDER BY created_at ASC, id ASC @@ -2513,7 +2530,8 @@ impl ChatRepository { i16::from(ChatMessageStatus::Deleted), anchor.created_at, anchor.id, - i64::from(after_limit) + i64::from(after_limit), + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await?; @@ -2560,9 +2578,10 @@ impl ChatRepository { created_at AS "created_at!" FROM chat_messages WHERE id = $1 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $2 "#, - message_id + message_id, + DeletionSource::Account as DeletionSource, ) .fetch_optional(pool) .await?; @@ -2615,10 +2634,11 @@ impl ChatRepository { created_at AS "created_at!" FROM chat_messages WHERE room_id = $1 AND id = $2 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $3 "#, room_id.as_i64(), - message_id + message_id, + DeletionSource::Account as DeletionSource, ) .fetch_optional(pool) .await?; @@ -2914,9 +2934,9 @@ impl ChatRepository { SET content = '', status = ", ); builder.push_bind(i16::from(ChatMessageStatus::Deleted)); - builder.push( - ", version = version + 1, deleted_at = NOW(), deletion_source = 'user', deleted_by = ", - ); + builder.push(", version = version + 1, deleted_at = NOW(), deletion_source = "); + builder.push_bind(DeletionSource::User); + builder.push(", deleted_by = "); builder.push_bind(deleted_by.as_i64()); builder.push(", delete_reason = "); builder.push_bind(reason); @@ -2990,9 +3010,9 @@ impl ChatRepository { SET content = '', status = ", ); builder.push_bind(i16::from(ChatMessageStatus::Deleted)); - builder.push( - ", version = version + 1, deleted_at = NOW(), deletion_source = 'user', deleted_by = ", - ); + builder.push(", version = version + 1, deleted_at = NOW(), deletion_source = "); + builder.push_bind(DeletionSource::User); + builder.push(", deleted_by = "); builder.push_bind(request.deleted_by.as_i64()); builder.push(", delete_reason = "); builder.push_bind(request.reason); @@ -3773,11 +3793,12 @@ impl ChatRepository { WHERE room_id = $1 AND id = $2 AND created_at = $3 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $4 "#, room_id.as_i64(), message_id, - created_at + created_at, + DeletionSource::Account as DeletionSource, ) .fetch_optional(&mut **tx) .await?; @@ -3971,14 +3992,15 @@ impl ChatRepository { ON m.room_id = e.room_id AND m.id = e.message_id AND m.created_at = e.message_created_at - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $4 WHERE e.room_id = $1 AND e.event_id = $2 AND e.event_type = ANY($3::text[]) "#, room_id.as_i64(), event_id, - &event_types + &event_types, + DeletionSource::Account as DeletionSource, ) .fetch_optional(&mut **tx) .await?; @@ -4244,12 +4266,13 @@ impl ChatRepository { ON m.id = wanted.id AND m.created_at = wanted.created_at WHERE m.room_id = $1 AND m.status <> $4 - AND m.deletion_source IS DISTINCT FROM 'account' + AND m.deletion_source IS DISTINCT FROM $5 "#, room_id.as_i64(), &ids, &created_ats, - i16::from(ChatMessageStatus::Deleted) + i16::from(ChatMessageStatus::Deleted), + DeletionSource::Account as DeletionSource, ) .fetch_all(pool) .await?; @@ -4339,11 +4362,12 @@ impl ChatRepository { FROM chat_messages WHERE room_id = $1 AND id = $2 - AND deletion_source IS DISTINCT FROM 'account' + AND deletion_source IS DISTINCT FROM $3 FOR UPDATE "#, room_id.as_i64(), - message_id + message_id, + DeletionSource::Account as DeletionSource, ) .fetch_optional(&mut **tx) .await?; diff --git a/synctv-core/src/repository/media.rs b/synctv-core/src/repository/media.rs index 753bf2f3..078fda5f 100644 --- a/synctv-core/src/repository/media.rs +++ b/synctv-core/src/repository/media.rs @@ -8,8 +8,8 @@ use std::collections::{BTreeSet, HashMap}; use crate::{ models::{ - normalize_provider_instance_name, Media, MediaId, MediaListQuery, PageParams, PlaylistId, - RoomId, UserId, + normalize_provider_instance_name, DeletionSource, Media, MediaId, MediaListQuery, + PageParams, PlaylistId, RoomId, UserId, }, Result, }; @@ -1471,11 +1471,12 @@ impl MediaRepository { r#" UPDATE media SET deleted_at = CURRENT_TIMESTAMP, - deletion_source = 'user', + deletion_source = $2, version = version + 1 WHERE id = $1 AND deleted_at IS NULL "#, media_id.as_i64(), + DeletionSource::User as DeletionSource, ) .execute(&self.pool) .await?; @@ -1489,11 +1490,12 @@ impl MediaRepository { r#" UPDATE media SET deleted_at = CURRENT_TIMESTAMP, - deletion_source = 'user', + deletion_source = $2, version = version + 1 WHERE playlist_id = $1 AND deleted_at IS NULL "#, playlist_id.as_i64(), + DeletionSource::User as DeletionSource, ) .execute(&self.pool) .await?; @@ -1507,12 +1509,13 @@ impl MediaRepository { r#" UPDATE media SET deleted_at = CURRENT_TIMESTAMP, - deletion_source = 'user', + deletion_source = $2, version = version + 1 WHERE room_id = $1 AND deleted_at IS NULL AND playlist_id IS NULL "#, room_id.as_i64(), + DeletionSource::User as DeletionSource, ) .execute(&self.pool) .await?; @@ -1544,11 +1547,12 @@ impl MediaRepository { r#" UPDATE media SET deleted_at = CURRENT_TIMESTAMP, - deletion_source = 'user', + deletion_source = $2, version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL "#, &id_strs, + DeletionSource::User as DeletionSource, ) .execute(executor) .await?; diff --git a/synctv-core/src/repository/room_resource_event.rs b/synctv-core/src/repository/room_resource_event.rs index d7e8ec80..bbde668e 100644 --- a/synctv-core/src/repository/room_resource_event.rs +++ b/synctv-core/src/repository/room_resource_event.rs @@ -3,7 +3,7 @@ use serde::{Deserialize, Serialize}; use sqlx::PgPool; use crate::{ - models::{ChatPinEvent, EventCursor, RealtimeEvent, RoomId}, + models::{ChatPinEvent, DeletionSource, EventCursor, RealtimeEvent, RoomId}, Error, Result, }; @@ -329,7 +329,7 @@ impl RoomResourceEventRepository { FROM chat_messages m WHERE m.room_id = e.room_id AND e.aggregate_id = m.id::TEXT - AND m.deletion_source = 'account' + AND m.deletion_source = $3 )) OR (e.resource_type = 'media' AND EXISTS ( @@ -337,7 +337,7 @@ impl RoomResourceEventRepository { FROM media m WHERE m.room_id = e.room_id AND e.resource_id = m.id::TEXT - AND m.deletion_source = 'account' + AND m.deletion_source = $3 )) OR (e.resource_type = 'playlist' AND EXISTS ( @@ -345,14 +345,15 @@ impl RoomResourceEventRepository { FROM playlists p WHERE p.room_id = e.room_id AND e.resource_id = p.id::TEXT - AND p.deletion_source = 'account' + AND p.deletion_source = $3 )) ) ORDER BY sequence DESC LIMIT 1 ", room_id.as_i64(), - &resource_types + &resource_types, + DeletionSource::Account as DeletionSource, ) .fetch_optional(&self.pool) .await?; @@ -404,7 +405,7 @@ impl RoomResourceEventRepository { FROM chat_messages m WHERE m.room_id = e.room_id AND e.aggregate_id = m.id::TEXT - AND m.deletion_source = 'account' + AND m.deletion_source = $5 )) OR (e.resource_type = 'media' AND EXISTS ( @@ -412,7 +413,7 @@ impl RoomResourceEventRepository { FROM media m WHERE m.room_id = e.room_id AND e.resource_id = m.id::TEXT - AND m.deletion_source = 'account' + AND m.deletion_source = $5 )) OR (e.resource_type = 'playlist' AND EXISTS ( @@ -420,7 +421,7 @@ impl RoomResourceEventRepository { FROM playlists p WHERE p.room_id = e.room_id AND e.resource_id = p.id::TEXT - AND p.deletion_source = 'account' + AND p.deletion_source = $5 )) ) ORDER BY sequence ASC @@ -429,7 +430,8 @@ impl RoomResourceEventRepository { room_id.as_i64(), after_sequence, &resource_types, - limit + limit, + DeletionSource::Account as DeletionSource, ) .fetch_all(&self.pool) .await?; diff --git a/synctv-core/src/repository/sqlx_types.rs b/synctv-core/src/repository/sqlx_types.rs index a610bf88..4efe7871 100644 --- a/synctv-core/src/repository/sqlx_types.rs +++ b/synctv-core/src/repository/sqlx_types.rs @@ -4,15 +4,15 @@ use crate::models::permission::Role; use crate::models::{ AuditDetails, BanRecordId, ChatAttachmentKind, ChatEventKind, ChatMessage, ChatMessageStatus, ChatMessageType, ChatMetadata, ContentReport, ContentReportAdminRow, ContentReportId, - ContentReportMetadata, ContentReportStatus, ContentReportTargetType, EmailRegistrationTokenId, - FileBlobCompression, FileCleanupMetadata, FileMetadata, FileObjectAccess, - FileReferenceMetadata, FileUploadSessionKind, FileUploadSessionMetadata, FileVariantMetadata, - MediaId, MediaSourceConfig, Notification, NotificationData, NotificationType, OAuth2Provider, - PlaybackDurationSource, PlaybackDurationStatus, PlaybackKind, PlaybackSourceMetadata, Playlist, - PlaylistId, PlaylistSourceConfig, ProviderPlaybackSession, ProviderPlaybackSessionState, - ProviderPlaybackStopReason, ProviderTarget, ReviewRequestId, ReviewStatus, RoomCategoryId, - RoomId, RoomLabelId, RoomPlaybackProgress, RoomPlaybackState, RoomSettings, RuntimeSetting, - SignupMethod, SourceProvider, UserId, UserRole, UserStatus, + ContentReportMetadata, ContentReportStatus, ContentReportTargetType, DeletionSource, + EmailRegistrationTokenId, FileBlobCompression, FileCleanupMetadata, FileMetadata, + FileObjectAccess, FileReferenceMetadata, FileUploadSessionKind, FileUploadSessionMetadata, + FileVariantMetadata, MediaId, MediaSourceConfig, Notification, NotificationData, + NotificationType, OAuth2Provider, PlaybackDurationSource, PlaybackDurationStatus, PlaybackKind, + PlaybackSourceMetadata, Playlist, PlaylistId, PlaylistSourceConfig, ProviderPlaybackSession, + ProviderPlaybackSessionState, ProviderPlaybackStopReason, ProviderTarget, ReviewRequestId, + ReviewStatus, RoomCategoryId, RoomId, RoomLabelId, RoomPlaybackProgress, RoomPlaybackState, + RoomSettings, RuntimeSetting, SignupMethod, SourceProvider, UserId, UserRole, UserStatus, }; macro_rules! sqlx_numeric_id { @@ -99,6 +99,7 @@ sqlx_i16_enum!(Role); sqlx_i16_enum!(NotificationType); sqlx_i16_enum!(ReviewStatus); sqlx_i16_enum!(SourceProvider); +sqlx_i16_enum!(DeletionSource); sqlx_i16_enum!(PlaybackKind); diff --git a/synctv-core/src/repository/user.rs b/synctv-core/src/repository/user.rs index 01def0fb..1f531fbb 100644 --- a/synctv-core/src/repository/user.rs +++ b/synctv-core/src/repository/user.rs @@ -5,8 +5,8 @@ use super::query_builder::ilike_contains_pattern; use crate::repository::pools::RepoPools; use crate::{ models::{ - SignupMethod, User, UserId, UserLifecycleMetadata, UserListQuery, UserListSortBy, UserRole, - UserStatus, + DeletionSource, SignupMethod, User, UserId, UserLifecycleMetadata, UserListQuery, + UserListSortBy, UserRole, UserStatus, }, Error, Result, }; @@ -236,7 +236,7 @@ impl UserRepository { UserLifecycleMetadata, r#" SELECT id AS "user_id!: UserId", - deletion_source, + deletion_source AS "deletion_source?: DeletionSource", deletion_reason, deleted_by AS "deleted_by?: UserId", restored_at, @@ -263,7 +263,7 @@ impl UserRepository { UserLifecycleMetadata, r#" SELECT id AS "user_id!: UserId", - deletion_source, + deletion_source AS "deletion_source?: DeletionSource", deletion_reason, deleted_by AS "deleted_by?: UserId", restored_at, @@ -895,14 +895,16 @@ impl UserRepository { role_scope: UserListRoleScope, search_pattern: Option<&'a str>, ) { - builder.push( - " FROM user_account_profiles u \ + builder + .push( + " FROM user_account_profiles u \ LEFT JOIN auth_email_identities aei ON aei.user_id = u.id \ AND ((u.deleted_at IS NULL AND aei.deleted_at IS NULL) \ OR (u.deleted_at IS NOT NULL AND aei.deleted_at IS NOT NULL \ - AND aei.deletion_source = 'account')) \ - WHERE ", - ); + AND aei.deletion_source = ", + ) + .push_bind(DeletionSource::Account) + .push(")) WHERE "); if query.include_deleted { builder.push("TRUE"); diff --git a/synctv-core/src/repository/user_email.rs b/synctv-core/src/repository/user_email.rs index e97cb03a..06c69929 100644 --- a/synctv-core/src/repository/user_email.rs +++ b/synctv-core/src/repository/user_email.rs @@ -2,7 +2,7 @@ use chrono::{DateTime, Utc}; use sqlx::PgPool; use crate::{ - models::{SignupMethod, User, UserId, UserRole, UserStatus}, + models::{DeletionSource, SignupMethod, User, UserId, UserRole, UserStatus}, Error, Result, }; @@ -209,7 +209,7 @@ impl UserEmailRepository { deleted_email AS ( UPDATE auth_email_identities identity SET deleted_at = $2, - deletion_source = 'user', + deletion_source = $3, updated_at = $2 FROM updated_user WHERE identity.user_id = updated_user.id @@ -247,7 +247,8 @@ impl UserEmailRepository { ) active_ban ON TRUE "#, user_id.as_i64(), - now + now, + DeletionSource::User as DeletionSource, ) .fetch_optional(executor) .await? @@ -272,11 +273,12 @@ impl UserEmailRepository { OR ( u.deleted_at IS NOT NULL AND aei.deleted_at IS NOT NULL - AND aei.deletion_source = 'account' + AND aei.deletion_source = $2 ) ) ", - user_id.as_i64() + user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .fetch_optional(&self.pool) .await diff --git a/synctv-core/src/repository/user_oauth_provider.rs b/synctv-core/src/repository/user_oauth_provider.rs index e4810521..d96b5d47 100644 --- a/synctv-core/src/repository/user_oauth_provider.rs +++ b/synctv-core/src/repository/user_oauth_provider.rs @@ -7,7 +7,7 @@ use std::collections::HashSet; use crate::{ models::{ oauth2_client::{OAuth2Provider, OAuth2UserInfo, UserOAuthProviderMapping}, - UserId, + DeletionSource, UserId, }, Result, }; @@ -219,10 +219,11 @@ impl UserOAuthProviderRepository { provider_user_id: &str, ) -> Result { let result = sqlx::query!( - "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_instance_name = $2 AND provider_user_id = $3 AND deleted_at IS NULL", + "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $4, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_instance_name = $2 AND provider_user_id = $3 AND deleted_at IS NULL", user_id as &UserId, provider_instance_name, provider_user_id, + DeletionSource::User as DeletionSource, ) .execute(&self.pool) .await?; @@ -251,8 +252,9 @@ impl UserOAuthProviderRepository { E: sqlx::PgExecutor<'e>, { let result = sqlx::query!( - "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", + "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", user_id as &UserId, + DeletionSource::User as DeletionSource, ) .execute(executor) .await?; @@ -267,9 +269,10 @@ impl UserOAuthProviderRepository { provider_type: &OAuth2Provider, ) -> Result { let result = sqlx::query!( - "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_type = $2 AND deleted_at IS NULL", + "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $3, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND provider_type = $2 AND deleted_at IS NULL", user_id as &UserId, provider_type.as_i16(), + DeletionSource::User as DeletionSource, ) .execute(&self.pool) .await?; diff --git a/synctv-core/src/service/cleanup.rs b/synctv-core/src/service/cleanup.rs index 5af0aade..2e7f0f69 100644 --- a/synctv-core/src/service/cleanup.rs +++ b/synctv-core/src/service/cleanup.rs @@ -26,6 +26,7 @@ use tokio_util::sync::CancellationToken; use tracing::{info, warn}; use super::{cleanup_ops, FileStorageService, LeaderCheck, RuntimeSettingsStore}; +use crate::models::DeletionSource; use crate::service::partitioning::u32_to_i32; use crate::{InternalExt, Result}; @@ -1106,7 +1107,7 @@ impl CleanupService { // ordering and cannot split the aggregate during a race. let candidate = sqlx::query!( r#" - SELECT deletion_source, + SELECT deletion_source AS "deletion_source?: DeletionSource", deleted_owner_id AS "deleted_owner_id?: crate::models::UserId" FROM rooms WHERE id = $1 @@ -1123,7 +1124,7 @@ impl CleanupService { continue; }; - if candidate.deletion_source.as_deref() == Some("account") { + if candidate.deletion_source == Some(DeletionSource::Account) { let Some(owner_id) = candidate.deleted_owner_id else { // Legacy rows without an owner cannot participate in // account recovery and are safe to process as rooms. @@ -1188,12 +1189,13 @@ impl CleanupService { FROM rooms WHERE id = $1 AND deleted_at IS NOT NULL - AND deletion_source = 'account' + AND deletion_source = $3 AND deleted_owner_id = $2 FOR UPDATE "#, room_id.as_i64(), owner_id as crate::models::UserId, + DeletionSource::Account as DeletionSource, ) .fetch_optional(&mut *tx) .await diff --git a/synctv-core/src/service/cleanup_ops.rs b/synctv-core/src/service/cleanup_ops.rs index 4f283d84..badbc8d6 100644 --- a/synctv-core/src/service/cleanup_ops.rs +++ b/synctv-core/src/service/cleanup_ops.rs @@ -14,7 +14,7 @@ use tracing::warn; use super::partitioning::{len_to_u64, retention_seconds_to_i64, u32_to_i32}; use super::{FileStorageCleanupOrigin, FileStorageService}; -use crate::models::{ChatAttachment, FileReferenceTarget, RoomId}; +use crate::models::{ChatAttachment, DeletionSource, FileReferenceTarget, RoomId}; use crate::repository::{realtime_outbox::RealtimeOutboxStatus, FileStorageRepository}; use crate::{Error, InternalExt, Result}; @@ -312,7 +312,7 @@ async fn cleanup_soft_deleted_chat_messages_batch( r#" SELECT id, created_at FROM chat_messages - WHERE deletion_source = 'user' + WHERE deletion_source = $3 AND deleted_at <= NOW() - make_interval(days => $1) ORDER BY deleted_at ASC, created_at ASC, id ASC LIMIT $2 @@ -320,6 +320,7 @@ async fn cleanup_soft_deleted_chat_messages_batch( "#, retention_days, CHAT_MESSAGE_CLEANUP_BATCH_SIZE, + DeletionSource::User as DeletionSource, ) .fetch_all(&mut *executor) .await @@ -553,7 +554,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( r#" SELECT id FROM media - WHERE deletion_source = 'user' + WHERE deletion_source = $3 AND deleted_at <= NOW() - make_interval(days => $1) ORDER BY deleted_at ASC, id ASC LIMIT $2 @@ -561,6 +562,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( "#, retention_days, RESOURCE_LIFECYCLE_CLEANUP_BATCH_SIZE, + DeletionSource::User as DeletionSource, ) .fetch_all(&mut *tx) .await @@ -615,8 +617,9 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( .await .internal_with_err("Failed to delete playback progress for expired media")?; let deleted = sqlx::query!( - "DELETE FROM media WHERE id = ANY($1) AND deletion_source = 'user'", + "DELETE FROM media WHERE id = ANY($1) AND deletion_source = $2", &media_ids, + DeletionSource::User as DeletionSource, ) .execute(&mut *tx) .await @@ -635,7 +638,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( r#" SELECT p.id FROM playlists p - WHERE p.deletion_source = 'user' + WHERE p.deletion_source = $3 AND p.deleted_at <= NOW() - make_interval(days => $1) AND NOT EXISTS (SELECT 1 FROM media m WHERE m.playlist_id = p.id) AND NOT EXISTS (SELECT 1 FROM playlists child WHERE child.parent_id = p.id) @@ -645,6 +648,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( "#, retention_days, RESOURCE_LIFECYCLE_CLEANUP_BATCH_SIZE, + DeletionSource::User as DeletionSource, ) .fetch_all(&mut *tx) .await @@ -699,8 +703,9 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( .await .internal_with_err("Failed to delete playback progress for expired playlists")?; let deleted = sqlx::query!( - "DELETE FROM playlists WHERE id = ANY($1) AND deletion_source = 'user'", + "DELETE FROM playlists WHERE id = ANY($1) AND deletion_source = $2", &playlist_ids, + DeletionSource::User as DeletionSource, ) .execute(&mut *tx) .await @@ -717,7 +722,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( r#" SELECT id FROM auth_email_identities - WHERE deletion_source = 'user' + WHERE deletion_source = $3 AND deleted_at <= NOW() - make_interval(days => $1) ORDER BY deleted_at ASC, id ASC LIMIT $2 @@ -725,6 +730,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( "#, retention_days, RESOURCE_LIFECYCLE_CLEANUP_BATCH_SIZE, + DeletionSource::User as DeletionSource, ) .fetch_all(&mut *tx) .await @@ -733,7 +739,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( r#" SELECT id FROM auth_oauth2_identities - WHERE deletion_source = 'user' + WHERE deletion_source = $3 AND deleted_at <= NOW() - make_interval(days => $1) ORDER BY deleted_at ASC, id ASC LIMIT $2 @@ -741,6 +747,7 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( "#, retention_days, RESOURCE_LIFECYCLE_CLEANUP_BATCH_SIZE, + DeletionSource::User as DeletionSource, ) .fetch_all(&mut *tx) .await @@ -755,8 +762,9 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( if !email_identity_ids.is_empty() { let deleted = sqlx::query!( - "DELETE FROM auth_email_identities WHERE id = ANY($1) AND deletion_source = 'user'", + "DELETE FROM auth_email_identities WHERE id = ANY($1) AND deletion_source = $2", &email_identity_ids, + DeletionSource::User as DeletionSource, ) .execute(&mut *tx) .await @@ -765,8 +773,9 @@ pub(super) async fn cleanup_soft_deleted_media_and_playlists( } if !oauth2_identity_ids.is_empty() { let deleted = sqlx::query!( - "DELETE FROM auth_oauth2_identities WHERE id = ANY($1) AND deletion_source = 'user'", + "DELETE FROM auth_oauth2_identities WHERE id = ANY($1) AND deletion_source = $2", &oauth2_identity_ids, + DeletionSource::User as DeletionSource, ) .execute(&mut *tx) .await diff --git a/synctv-core/src/service/room/admin_deletion.rs b/synctv-core/src/service/room/admin_deletion.rs index 5e0455d7..f237eb0c 100644 --- a/synctv-core/src/service/room/admin_deletion.rs +++ b/synctv-core/src/service/room/admin_deletion.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use crate::{ - models::{AuditAction, AuditDetails, AuditTargetType, RoomId, UserId}, + models::{AuditAction, AuditDetails, AuditTargetType, DeletionSource, RoomId, UserId}, Error, Result, }; @@ -38,13 +38,15 @@ impl RoomService { let mut tx = self.pool.begin().await?; let guard = PermissionFenceGuard::reserve(Arc::new(self.clone()), room_id, &mut tx).await?; - let impact = match soft_delete_room_and_cleanup_in_tx(&mut tx, room_id, "admin").await { - Ok(impact) => impact, - Err(error) => { - guard.abort().await; - return Err(error); - } - }; + let impact = + match soft_delete_room_and_cleanup_in_tx(&mut tx, room_id, DeletionSource::Admin).await + { + Ok(impact) => impact, + Err(error) => { + guard.abort().await; + return Err(error); + } + }; if let Err(error) = self .insert_realtime_outbox_tx(&mut tx, outbox_event.as_ref()) .await @@ -156,13 +158,15 @@ impl RoomService { let mut tx = self.pool.begin().await?; let guard = PermissionFenceGuard::reserve(Arc::new(self.clone()), room_id, &mut tx).await?; - let impact = match soft_delete_room_and_cleanup_in_tx(&mut tx, room_id, "admin").await { - Ok(impact) => impact, - Err(error) => { - guard.abort().await; - return Err(error); - } - }; + let impact = + match soft_delete_room_and_cleanup_in_tx(&mut tx, room_id, DeletionSource::Admin).await + { + Ok(impact) => impact, + Err(error) => { + guard.abort().await; + return Err(error); + } + }; if let Err(error) = tx.commit().await { guard.abort().await; return Err(error.into()); diff --git a/synctv-core/src/service/room/deletion.rs b/synctv-core/src/service/room/deletion.rs index a1902812..f92b6ea6 100644 --- a/synctv-core/src/service/room/deletion.rs +++ b/synctv-core/src/service/room/deletion.rs @@ -1,7 +1,7 @@ use std::collections::BTreeMap; use crate::{ - models::{MediaId, PlaylistId, RoomId, RoomPlaybackState}, + models::{DeletionSource, MediaId, PlaylistId, RoomId, RoomPlaybackState}, Error, Result, }; @@ -274,8 +274,9 @@ pub(super) async fn delete_playlist_ids_in_depth_order_in_tx( for (_depth, ids) in ids_by_depth.into_iter().rev() { sqlx::query!( - "UPDATE playlists SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "UPDATE playlists SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", &ids, + DeletionSource::User as DeletionSource, ) .execute(&mut **tx) .await?; @@ -377,8 +378,9 @@ pub(super) async fn apply_delete_entries_impact_in_tx( .execute(&mut **tx) .await?; sqlx::query!( - "UPDATE media SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user', version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "UPDATE media SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", &media_id_strs, + DeletionSource::User as DeletionSource, ) .execute(&mut **tx) .await?; diff --git a/synctv-core/src/service/room/lifecycle.rs b/synctv-core/src/service/room/lifecycle.rs index b46d348a..1d2292d0 100644 --- a/synctv-core/src/service/room/lifecycle.rs +++ b/synctv-core/src/service/room/lifecycle.rs @@ -1,7 +1,9 @@ use std::sync::Arc; use crate::{ - models::{AuditAction, AuditDetails, AuditTargetType, RoomId, RoomPermission, UserId}, + models::{ + AuditAction, AuditDetails, AuditTargetType, DeletionSource, RoomId, RoomPermission, UserId, + }, Error, Result, }; @@ -72,13 +74,15 @@ impl RoomService { let guard = PermissionFenceGuard::reserve(Arc::new(self.clone()), &room_id, &mut tx).await?; - let impact = match soft_delete_room_and_cleanup_in_tx(&mut tx, &room_id, "user").await { - Ok(impact) => impact, - Err(error) => { - guard.abort().await; - return Err(error); - } - }; + let impact = + match soft_delete_room_and_cleanup_in_tx(&mut tx, &room_id, DeletionSource::User).await + { + Ok(impact) => impact, + Err(error) => { + guard.abort().await; + return Err(error); + } + }; if let Err(error) = self .insert_realtime_outbox_tx(&mut tx, outbox_event.as_ref()) .await diff --git a/synctv-core/src/service/room/room_deletion.rs b/synctv-core/src/service/room/room_deletion.rs index a9a9fefe..7c2c6068 100644 --- a/synctv-core/src/service/room/room_deletion.rs +++ b/synctv-core/src/service/room/room_deletion.rs @@ -1,5 +1,5 @@ use crate::{ - models::{MediaId, PlaylistId, RoomId, UserId}, + models::{DeletionSource, MediaId, PlaylistId, RoomId, UserId}, repository::room_member::RemovedRoomMember, Error, Result, }; @@ -24,7 +24,7 @@ pub(crate) struct RoomCleanupImpact { pub(crate) async fn soft_delete_room_and_cleanup_in_tx( tx: &mut sqlx::Transaction<'_, sqlx::Postgres>, room_id: &RoomId, - deletion_source: &str, + deletion_source: DeletionSource, ) -> Result { let now = crate::SystemClock.now(); let deleted = sqlx::query!( @@ -33,7 +33,7 @@ pub(crate) async fn soft_delete_room_and_cleanup_in_tx( WHERE id = $1 AND deleted_at IS NULL"#, room_id.as_i64(), now, - deletion_source, + deletion_source as DeletionSource, ) .execute(&mut **tx) .await?; @@ -65,9 +65,10 @@ pub(crate) async fn soft_delete_room_and_cleanup_in_tx( if !deleted_media_ids.is_empty() { let media_id_strs: Vec = deleted_media_ids.iter().map(MediaId::as_i64).collect(); sqlx::query!( - "UPDATE media SET deleted_at = $2, deletion_source = COALESCE(deletion_source, 'room'), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "UPDATE media SET deleted_at = $2, deletion_source = COALESCE(deletion_source, $3), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", &media_id_strs, now, + DeletionSource::Room as DeletionSource, ) .execute(&mut **tx) .await?; @@ -79,9 +80,10 @@ pub(crate) async fn soft_delete_room_and_cleanup_in_tx( .map(PlaylistId::as_i64) .collect(); sqlx::query!( - "UPDATE playlists SET deleted_at = $2, deletion_source = COALESCE(deletion_source, 'room'), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "UPDATE playlists SET deleted_at = $2, deletion_source = COALESCE(deletion_source, $3), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", &playlist_id_strs, now, + DeletionSource::Room as DeletionSource, ) .execute(&mut **tx) .await?; @@ -127,9 +129,10 @@ pub(crate) async fn soft_delete_room_and_cleanup_in_tx( let settings_deleted = 0; let chat_deleted = sqlx::query!( - "UPDATE chat_messages SET deleted_at = $2, deletion_source = COALESCE(deletion_source, 'room') WHERE room_id = $1 AND deleted_at IS NULL", + "UPDATE chat_messages SET deleted_at = $2, deletion_source = COALESCE(deletion_source, $3) WHERE room_id = $1 AND deleted_at IS NULL", room_id.as_i64(), now, + DeletionSource::Room as DeletionSource, ) .execute(&mut **tx) .await? diff --git a/synctv-core/src/service/user/deletion.rs b/synctv-core/src/service/user/deletion.rs index 23886528..733bdbe3 100644 --- a/synctv-core/src/service/user/deletion.rs +++ b/synctv-core/src/service/user/deletion.rs @@ -3,7 +3,7 @@ use std::collections::{HashMap, HashSet}; use chrono::{DateTime, Utc}; use crate::{ - models::{ChatMessageType, MediaId, RoomId, RoomPlaybackState, User, UserId}, + models::{ChatMessageType, DeletionSource, MediaId, RoomId, RoomPlaybackState, User, UserId}, repository::realtime_outbox::NewRealtimeOutboxEvent, Error, Result, }; @@ -21,11 +21,11 @@ pub enum UserDeletionSource { } impl UserDeletionSource { - const fn as_str(self) -> &'static str { + const fn as_deletion_source(self) -> DeletionSource { match self { - Self::Account => "account", - Self::Admin => "admin", - Self::System => "system", + Self::Account => DeletionSource::Account, + Self::Admin => DeletionSource::Admin, + Self::System => DeletionSource::System, } } } @@ -202,12 +202,12 @@ impl UserService { // Keep a single lifecycle marker for downstream cleanup and recovery. // The user row itself remains the source of truth for visibility. - let deletion_source = options.source.as_str(); + let deletion_source = options.source.as_deletion_source(); let deletion_reason = options.reason.as_deref().unwrap_or("account closure"); sqlx::query!( "UPDATE users SET deletion_source = $2, deletion_reason = $3, deleted_by = $4 WHERE id = $1", user_id.as_i64(), - deletion_source, + deletion_source as DeletionSource, deletion_reason, options.deleted_by.map(|id| id.as_i64()), ) diff --git a/synctv-core/src/service/user/deletion/entries.rs b/synctv-core/src/service/user/deletion/entries.rs index 1ba0e156..203b751b 100644 --- a/synctv-core/src/service/user/deletion/entries.rs +++ b/synctv-core/src/service/user/deletion/entries.rs @@ -1,7 +1,7 @@ use sqlx::{Postgres, Transaction}; use crate::{ - models::{MediaId, PlaylistId, RoomId, RoomPlaybackState, UserId}, + models::{DeletionSource, MediaId, PlaylistId, RoomId, RoomPlaybackState, UserId}, Error, Result, }; @@ -222,9 +222,10 @@ impl UserService { return Err(error.into()); } if let Err(error) = sqlx::query!( - "UPDATE media SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, 'account'), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", + "UPDATE media SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, $3), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id = ANY($1) AND deleted_at IS NULL", &media_id_strs, deleted_owner_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut **tx) .await @@ -250,9 +251,10 @@ impl UserService { return Err(error.into()); } if let Err(error) = sqlx::query!( - "WITH RECURSIVE target AS (SELECT id FROM playlists WHERE id = ANY($1) AND deleted_at IS NULL UNION ALL SELECT p.id FROM playlists p JOIN target t ON p.parent_id = t.id WHERE p.deleted_at IS NULL) UPDATE playlists SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, 'account'), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id IN (SELECT id FROM target) AND deleted_at IS NULL", + "WITH RECURSIVE target AS (SELECT id FROM playlists WHERE id = ANY($1) AND deleted_at IS NULL UNION ALL SELECT p.id FROM playlists p JOIN target t ON p.parent_id = t.id WHERE p.deleted_at IS NULL) UPDATE playlists SET deleted_at = COALESCE(deleted_at, CURRENT_TIMESTAMP), deletion_source = COALESCE(deletion_source, $3), deleted_owner_id = COALESCE(deleted_owner_id, $2), version = version + 1 WHERE id IN (SELECT id FROM target) AND deleted_at IS NULL", &playlist_id_strs, deleted_owner_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut **tx) .await diff --git a/synctv-core/src/service/user/deletion/resources.rs b/synctv-core/src/service/user/deletion/resources.rs index 3c6c2e49..aa283f1c 100644 --- a/synctv-core/src/service/user/deletion/resources.rs +++ b/synctv-core/src/service/user/deletion/resources.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Utc}; use sqlx::{Postgres, Transaction}; use crate::{ - models::{ChatMessageType, MediaId, PlaylistId, RoomId, UserId}, + models::{ChatMessageType, DeletionSource, MediaId, PlaylistId, RoomId, UserId}, repository::{realtime_outbox::NewRealtimeOutboxEvent, RoomMemberRepository}, Result, }; @@ -214,12 +214,17 @@ impl UserService { for room_id in &owned_room_ids { let impact = - crate::service::soft_delete_room_and_cleanup_in_tx(tx, room_id, "account") - .await?; + crate::service::soft_delete_room_and_cleanup_in_tx( + tx, + room_id, + DeletionSource::Account, + ) + .await?; sqlx::query!( - "UPDATE rooms SET deletion_source = 'account', deleted_owner_id = $2 WHERE id = $1", + "UPDATE rooms SET deletion_source = $3, deleted_owner_id = $2 WHERE id = $1", room_id.as_i64(), user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut **tx) .await?; @@ -230,9 +235,10 @@ impl UserService { .collect(); if !playlist_id_strs.is_empty() { sqlx::query!( - "UPDATE playlists SET deletion_source = 'account', deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", + "UPDATE playlists SET deletion_source = $3, deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", &playlist_id_strs, user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut **tx) .await?; @@ -244,9 +250,10 @@ impl UserService { .collect(); if !media_id_strs.is_empty() { sqlx::query!( - "UPDATE media SET deletion_source = 'account', deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", + "UPDATE media SET deletion_source = $3, deleted_owner_id = $2 WHERE id = ANY($1) AND deleted_at IS NOT NULL", &media_id_strs, user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut **tx) .await?; @@ -258,10 +265,12 @@ impl UserService { )); }; sqlx::query!( - "UPDATE chat_messages SET deletion_source = 'account', deleted_owner_id = $2 WHERE room_id = $1 AND deleted_at = $3 AND deletion_source = 'room' AND deleted_owner_id IS NULL", + "UPDATE chat_messages SET deletion_source = $4, deleted_owner_id = $2 WHERE room_id = $1 AND deleted_at = $3 AND deletion_source = $5 AND deleted_owner_id IS NULL", room_id.as_i64(), user_id.as_i64(), deletion_timestamp, + DeletionSource::Account as DeletionSource, + DeletionSource::Room as DeletionSource, ) .execute(&mut **tx) .await?; @@ -277,8 +286,9 @@ impl UserService { } let oauth_mappings_deleted = sqlx::query!( - "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'account' WHERE user_id = $1 AND deleted_at IS NULL", + "UPDATE auth_oauth2_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2 WHERE user_id = $1 AND deleted_at IS NULL", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut **tx) .await? @@ -298,8 +308,9 @@ impl UserService { .await?; let email_identities_deleted = sqlx::query!( - "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'account', updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", + "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND deleted_at IS NULL", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut **tx) .await? @@ -358,7 +369,7 @@ impl UserService { r" UPDATE chat_messages SET deleted_at = CURRENT_TIMESTAMP, - deletion_source = 'account', + deletion_source = $2, deleted_owner_id = $1, version = version + 1 WHERE user_id = $1 @@ -367,6 +378,7 @@ impl UserService { ", ) .bind(user_id.as_i64()) + .bind(DeletionSource::Account) .fetch_all(&mut **tx) .await? .into_iter() diff --git a/synctv-core/src/service/user/recovery.rs b/synctv-core/src/service/user/recovery.rs index 0de9e8f1..8828c41a 100644 --- a/synctv-core/src/service/user/recovery.rs +++ b/synctv-core/src/service/user/recovery.rs @@ -1,5 +1,5 @@ use crate::{ - models::{RoomId, RoomMember, RoomRole, User, UserId}, + models::{DeletionSource, RoomId, RoomMember, RoomRole, User, UserId}, repository::RoomMemberRepository, Error, Result, }; @@ -114,8 +114,9 @@ impl UserService { } let deleted_emails = sqlx::query_scalar!( - "SELECT email FROM auth_email_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = 'account' FOR UPDATE", + "SELECT email FROM auth_email_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = $2 FOR UPDATE", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .fetch_all(&mut *tx) .await?; @@ -142,9 +143,10 @@ impl UserService { released_identities.push(format!("email:{email}")); } else { sqlx::query!( - "UPDATE auth_email_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND LOWER(email) = LOWER($2) AND deletion_source = 'account'", + "UPDATE auth_email_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE user_id = $1 AND LOWER(email) = LOWER($2) AND deletion_source = $3", user_id.as_i64(), &email, + DeletionSource::Account as DeletionSource, ) .execute(&mut *tx) .await @@ -153,8 +155,9 @@ impl UserService { } let deleted_oauth = sqlx::query!( - "SELECT id, provider_instance_name, provider_user_id FROM auth_oauth2_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = 'account' FOR UPDATE", + "SELECT id, provider_instance_name, provider_user_id FROM auth_oauth2_identities WHERE user_id = $1 AND deleted_at IS NOT NULL AND deletion_source = $2 FOR UPDATE", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .fetch_all(&mut *tx) .await?; @@ -187,8 +190,9 @@ impl UserService { )); } else { sqlx::query!( - "UPDATE auth_oauth2_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = $1 AND deletion_source = 'account'", + "UPDATE auth_oauth2_identities SET deleted_at = NULL, deletion_source = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = $1 AND deletion_source = $2", identity.id, + DeletionSource::Account as DeletionSource, ) .execute(&mut *tx) .await @@ -200,10 +204,11 @@ impl UserService { r#"SELECT id AS "id: RoomId" FROM rooms WHERE deleted_owner_id = $1 - AND deletion_source = 'account' + AND deletion_source = $2 ORDER BY id FOR UPDATE"#, user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .fetch_all(&mut *tx) .await?; @@ -217,27 +222,28 @@ impl UserService { SELECT id AS room_id FROM rooms WHERE deleted_owner_id = $1 - AND deletion_source = 'account' + AND deletion_source = $2 UNION SELECT room_id FROM playlists WHERE deleted_owner_id = $1 - AND deletion_source = 'account' + AND deletion_source = $2 UNION SELECT room_id FROM media WHERE deleted_owner_id = $1 - AND deletion_source = 'account' + AND deletion_source = $2 UNION SELECT room_id FROM chat_messages WHERE deleted_owner_id = $1 - AND deletion_source = 'account' + AND deletion_source = $2 ) affected ORDER BY room_id ", ) .bind(user_id.as_i64()) + .bind(DeletionSource::Account) .fetch_all(&mut *tx) .await? .into_iter() @@ -258,26 +264,30 @@ impl UserService { } sqlx::query!( - "UPDATE rooms SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "UPDATE rooms SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut *tx) .await?; sqlx::query!( - "UPDATE playlists SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "UPDATE playlists SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut *tx) .await?; sqlx::query!( - "UPDATE media SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "UPDATE media SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, updated_at = CURRENT_TIMESTAMP, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut *tx) .await?; sqlx::query!( - "UPDATE chat_messages SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, deleted_by = NULL, delete_reason = NULL, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = 'account'", + "UPDATE chat_messages SET deleted_at = NULL, deletion_source = NULL, deleted_owner_id = NULL, deleted_by = NULL, delete_reason = NULL, version = version + 1 WHERE deleted_owner_id = $1 AND deletion_source = $2", user_id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&mut *tx) .await?; diff --git a/synctv-core/tests/cleanup_service_tests.rs b/synctv-core/tests/cleanup_service_tests.rs index f62a8223..7874ed1d 100644 --- a/synctv-core/tests/cleanup_service_tests.rs +++ b/synctv-core/tests/cleanup_service_tests.rs @@ -10,8 +10,8 @@ use std::sync::Arc; use chrono::{Duration, Utc}; use sqlx::PgPool; use synctv_core::models::{ - CreateFileUploadSession, FileReferenceTarget, FileUploadSessionCreateResult, NewStoredFile, - Room, RoomId, RoomStatus, User, UserId, UserRole, UserStatus, + CreateFileUploadSession, DeletionSource, FileReferenceTarget, FileUploadSessionCreateResult, + NewStoredFile, Room, RoomId, RoomStatus, User, UserId, UserRole, UserStatus, }; use synctv_core::repository::realtime_outbox::RealtimeOutboxStatus; use synctv_core::repository::{RoomRepository, UserRepository}; @@ -676,11 +676,12 @@ async fn test_run_all_purges_soft_deleted_user_after_room_and_membership_cleanup r#"INSERT INTO playlists ( room_id, creator_id, name, position, deleted_at, deletion_source ) - VALUES ($1, $2, 'retained-user-parent', 1.0, $3, 'user') + VALUES ($1, $2, 'retained-user-parent', 1.0, $3, $4) RETURNING id"#, surviving_room.id.as_i64(), deleted_user.id.as_i64(), forty_days_ago, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -692,12 +693,13 @@ async fn test_run_all_purges_soft_deleted_user_after_room_and_membership_cleanup room_id, creator_id, name, parent_id, position, deleted_at, deletion_source ) - VALUES ($1, $2, 'retained-other-user-child', $3, 1.0, $4, 'user') + VALUES ($1, $2, 'retained-other-user-child', $3, 1.0, $4, $5) RETURNING id"#, surviving_room.id.as_i64(), nested_creator.id.as_i64(), retained_parent_playlist_id, forty_days_ago, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -710,12 +712,13 @@ async fn test_run_all_purges_soft_deleted_user_after_room_and_membership_cleanup source_provider, source_config, deleted_at, deletion_source ) VALUES ($1, $2, $3, 'retained-child-media', 1.0, - 1, '{}'::JSONB, $4, 'user') + 1, '{}'::JSONB, $4, $5) RETURNING id"#, retained_child_playlist_id, surviving_room.id.as_i64(), nested_creator.id.as_i64(), forty_days_ago, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -739,10 +742,11 @@ async fn test_run_all_purges_soft_deleted_user_after_room_and_membership_cleanup ok( sqlx::query!( "UPDATE users - SET deleted_at = $2, updated_at = $2, deletion_source = 'account' + SET deleted_at = $2, updated_at = $2, deletion_source = $3 WHERE id = $1", deleted_user.id.as_i64(), forty_days_ago, + DeletionSource::Account as DeletionSource, ) .execute(&pool) .await, @@ -753,11 +757,12 @@ async fn test_run_all_purges_soft_deleted_user_after_room_and_membership_cleanup sqlx::query!( "UPDATE rooms SET deleted_at = $2, updated_at = $2, - deletion_source = 'account', deleted_owner_id = $3 + deletion_source = $4, deleted_owner_id = $3 WHERE id = $1", deleted_owned_room.id.as_i64(), forty_days_ago, deleted_user.id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&pool) .await, @@ -920,9 +925,10 @@ async fn account_owned_rooms_follow_the_account_recovery_window() { let forty_days_ago = Utc::now() - Duration::days(40); ok( sqlx::query!( - "UPDATE users SET deleted_at = $2, deletion_source = 'account' WHERE id = $1", + "UPDATE users SET deleted_at = $2, deletion_source = $3 WHERE id = $1", deleted_user.id.as_i64(), forty_days_ago, + DeletionSource::Account as DeletionSource, ) .execute(&pool) .await, @@ -930,10 +936,11 @@ async fn account_owned_rooms_follow_the_account_recovery_window() { ); ok( sqlx::query!( - "UPDATE rooms SET deleted_at = $2, deletion_source = 'account', deleted_owner_id = $1 WHERE id = $3", + "UPDATE rooms SET deleted_at = $2, deletion_source = $4, deleted_owner_id = $1 WHERE id = $3", deleted_user.id.as_i64(), forty_days_ago, room.id.as_i64(), + DeletionSource::Account as DeletionSource, ) .execute(&pool) .await, @@ -1089,9 +1096,10 @@ async fn hard_purge_removes_deleted_user_chat_and_resource_events() { let deleted_at = Utc::now() - Duration::days(40); ok( sqlx::query!( - "UPDATE users SET deleted_at = $2, deletion_source = 'account' WHERE id = $1", + "UPDATE users SET deleted_at = $2, deletion_source = $3 WHERE id = $1", deleted_user.id.as_i64(), deleted_at, + DeletionSource::Account as DeletionSource, ) .execute(&pool) .await, @@ -1179,14 +1187,16 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { user_id, email, deleted_at, deletion_source ) VALUES - ($1, 'expired-unbound@example.com', $4, 'user'), - ($2, 'recent-unbound@example.com', $5, 'user'), - ($3, 'account-retained@example.com', $4, 'account')"#, + ($1, 'expired-unbound@example.com', $4, $6), + ($2, 'recent-unbound@example.com', $5, $6), + ($3, 'account-retained@example.com', $4, $7)"#, user.id.as_i64(), recent_identity_user.id.as_i64(), account_identity_user.id.as_i64(), old_deleted_at, recent_deleted_at, + DeletionSource::User as DeletionSource, + DeletionSource::Account as DeletionSource, ) .execute(&pool) .await, @@ -1199,12 +1209,14 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { user_id, username, deleted_at, deletion_source ) VALUES - (2, 'github', 'expired-unbound', $1, 'expired', $2, 'user'), - (2, 'github', 'recent-unbound', $1, 'recent', $3, 'user'), - (2, 'github', 'account-retained', $1, 'account', $2, 'account')"#, + (2, 'github', 'expired-unbound', $1, 'expired', $2, $4), + (2, 'github', 'recent-unbound', $1, 'recent', $3, $4), + (2, 'github', 'account-retained', $1, 'account', $2, $5)"#, user.id.as_i64(), old_deleted_at, recent_deleted_at, + DeletionSource::User as DeletionSource, + DeletionSource::Account as DeletionSource, ) .execute(&pool) .await, @@ -1232,12 +1244,13 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { room_id, creator_id, name, cover_file_reference_id, position, deleted_at, deletion_source ) - VALUES ($1, $2, 'expired-parent', $3, 1.0, $4, 'user') + VALUES ($1, $2, 'expired-parent', $3, 1.0, $4, $5) RETURNING id"#, room.id.as_i64(), user.id.as_i64(), playlist_cover_reference_id, old_deleted_at, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -1249,12 +1262,13 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { room_id, creator_id, name, parent_id, position, deleted_at, deletion_source ) - VALUES ($1, $2, 'expired-child', $3, 1.0, $4, 'user') + VALUES ($1, $2, 'expired-child', $3, 1.0, $4, $5) RETURNING id"#, room.id.as_i64(), user.id.as_i64(), expired_parent_playlist_id, old_deleted_at, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -1265,11 +1279,12 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { r#"INSERT INTO playlists ( room_id, creator_id, name, position, deleted_at, deletion_source ) - VALUES ($1, $2, 'recent-user-delete', 2.0, $3, 'user') + VALUES ($1, $2, 'recent-user-delete', 2.0, $3, $4) RETURNING id"#, room.id.as_i64(), user.id.as_i64(), recent_deleted_at, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -1281,11 +1296,12 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { room_id, creator_id, name, position, deleted_at, deletion_source, deleted_owner_id ) - VALUES ($1, $2, 'account-delete', 3.0, $3, 'account', $2) + VALUES ($1, $2, 'account-delete', 3.0, $3, $4, $2) RETURNING id"#, room.id.as_i64(), user.id.as_i64(), old_deleted_at, + DeletionSource::Account as DeletionSource, ) .fetch_one(&pool) .await, @@ -1299,13 +1315,14 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { source_provider, source_config, cover_file_reference_id, deleted_at, deletion_source ) - VALUES ($1, $2, $3, 'expired-media', 1.0, 1, '{}'::JSONB, $4, $5, 'user') + VALUES ($1, $2, $3, 'expired-media', 1.0, 1, '{}'::JSONB, $4, $5, $6) RETURNING id"#, expired_child_playlist_id, room.id.as_i64(), user.id.as_i64(), media_cover_reference_id, old_deleted_at, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -1317,11 +1334,12 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { room_id, creator_id, name, position, source_provider, source_config, deleted_at, deletion_source ) - VALUES ($1, $2, 'recent-media', 2.0, 1, '{}'::JSONB, $3, 'user') + VALUES ($1, $2, 'recent-media', 2.0, 1, '{}'::JSONB, $3, $4) RETURNING id"#, room.id.as_i64(), user.id.as_i64(), recent_deleted_at, + DeletionSource::User as DeletionSource, ) .fetch_one(&pool) .await, @@ -1333,11 +1351,12 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { room_id, creator_id, name, position, source_provider, source_config, deleted_at, deletion_source ) - VALUES ($1, $2, 'room-media', 3.0, 1, '{}'::JSONB, $3, 'room') + VALUES ($1, $2, 'room-media', 3.0, 1, '{}'::JSONB, $3, $4) RETURNING id"#, room.id.as_i64(), user.id.as_i64(), old_deleted_at, + DeletionSource::Room as DeletionSource, ) .fetch_one(&pool) .await, @@ -1358,12 +1377,12 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { insert_chat_text_message(&pool, room.id, user.id, 91_002, message_created_at).await; insert_chat_text_message(&pool, room.id, user.id, 91_003, message_created_at).await; for (message_id, deleted_at, source, deleted_owner_id) in [ - (91_001_i64, old_deleted_at, "user", None), - (91_002_i64, recent_deleted_at, "user", None), + (91_001_i64, old_deleted_at, DeletionSource::User, None), + (91_002_i64, recent_deleted_at, DeletionSource::User, None), ( 91_003_i64, old_deleted_at, - "account", + DeletionSource::Account, Some(user.id.as_i64()), ), ] { @@ -1374,7 +1393,7 @@ async fn resource_retention_purges_only_expired_user_deleted_rows() { WHERE id = $1 AND created_at = $5"#, message_id, deleted_at, - source, + source as DeletionSource, deleted_owner_id, message_created_at, ) diff --git a/synctv-core/tests/media_integration_tests.rs b/synctv-core/tests/media_integration_tests.rs index 802d4b3c..9ef4b05a 100644 --- a/synctv-core/tests/media_integration_tests.rs +++ b/synctv-core/tests/media_integration_tests.rs @@ -5,8 +5,8 @@ use chrono::Utc; use sqlx::PgPool; use synctv_core::{ models::{ - Media, MediaId, Playlist, PlaylistId, ProviderType, Room, RoomId, RoomMember, RoomRole, - RoomStatus, SourceProvider, User, UserId, UserRole, UserStatus, + DeletionSource, Media, MediaId, Playlist, PlaylistId, ProviderType, Room, RoomId, + RoomMember, RoomRole, RoomStatus, SourceProvider, User, UserId, UserRole, UserStatus, }, repository::{ MediaRepository, PlaylistRepository, RoomMemberRepository, RoomRepository, UserRepository, @@ -255,14 +255,16 @@ async fn test_media_delete() { assert!(fetched.is_none()); let retained = sqlx::query!( - "SELECT deleted_at, deletion_source FROM media WHERE id = $1", + r#"SELECT deleted_at, + deletion_source AS "deletion_source?: DeletionSource" + FROM media WHERE id = $1"#, created.id.as_i64(), ) .fetch_one(&ctx.pool) .await .checked("soft-deleted media row should remain in storage"); assert!(retained.deleted_at.is_some()); - assert_eq!(retained.deletion_source.as_deref(), Some("user")); + assert_eq!(retained.deletion_source, Some(DeletionSource::User)); // Double delete returns false let deleted_again = media_repo diff --git a/synctv-core/tests/playback_repository_tests.rs b/synctv-core/tests/playback_repository_tests.rs index 73db109c..951c81d4 100644 --- a/synctv-core/tests/playback_repository_tests.rs +++ b/synctv-core/tests/playback_repository_tests.rs @@ -4,8 +4,8 @@ use chrono::Utc; use synctv_core::models::{ - FromProviderParams, Media, MediaId, Playlist, PlaylistId, ProviderTarget, RoomMember, RoomRole, - SourceProvider, + DeletionSource, FromProviderParams, Media, MediaId, Playlist, PlaylistId, ProviderTarget, + RoomMember, RoomRole, SourceProvider, }; use synctv_core::{ models::{Room, RoomId, RoomStatus, User, UserId, UserRole, UserStatus}, @@ -566,7 +566,7 @@ async fn test_soft_deleting_playing_media_preserves_playback_reference_for_servi "soft-deleted media should disappear from normal repository reads" ); - let (deleted_at, deletion_source): (Option>, Option) = ok( + let (deleted_at, deletion_source): (Option>, Option) = ok( sqlx::query_as("SELECT deleted_at, deletion_source FROM media WHERE id = $1") .bind(media.id.as_i64()) .fetch_one(&pool) @@ -574,7 +574,7 @@ async fn test_soft_deleting_playing_media_preserves_playback_reference_for_servi "media lifecycle metadata should remain queryable", ); assert!(deleted_at.is_some()); - assert_eq!(deletion_source.as_deref(), Some("user")); + assert_eq!(deletion_source, Some(DeletionSource::User)); let state_after_delete = some( ok( diff --git a/synctv-core/tests/room_service_tests.rs b/synctv-core/tests/room_service_tests.rs index 3db016bf..b58900e7 100644 --- a/synctv-core/tests/room_service_tests.rs +++ b/synctv-core/tests/room_service_tests.rs @@ -10,10 +10,10 @@ use synctv_core::{ cache::{KeyBuilder, UsernameCache}, models::{ room_settings::{AllowAutoJoin, MaxMembers, RequireApproval}, - Media, MediaId, MemberStatus, MyRoomListQuery, PageParams, Playlist, PlaylistId, - ReviewRequestId, RoomAdminPermissionBits, RoomId, RoomListQuery, RoomRole, RoomSettings, - RoomStatus, SourceProvider, UpsertRoomCategory, UpsertRoomLabel, User, UserId, UserRole, - UserStatus, + DeletionSource, Media, MediaId, MemberStatus, MyRoomListQuery, PageParams, Playlist, + PlaylistId, ReviewRequestId, RoomAdminPermissionBits, RoomId, RoomListQuery, RoomRole, + RoomSettings, RoomStatus, SourceProvider, UpsertRoomCategory, UpsertRoomLabel, User, + UserId, UserRole, UserStatus, }, repository::{ MediaRepository, PlaylistRepository, ReviewRepository, RoomMemberRepository, @@ -5636,9 +5636,10 @@ async fn test_soft_delete_retains_recoverable_data_and_cleans_up_volatile_data() "Playlists should remain available for room recovery" ); let deleted_playlist_count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM playlists WHERE room_id = $1 AND deleted_at IS NOT NULL AND deletion_source = 'room'", + "SELECT COUNT(*) FROM playlists WHERE room_id = $1 AND deleted_at IS NOT NULL AND deletion_source = $2", ) .bind(room.id.as_i64()) + .bind(DeletionSource::Room) .fetch_one(&pool) .await .checked("test operation should succeed"); @@ -5656,9 +5657,10 @@ async fn test_soft_delete_retains_recoverable_data_and_cleans_up_volatile_data() "Media should remain available for room recovery" ); let deleted_media_count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM media WHERE room_id = $1 AND deleted_at IS NOT NULL AND deletion_source = 'room'", + "SELECT COUNT(*) FROM media WHERE room_id = $1 AND deleted_at IS NOT NULL AND deletion_source = $2", ) .bind(room.id.as_i64()) + .bind(DeletionSource::Room) .fetch_one(&pool) .await .checked("test operation should succeed"); @@ -5700,9 +5702,10 @@ async fn test_soft_delete_retains_recoverable_data_and_cleans_up_volatile_data() "Chat messages should remain available for room recovery" ); let deleted_chat_count: i64 = sqlx::query_scalar( - "SELECT COUNT(*) FROM chat_messages WHERE room_id = $1 AND deleted_at IS NOT NULL AND deletion_source = 'room'", + "SELECT COUNT(*) FROM chat_messages WHERE room_id = $1 AND deleted_at IS NOT NULL AND deletion_source = $2", ) .bind(room.id.as_i64()) + .bind(DeletionSource::Room) .fetch_one(&pool) .await .checked("test operation should succeed"); diff --git a/synctv-core/tests/user_service_tests.rs b/synctv-core/tests/user_service_tests.rs index dfc22608..44237943 100644 --- a/synctv-core/tests/user_service_tests.rs +++ b/synctv-core/tests/user_service_tests.rs @@ -12,9 +12,9 @@ use sqlx::PgPool; use synctv_core::{ cache::{KeyBuilder, LocalVersionFenceStore, UsernameCache, VersionFenceStore}, models::{ - Media, MediaId, MemberStatus, NotificationType, Playlist, PlaylistId, Room, RoomId, - RoomMember, RoomStatus, SignupMethod, SourceProvider, User, UserId, UserRole, UserStatus, - OPAQUE_CIPHERSUITE_RISTRETTO255_SHA512_ARGON2ID, OPAQUE_SERVER_SETUP_VERSION, + DeletionSource, Media, MediaId, MemberStatus, NotificationType, Playlist, PlaylistId, Room, + RoomId, RoomMember, RoomStatus, SignupMethod, SourceProvider, User, UserId, UserRole, + UserStatus, OPAQUE_CIPHERSUITE_RISTRETTO255_SHA512_ARGON2ID, OPAQUE_SERVER_SETUP_VERSION, }, repository::{ ChatRepository, MediaRepository, PlaylistRepository, RoomMemberRepository, RoomRepository, @@ -1177,14 +1177,19 @@ async fn assert_delete_user_removes_owned_resources_and_resets_foreign_room_play assert!(!playback_row.is_playing, "playback must be stopped"); let oauth2_identity = sqlx::query!( - "SELECT deleted_at, deletion_source FROM auth_oauth2_identities WHERE user_id = $1", + r#"SELECT deleted_at, + deletion_source AS "deletion_source?: DeletionSource" + FROM auth_oauth2_identities WHERE user_id = $1"#, doomed_user.id.as_i64() ) .fetch_one(&pool) .await .checked("query retained oauth2 mapping"); assert!(oauth2_identity.deleted_at.is_some()); - assert_eq!(oauth2_identity.deletion_source.as_deref(), Some("account")); + assert_eq!( + oauth2_identity.deletion_source, + Some(DeletionSource::Account) + ); assert_eq!( service @@ -1242,7 +1247,10 @@ async fn assert_delete_user_removes_owned_resources_and_resets_foreign_room_play "surviving-room chat keeps its author during the recovery window" ); let foreign_chat_lifecycle = sqlx::query!( - "SELECT deleted_at, deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\" FROM chat_messages WHERE id = $1", + r#"SELECT deleted_at, + deletion_source AS "deletion_source?: DeletionSource", + deleted_owner_id AS "deleted_owner_id: UserId" + FROM chat_messages WHERE id = $1"#, foreign_chat_message_id, ) .fetch_one(&pool) @@ -1250,8 +1258,8 @@ async fn assert_delete_user_removes_owned_resources_and_resets_foreign_room_play .checked("query surviving-room chat lifecycle"); assert!(foreign_chat_lifecycle.deleted_at.is_some()); assert_eq!( - foreign_chat_lifecycle.deletion_source.as_deref(), - Some("account") + foreign_chat_lifecycle.deletion_source, + Some(DeletionSource::Account) ); assert_eq!( foreign_chat_lifecycle.deleted_owner_id, @@ -1265,22 +1273,26 @@ async fn assert_delete_user_removes_owned_resources_and_resets_foreign_room_play .is_none()); let owned_chat = sqlx::query!( - "SELECT deleted_at, deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\" FROM chat_messages WHERE room_id = $1", + r#"SELECT deleted_at, + deletion_source AS "deletion_source?: DeletionSource", + deleted_owner_id AS "deleted_owner_id: UserId" + FROM chat_messages WHERE room_id = $1"#, owned_room.id.as_i64(), ) .fetch_one(&pool) .await .checked("query owned room chat lifecycle"); assert!(owned_chat.deleted_at.is_some()); - assert_eq!(owned_chat.deletion_source.as_deref(), Some("account")); + assert_eq!(owned_chat.deletion_source, Some(DeletionSource::Account)); assert_eq!(owned_chat.deleted_owner_id, Some(doomed_user.id)); let propagated_resources = sqlx::query!( - r#"SELECT deletion_source, deleted_owner_id AS "deleted_owner_id: UserId" + r#"SELECT deletion_source AS "deletion_source?: DeletionSource", + deleted_owner_id AS "deleted_owner_id: UserId" FROM playlists WHERE id = ANY($1) UNION ALL - SELECT deletion_source, deleted_owner_id AS "deleted_owner_id: UserId" + SELECT deletion_source, deleted_owner_id FROM media WHERE id = ANY($2)"#, &[owned_playlist.id.as_i64(), foreign_playlist.id.as_i64()], @@ -1291,19 +1303,25 @@ async fn assert_delete_user_removes_owned_resources_and_resets_foreign_room_play .checked("query propagated resource lifecycle"); assert_eq!(propagated_resources.len(), 4); for row in propagated_resources { - assert_eq!(row.deletion_source.as_deref(), Some("account")); + assert_eq!(row.deletion_source, Some(DeletionSource::Account)); assert_eq!(row.deleted_owner_id, Some(doomed_user.id)); } let explicit_lifecycle = sqlx::query!( - "SELECT deleted_at, deletion_source, deleted_owner_id AS \"deleted_owner_id: UserId\" FROM media WHERE id = $1", + r#"SELECT deleted_at, + deletion_source AS "deletion_source?: DeletionSource", + deleted_owner_id AS "deleted_owner_id: UserId" + FROM media WHERE id = $1"#, explicitly_deleted_media.id.as_i64(), ) .fetch_one(&pool) .await .checked("query explicitly deleted media lifecycle"); assert!(explicit_lifecycle.deleted_at.is_some()); - assert_eq!(explicit_lifecycle.deletion_source.as_deref(), Some("user")); + assert_eq!( + explicit_lifecycle.deletion_source, + Some(DeletionSource::User) + ); assert_eq!(explicit_lifecycle.deleted_owner_id, None); let restored = service @@ -1487,8 +1505,9 @@ async fn assert_restore_identity_conflict_modes(pool: PgPool) { .checked("create explicit identity account"); insert_trusted_email_identity(&pool, &explicit_identity.id, "explicit@example.com").await; sqlx::query!( - "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = 'user' WHERE user_id = $1", + "UPDATE auth_email_identities SET deleted_at = CURRENT_TIMESTAMP, deletion_source = $2 WHERE user_id = $1", explicit_identity.id.as_i64(), + DeletionSource::User as DeletionSource, ) .execute(&pool) .await @@ -1509,13 +1528,14 @@ async fn assert_restore_identity_conflict_modes(pool: PgPool) { None ); let explicit_source = sqlx::query_scalar!( - "SELECT deletion_source FROM auth_email_identities WHERE user_id = $1", + r#"SELECT deletion_source AS "deletion_source?: DeletionSource" + FROM auth_email_identities WHERE user_id = $1"#, explicit_identity.id.as_i64(), ) .fetch_one(&pool) .await .checked("load explicit identity deletion source"); - assert_eq!(explicit_source.as_deref(), Some("user")); + assert_eq!(explicit_source, Some(DeletionSource::User)); } /// Test that "username taken" errors do NOT count against IP brute-force lockout.