diff --git a/.sqlx/query-00e2443c853791978e20e590a54721e44bbf7df1285acc27b0b658841fb55c7e.json b/.sqlx/query-00e2443c853791978e20e590a54721e44bbf7df1285acc27b0b658841fb55c7e.json
new file mode 100644
index 0000000..34fa7e4
--- /dev/null
+++ b/.sqlx/query-00e2443c853791978e20e590a54721e44bbf7df1285acc27b0b658841fb55c7e.json
@@ -0,0 +1,14 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "UPDATE users SET telegram_verified = TRUE WHERE id = $1",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Left": [
+ "Uuid"
+ ]
+ },
+ "nullable": []
+ },
+ "hash": "00e2443c853791978e20e590a54721e44bbf7df1285acc27b0b658841fb55c7e"
+}
diff --git a/.sqlx/query-0e837bf8eb303dbd2d0ffad0167da75c15fb1859c658fc5957ab28ef674108a8.json b/.sqlx/query-0e837bf8eb303dbd2d0ffad0167da75c15fb1859c658fc5957ab28ef674108a8.json
deleted file mode 100644
index e27197a..0000000
--- a/.sqlx/query-0e837bf8eb303dbd2d0ffad0167da75c15fb1859c658fc5957ab28ef674108a8.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM channel_verifications WHERE user_id = $1 AND channel = 'telegram'",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Uuid"
- ]
- },
- "nullable": []
- },
- "hash": "0e837bf8eb303dbd2d0ffad0167da75c15fb1859c658fc5957ab28ef674108a8"
-}
diff --git a/.sqlx/query-17dfafc85b3434ed78041f48809580a02c92e579869f647cb08f65ac777854f5.json b/.sqlx/query-17dfafc85b3434ed78041f48809580a02c92e579869f647cb08f65ac777854f5.json
index c73334a..ffe7d8a 100644
--- a/.sqlx/query-17dfafc85b3434ed78041f48809580a02c92e579869f647cb08f65ac777854f5.json
+++ b/.sqlx/query-17dfafc85b3434ed78041f48809580a02c92e579869f647cb08f65ac777854f5.json
@@ -40,7 +40,8 @@
"two_factor_code",
"channel_verification",
"passkey_recovery",
- "legacy_login_alert"
+ "legacy_login_alert",
+ "migration_verification"
]
}
}
diff --git a/.sqlx/query-1baf4c087c31d0e2af8f607fb3476db6b34925a0c8902fdd9c9a5a607f19b3af.json b/.sqlx/query-1baf4c087c31d0e2af8f607fb3476db6b34925a0c8902fdd9c9a5a607f19b3af.json
new file mode 100644
index 0000000..a7eb7be
--- /dev/null
+++ b/.sqlx/query-1baf4c087c31d0e2af8f607fb3476db6b34925a0c8902fdd9c9a5a607f19b3af.json
@@ -0,0 +1,14 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "UPDATE users SET signal_verified = TRUE WHERE id = $1",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Left": [
+ "Uuid"
+ ]
+ },
+ "nullable": []
+ },
+ "hash": "1baf4c087c31d0e2af8f607fb3476db6b34925a0c8902fdd9c9a5a607f19b3af"
+}
diff --git a/.sqlx/query-20dd204aa552572ec9dc5b9950efdfa8a2e37aae3f171a2be73bee3057f86e08.json b/.sqlx/query-20dd204aa552572ec9dc5b9950efdfa8a2e37aae3f171a2be73bee3057f86e08.json
index 5de15c2..6fda80b 100644
--- a/.sqlx/query-20dd204aa552572ec9dc5b9950efdfa8a2e37aae3f171a2be73bee3057f86e08.json
+++ b/.sqlx/query-20dd204aa552572ec9dc5b9950efdfa8a2e37aae3f171a2be73bee3057f86e08.json
@@ -48,7 +48,8 @@
"two_factor_code",
"channel_verification",
"passkey_recovery",
- "legacy_login_alert"
+ "legacy_login_alert",
+ "migration_verification"
]
}
}
diff --git a/.sqlx/query-30aa8003262b82ee58f1819f1a74c195768dce6d4c8d297e8b7eab1d990f61c5.json b/.sqlx/query-30aa8003262b82ee58f1819f1a74c195768dce6d4c8d297e8b7eab1d990f61c5.json
deleted file mode 100644
index bdf5ff6..0000000
--- a/.sqlx/query-30aa8003262b82ee58f1819f1a74c195768dce6d4c8d297e8b7eab1d990f61c5.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "UPDATE users SET email = $1, updated_at = NOW() WHERE id = $2",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Text",
- "Uuid"
- ]
- },
- "nullable": []
- },
- "hash": "30aa8003262b82ee58f1819f1a74c195768dce6d4c8d297e8b7eab1d990f61c5"
-}
diff --git a/.sqlx/query-3f9b3b06f54df7c1d20ea9ff94b914ad3bf77d47dd393a0aae1c030b8ce98bcc.json b/.sqlx/query-3f9b3b06f54df7c1d20ea9ff94b914ad3bf77d47dd393a0aae1c030b8ce98bcc.json
index d29765e..73a571f 100644
--- a/.sqlx/query-3f9b3b06f54df7c1d20ea9ff94b914ad3bf77d47dd393a0aae1c030b8ce98bcc.json
+++ b/.sqlx/query-3f9b3b06f54df7c1d20ea9ff94b914ad3bf77d47dd393a0aae1c030b8ce98bcc.json
@@ -40,7 +40,8 @@
"two_factor_code",
"channel_verification",
"passkey_recovery",
- "legacy_login_alert"
+ "legacy_login_alert",
+ "migration_verification"
]
}
}
diff --git a/.sqlx/query-54ec6149f129881362891151da8200baef1f16427d87fb3afeb1e066c4084483.json b/.sqlx/query-54ec6149f129881362891151da8200baef1f16427d87fb3afeb1e066c4084483.json
deleted file mode 100644
index e3a0c80..0000000
--- a/.sqlx/query-54ec6149f129881362891151da8200baef1f16427d87fb3afeb1e066c4084483.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "INSERT INTO channel_verifications (user_id, channel, code, pending_identifier, expires_at) VALUES ($1, $2::comms_channel, $3, $4, $5)",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Uuid",
- {
- "Custom": {
- "name": "comms_channel",
- "kind": {
- "Enum": [
- "email",
- "discord",
- "telegram",
- "signal"
- ]
- }
- }
- },
- "Text",
- "Text",
- "Timestamptz"
- ]
- },
- "nullable": []
- },
- "hash": "54ec6149f129881362891151da8200baef1f16427d87fb3afeb1e066c4084483"
-}
diff --git a/.sqlx/query-57229564a518b14dca6fecef677d4b58b5ab6892846e65a4f1549ae5f147c13e.json b/.sqlx/query-57229564a518b14dca6fecef677d4b58b5ab6892846e65a4f1549ae5f147c13e.json
deleted file mode 100644
index 9244ba0..0000000
--- a/.sqlx/query-57229564a518b14dca6fecef677d4b58b5ab6892846e65a4f1549ae5f147c13e.json
+++ /dev/null
@@ -1,27 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM channel_verifications WHERE user_id = $1 AND channel = $2::comms_channel",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Uuid",
- {
- "Custom": {
- "name": "comms_channel",
- "kind": {
- "Enum": [
- "email",
- "discord",
- "telegram",
- "signal"
- ]
- }
- }
- }
- ]
- },
- "nullable": []
- },
- "hash": "57229564a518b14dca6fecef677d4b58b5ab6892846e65a4f1549ae5f147c13e"
-}
diff --git a/.sqlx/query-5a3f588a937a44a4e14570a6c13bc6f4c5a2a50155f6e8bdd14beef66dca97c1.json b/.sqlx/query-5a3f588a937a44a4e14570a6c13bc6f4c5a2a50155f6e8bdd14beef66dca97c1.json
deleted file mode 100644
index f597186..0000000
--- a/.sqlx/query-5a3f588a937a44a4e14570a6c13bc6f4c5a2a50155f6e8bdd14beef66dca97c1.json
+++ /dev/null
@@ -1,41 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "SELECT code, expires_at FROM channel_verifications WHERE user_id = $1 AND channel = $2::comms_channel",
- "describe": {
- "columns": [
- {
- "ordinal": 0,
- "name": "code",
- "type_info": "Text"
- },
- {
- "ordinal": 1,
- "name": "expires_at",
- "type_info": "Timestamptz"
- }
- ],
- "parameters": {
- "Left": [
- "Uuid",
- {
- "Custom": {
- "name": "comms_channel",
- "kind": {
- "Enum": [
- "email",
- "discord",
- "telegram",
- "signal"
- ]
- }
- }
- }
- ]
- },
- "nullable": [
- false,
- false
- ]
- },
- "hash": "5a3f588a937a44a4e14570a6c13bc6f4c5a2a50155f6e8bdd14beef66dca97c1"
-}
diff --git a/.sqlx/query-5e1ed2edc81e4f2560b3f8f0a8f04e0fb78548402715fc88e2b34a8ccdb80082.json b/.sqlx/query-5e1ed2edc81e4f2560b3f8f0a8f04e0fb78548402715fc88e2b34a8ccdb80082.json
new file mode 100644
index 0000000..af8bd06
--- /dev/null
+++ b/.sqlx/query-5e1ed2edc81e4f2560b3f8f0a8f04e0fb78548402715fc88e2b34a8ccdb80082.json
@@ -0,0 +1,34 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "SELECT id, email, email_verified FROM users WHERE did = $1",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "id",
+ "type_info": "Uuid"
+ },
+ {
+ "ordinal": 1,
+ "name": "email",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 2,
+ "name": "email_verified",
+ "type_info": "Bool"
+ }
+ ],
+ "parameters": {
+ "Left": [
+ "Text"
+ ]
+ },
+ "nullable": [
+ false,
+ true,
+ false
+ ]
+ },
+ "hash": "5e1ed2edc81e4f2560b3f8f0a8f04e0fb78548402715fc88e2b34a8ccdb80082"
+}
diff --git a/.sqlx/query-5ee0976fbff885ad19482b3b4d54ebca7a6cde24c411597c9df6e94b8be1f922.json b/.sqlx/query-5ee0976fbff885ad19482b3b4d54ebca7a6cde24c411597c9df6e94b8be1f922.json
new file mode 100644
index 0000000..7b0a696
--- /dev/null
+++ b/.sqlx/query-5ee0976fbff885ad19482b3b4d54ebca7a6cde24c411597c9df6e94b8be1f922.json
@@ -0,0 +1,46 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "SELECT id, did, email, email_verified, handle FROM users WHERE LOWER(email) = $1",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "id",
+ "type_info": "Uuid"
+ },
+ {
+ "ordinal": 1,
+ "name": "did",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 2,
+ "name": "email",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 3,
+ "name": "email_verified",
+ "type_info": "Bool"
+ },
+ {
+ "ordinal": 4,
+ "name": "handle",
+ "type_info": "Text"
+ }
+ ],
+ "parameters": {
+ "Left": [
+ "Text"
+ ]
+ },
+ "nullable": [
+ false,
+ false,
+ true,
+ false,
+ false
+ ]
+ },
+ "hash": "5ee0976fbff885ad19482b3b4d54ebca7a6cde24c411597c9df6e94b8be1f922"
+}
diff --git a/.sqlx/query-9af373d1bee5d79419f131a44c6e346a95bd3cafe2454dbe08411abb11f42161.json b/.sqlx/query-9af373d1bee5d79419f131a44c6e346a95bd3cafe2454dbe08411abb11f42161.json
deleted file mode 100644
index 5b1d026..0000000
--- a/.sqlx/query-9af373d1bee5d79419f131a44c6e346a95bd3cafe2454dbe08411abb11f42161.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM channel_verifications WHERE user_id = $1 AND channel = 'discord'",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Uuid"
- ]
- },
- "nullable": []
- },
- "hash": "9af373d1bee5d79419f131a44c6e346a95bd3cafe2454dbe08411abb11f42161"
-}
diff --git a/.sqlx/query-efc26a1202b1bbf72da1c06b59b47e560dfb5912db8e40ee92cf91846f306e1a.json b/.sqlx/query-9b895b9db78ec8a5f13c0b55ea0115e4653e01fd6f5c41f156c844381347cb8a.json
similarity index 67%
rename from .sqlx/query-efc26a1202b1bbf72da1c06b59b47e560dfb5912db8e40ee92cf91846f306e1a.json
rename to .sqlx/query-9b895b9db78ec8a5f13c0b55ea0115e4653e01fd6f5c41f156c844381347cb8a.json
index b98bfef..8b5e3b1 100644
--- a/.sqlx/query-efc26a1202b1bbf72da1c06b59b47e560dfb5912db8e40ee92cf91846f306e1a.json
+++ b/.sqlx/query-9b895b9db78ec8a5f13c0b55ea0115e4653e01fd6f5c41f156c844381347cb8a.json
@@ -1,6 +1,6 @@
{
"db_name": "PostgreSQL",
- "query": "SELECT\n u.id, u.did, u.handle, u.email,\n u.preferred_comms_channel as \"channel: crate::comms::CommsChannel\",\n k.key_bytes, k.encryption_version\n FROM users u\n JOIN user_keys k ON u.id = k.user_id\n WHERE u.did = $1",
+ "query": "SELECT\n u.id, u.did, u.handle, u.email,\n u.preferred_comms_channel as \"channel: crate::comms::CommsChannel\",\n u.discord_id, u.telegram_username, u.signal_number,\n k.key_bytes, k.encryption_version\n FROM users u\n JOIN user_keys k ON u.id = k.user_id\n WHERE u.did = $1",
"describe": {
"columns": [
{
@@ -42,11 +42,26 @@
},
{
"ordinal": 5,
+ "name": "discord_id",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 6,
+ "name": "telegram_username",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 7,
+ "name": "signal_number",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 8,
"name": "key_bytes",
"type_info": "Bytea"
},
{
- "ordinal": 6,
+ "ordinal": 9,
"name": "encryption_version",
"type_info": "Int4"
}
@@ -62,9 +77,12 @@
false,
true,
false,
+ true,
+ true,
+ true,
false,
true
]
},
- "hash": "efc26a1202b1bbf72da1c06b59b47e560dfb5912db8e40ee92cf91846f306e1a"
+ "hash": "9b895b9db78ec8a5f13c0b55ea0115e4653e01fd6f5c41f156c844381347cb8a"
}
diff --git a/.sqlx/query-a1464e8d15e8e46a3ebc21e591afb89b8f937469f8e33a43f2cd8e121526f3d3.json b/.sqlx/query-a1464e8d15e8e46a3ebc21e591afb89b8f937469f8e33a43f2cd8e121526f3d3.json
deleted file mode 100644
index d5fe56b..0000000
--- a/.sqlx/query-a1464e8d15e8e46a3ebc21e591afb89b8f937469f8e33a43f2cd8e121526f3d3.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "SELECT code, pending_identifier, expires_at FROM channel_verifications WHERE user_id = $1 AND channel = 'email'",
- "describe": {
- "columns": [
- {
- "ordinal": 0,
- "name": "code",
- "type_info": "Text"
- },
- {
- "ordinal": 1,
- "name": "pending_identifier",
- "type_info": "Text"
- },
- {
- "ordinal": 2,
- "name": "expires_at",
- "type_info": "Timestamptz"
- }
- ],
- "parameters": {
- "Left": [
- "Uuid"
- ]
- },
- "nullable": [
- false,
- true,
- false
- ]
- },
- "hash": "a1464e8d15e8e46a3ebc21e591afb89b8f937469f8e33a43f2cd8e121526f3d3"
-}
diff --git a/.sqlx/query-a51d2a4af488164421cf669302c896720a4745bfb913a18e4829a8edd73ea005.json b/.sqlx/query-a51d2a4af488164421cf669302c896720a4745bfb913a18e4829a8edd73ea005.json
new file mode 100644
index 0000000..a5c2d6e
--- /dev/null
+++ b/.sqlx/query-a51d2a4af488164421cf669302c896720a4745bfb913a18e4829a8edd73ea005.json
@@ -0,0 +1,15 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "UPDATE users SET email = $1, email_verified = TRUE, updated_at = NOW() WHERE id = $2",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Left": [
+ "Text",
+ "Uuid"
+ ]
+ },
+ "nullable": []
+ },
+ "hash": "a51d2a4af488164421cf669302c896720a4745bfb913a18e4829a8edd73ea005"
+}
diff --git a/.sqlx/query-af3010ff76e52b7cb495091f2f36547360523b12f83e4eb178242edec052a0f2.json b/.sqlx/query-af3010ff76e52b7cb495091f2f36547360523b12f83e4eb178242edec052a0f2.json
deleted file mode 100644
index c82d660..0000000
--- a/.sqlx/query-af3010ff76e52b7cb495091f2f36547360523b12f83e4eb178242edec052a0f2.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM channel_verifications WHERE user_id = $1 AND channel = 'email'",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Uuid"
- ]
- },
- "nullable": []
- },
- "hash": "af3010ff76e52b7cb495091f2f36547360523b12f83e4eb178242edec052a0f2"
-}
diff --git a/.sqlx/query-b1a4e2dc9578c3aad054ebacf00a7e804dc0aa4f0a4a283683ad1ce6a77d4f6a.json b/.sqlx/query-b1a4e2dc9578c3aad054ebacf00a7e804dc0aa4f0a4a283683ad1ce6a77d4f6a.json
new file mode 100644
index 0000000..116bfa7
--- /dev/null
+++ b/.sqlx/query-b1a4e2dc9578c3aad054ebacf00a7e804dc0aa4f0a4a283683ad1ce6a77d4f6a.json
@@ -0,0 +1,14 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "UPDATE users SET email_verified = true WHERE id = $1",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Left": [
+ "Uuid"
+ ]
+ },
+ "nullable": []
+ },
+ "hash": "b1a4e2dc9578c3aad054ebacf00a7e804dc0aa4f0a4a283683ad1ce6a77d4f6a"
+}
diff --git a/.sqlx/query-c12a8bbd82bd9caf8ad92f21da7517275989b41befa82347883945f77e8630f6.json b/.sqlx/query-c12a8bbd82bd9caf8ad92f21da7517275989b41befa82347883945f77e8630f6.json
new file mode 100644
index 0000000..9ae8c70
--- /dev/null
+++ b/.sqlx/query-c12a8bbd82bd9caf8ad92f21da7517275989b41befa82347883945f77e8630f6.json
@@ -0,0 +1,58 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "SELECT id, handle, email, email_verified, discord_verified, telegram_verified, signal_verified FROM users WHERE did = $1",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "id",
+ "type_info": "Uuid"
+ },
+ {
+ "ordinal": 1,
+ "name": "handle",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 2,
+ "name": "email",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 3,
+ "name": "email_verified",
+ "type_info": "Bool"
+ },
+ {
+ "ordinal": 4,
+ "name": "discord_verified",
+ "type_info": "Bool"
+ },
+ {
+ "ordinal": 5,
+ "name": "telegram_verified",
+ "type_info": "Bool"
+ },
+ {
+ "ordinal": 6,
+ "name": "signal_verified",
+ "type_info": "Bool"
+ }
+ ],
+ "parameters": {
+ "Left": [
+ "Text"
+ ]
+ },
+ "nullable": [
+ false,
+ false,
+ true,
+ false,
+ false,
+ false,
+ false
+ ]
+ },
+ "hash": "c12a8bbd82bd9caf8ad92f21da7517275989b41befa82347883945f77e8630f6"
+}
diff --git a/.sqlx/query-c4db3853b2f3b6363ab0e2c10a1820dd37741e9c506d85fc2608a3a6e376c5e6.json b/.sqlx/query-c4db3853b2f3b6363ab0e2c10a1820dd37741e9c506d85fc2608a3a6e376c5e6.json
deleted file mode 100644
index bba38eb..0000000
--- a/.sqlx/query-c4db3853b2f3b6363ab0e2c10a1820dd37741e9c506d85fc2608a3a6e376c5e6.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "\n INSERT INTO channel_verifications (user_id, channel, code, pending_identifier, expires_at)\n VALUES ($1, $2::comms_channel, $3, $4, $5)\n ON CONFLICT (user_id, channel) DO UPDATE\n SET code = $3, pending_identifier = $4, expires_at = $5, created_at = NOW()\n ",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Uuid",
- {
- "Custom": {
- "name": "comms_channel",
- "kind": {
- "Enum": [
- "email",
- "discord",
- "telegram",
- "signal"
- ]
- }
- }
- },
- "Text",
- "Text",
- "Timestamptz"
- ]
- },
- "nullable": []
- },
- "hash": "c4db3853b2f3b6363ab0e2c10a1820dd37741e9c506d85fc2608a3a6e376c5e6"
-}
diff --git a/.sqlx/query-cb626a36deffd73e67de2dc4789bd875675779a173fb2cd41ba365c1acca96f9.json b/.sqlx/query-cb626a36deffd73e67de2dc4789bd875675779a173fb2cd41ba365c1acca96f9.json
new file mode 100644
index 0000000..dd7d849
--- /dev/null
+++ b/.sqlx/query-cb626a36deffd73e67de2dc4789bd875675779a173fb2cd41ba365c1acca96f9.json
@@ -0,0 +1,14 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "UPDATE users SET email_verified = TRUE WHERE id = $1",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Left": [
+ "Uuid"
+ ]
+ },
+ "nullable": []
+ },
+ "hash": "cb626a36deffd73e67de2dc4789bd875675779a173fb2cd41ba365c1acca96f9"
+}
diff --git a/.sqlx/query-d09a8b0ab3abd19a09b7588b99335ec3857ca22e0707ef8911251c4c69e74c87.json b/.sqlx/query-d09a8b0ab3abd19a09b7588b99335ec3857ca22e0707ef8911251c4c69e74c87.json
new file mode 100644
index 0000000..628e860
--- /dev/null
+++ b/.sqlx/query-d09a8b0ab3abd19a09b7588b99335ec3857ca22e0707ef8911251c4c69e74c87.json
@@ -0,0 +1,14 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "UPDATE users SET discord_verified = TRUE WHERE id = $1",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Left": [
+ "Uuid"
+ ]
+ },
+ "nullable": []
+ },
+ "hash": "d09a8b0ab3abd19a09b7588b99335ec3857ca22e0707ef8911251c4c69e74c87"
+}
diff --git a/.sqlx/query-ee95f960c0df276fd936ceaef8b75d341a4c84322e5de2b3630573dbef387839.json b/.sqlx/query-ee95f960c0df276fd936ceaef8b75d341a4c84322e5de2b3630573dbef387839.json
deleted file mode 100644
index c0b5eda..0000000
--- a/.sqlx/query-ee95f960c0df276fd936ceaef8b75d341a4c84322e5de2b3630573dbef387839.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "DELETE FROM channel_verifications WHERE user_id = $1 AND channel = 'signal'",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Uuid"
- ]
- },
- "nullable": []
- },
- "hash": "ee95f960c0df276fd936ceaef8b75d341a4c84322e5de2b3630573dbef387839"
-}
diff --git a/.sqlx/query-f48c982a2bf52a2f2de6d70043108ac148363e2f98b301dbeeb1caac330528c5.json b/.sqlx/query-f48c982a2bf52a2f2de6d70043108ac148363e2f98b301dbeeb1caac330528c5.json
deleted file mode 100644
index 720cd39..0000000
--- a/.sqlx/query-f48c982a2bf52a2f2de6d70043108ac148363e2f98b301dbeeb1caac330528c5.json
+++ /dev/null
@@ -1,47 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "\n SELECT code, pending_identifier, expires_at FROM channel_verifications\n WHERE user_id = $1 AND channel = $2::comms_channel\n ",
- "describe": {
- "columns": [
- {
- "ordinal": 0,
- "name": "code",
- "type_info": "Text"
- },
- {
- "ordinal": 1,
- "name": "pending_identifier",
- "type_info": "Text"
- },
- {
- "ordinal": 2,
- "name": "expires_at",
- "type_info": "Timestamptz"
- }
- ],
- "parameters": {
- "Left": [
- "Uuid",
- {
- "Custom": {
- "name": "comms_channel",
- "kind": {
- "Enum": [
- "email",
- "discord",
- "telegram",
- "signal"
- ]
- }
- }
- }
- ]
- },
- "nullable": [
- false,
- true,
- false
- ]
- },
- "hash": "f48c982a2bf52a2f2de6d70043108ac148363e2f98b301dbeeb1caac330528c5"
-}
diff --git a/.sqlx/query-fde01bb40898f8a5d45a6e8f89c635c06b4179b5858a7b388404c4b03fc92ab4.json b/.sqlx/query-fde01bb40898f8a5d45a6e8f89c635c06b4179b5858a7b388404c4b03fc92ab4.json
index 2c6ef01..bd681a6 100644
--- a/.sqlx/query-fde01bb40898f8a5d45a6e8f89c635c06b4179b5858a7b388404c4b03fc92ab4.json
+++ b/.sqlx/query-fde01bb40898f8a5d45a6e8f89c635c06b4179b5858a7b388404c4b03fc92ab4.json
@@ -43,7 +43,8 @@
"two_factor_code",
"channel_verification",
"passkey_recovery",
- "legacy_login_alert"
+ "legacy_login_alert",
+ "migration_verification"
]
}
}
diff --git a/frontend/deno.lock b/frontend/deno.lock
index a3c05bf..1105a1c 100644
--- a/frontend/deno.lock
+++ b/frontend/deno.lock
@@ -8,6 +8,7 @@
"npm:@testing-library/user-event@^14.5.2": "14.6.1_@testing-library+dom@10.4.1",
"npm:jsdom@^25.0.1": "25.0.1",
"npm:multiformats@^13.3.1": "13.4.2",
+ "npm:svelte-check@*": "4.3.5_svelte@5.45.10__acorn@8.15.0_typescript@5.9.3",
"npm:svelte-i18n@^4.0.1": "4.0.1_svelte@5.45.10__acorn@8.15.0",
"npm:svelte@5": "5.45.10_acorn@8.15.0",
"npm:vite@*": "6.4.1_picomatch@4.0.3",
@@ -794,6 +795,12 @@
"check-error@2.1.1": {
"integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="
},
+ "chokidar@4.0.3": {
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dependencies": [
+ "readdirp"
+ ]
+ },
"cli-color@2.0.4": {
"integrity": "sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==",
"dependencies": [
@@ -1339,6 +1346,9 @@
"react-is@17.0.2": {
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
},
+ "readdirp@4.1.2": {
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="
+ },
"redent@3.0.0": {
"integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
"dependencies": [
@@ -1417,6 +1427,19 @@
"min-indent"
]
},
+ "svelte-check@4.3.5_svelte@5.45.10__acorn@8.15.0_typescript@5.9.3": {
+ "integrity": "sha512-e4VWZETyXaKGhpkxOXP+B/d0Fp/zKViZoJmneZWe/05Y2aqSKj3YN2nLfYPJBQ87WEiY4BQCQ9hWGu9mPT1a1Q==",
+ "dependencies": [
+ "@jridgewell/trace-mapping",
+ "chokidar",
+ "fdir",
+ "picocolors",
+ "sade",
+ "svelte",
+ "typescript"
+ ],
+ "bin": true
+ },
"svelte-i18n@4.0.1_svelte@5.45.10__acorn@8.15.0": {
"integrity": "sha512-jaykGlGT5PUaaq04JWbJREvivlCnALtT+m87Kbm0fxyYHynkQaxQMnIKHLm2WeIuBRoljzwgyvz0Z6/CMwfdmQ==",
"dependencies": [
@@ -1518,6 +1541,10 @@
"type@2.7.3": {
"integrity": "sha512-8j+1QmAbPvLZow5Qpi6NCaN8FB60p/6x8/vfNqOk/hC+HuvFZhL4+WfekuhQLiqFZXOgQdrs3B+XxEmCc6b3FQ=="
},
+ "typescript@5.9.3": {
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "bin": true
+ },
"vite-node@2.1.9": {
"integrity": "sha512-AM9aQ/IPrW/6ENLQg3AGY4K1N2TGZdR5e4gu/MmmR2xR3Ll1+dib+nook92g4TV3PXVyeyxdWwtaCAiUL0hMxA==",
"dependencies": [
diff --git a/frontend/src/components/ui/Input.svelte b/frontend/src/components/ui/Input.svelte
index 9c4bb3e..4049a71 100644
--- a/frontend/src/components/ui/Input.svelte
+++ b/frontend/src/components/ui/Input.svelte
@@ -15,7 +15,8 @@
...rest
}: Props = $props()
- let inputId = id || `input-${Math.random().toString(36).slice(2, 9)}`
+ const fallbackId = `input-${Math.random().toString(36).slice(2, 9)}`
+ let inputId = $derived(id || fallbackId)
diff --git a/frontend/src/components/ui/Section.svelte b/frontend/src/components/ui/Section.svelte
index fad9878..205de4c 100644
--- a/frontend/src/components/ui/Section.svelte
+++ b/frontend/src/components/ui/Section.svelte
@@ -33,10 +33,6 @@
padding: var(--space-6);
}
- .section + .section {
- margin-top: var(--space-6);
- }
-
.section-danger {
background: var(--error-bg);
border: 1px solid var(--error-border);
diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts
index 7fafcee..3148d76 100644
--- a/frontend/src/lib/api.ts
+++ b/frontend/src/lib/api.ts
@@ -319,11 +319,11 @@ export const api = {
})
},
- async confirmChannelVerification(token: string, channel: string, code: string): Promise<{ success: boolean }> {
+ async confirmChannelVerification(token: string, channel: string, identifier: string, code: string): Promise<{ success: boolean }> {
return xrpc('com.tranquil.account.confirmChannelVerification', {
method: 'POST',
token,
- body: { channel, code },
+ body: { channel, identifier, code },
})
},
@@ -854,4 +854,31 @@ export const api = {
body: { did, recoveryToken, newPassword },
})
},
+
+ async verifyMigrationEmail(token: string, email: string): Promise<{ success: boolean; did: string }> {
+ return xrpc('com.atproto.server.verifyMigrationEmail', {
+ method: 'POST',
+ body: { token, email },
+ })
+ },
+
+ async resendMigrationVerification(email: string): Promise<{ sent: boolean }> {
+ return xrpc('com.atproto.server.resendMigrationVerification', {
+ method: 'POST',
+ body: { email },
+ })
+ },
+
+ async verifyToken(token: string, identifier: string, accessToken?: string): Promise<{
+ success: boolean
+ did: string
+ purpose: string
+ channel: string
+ }> {
+ return xrpc('com.tranquil.account.verifyToken', {
+ method: 'POST',
+ body: { token, identifier },
+ token: accessToken,
+ })
+ },
}
diff --git a/frontend/src/lib/registration/VerificationStep.svelte b/frontend/src/lib/registration/VerificationStep.svelte
index cde1afb..84981b3 100644
--- a/frontend/src/lib/registration/VerificationStep.svelte
+++ b/frontend/src/lib/registration/VerificationStep.svelte
@@ -70,13 +70,13 @@
id="verification-code"
type="text"
bind:value={verificationCode}
- placeholder="Enter 6-digit code"
+ placeholder="XXXX-XXXX-XXXX-XXXX"
disabled={flow.state.submitting}
required
- maxlength="6"
- inputmode="numeric"
autocomplete="one-time-code"
+ class="code-input"
/>
+ Copy the entire code from your message, including dashes.