From cf5dd20132c39fe91cd077f89f24f97ad6f740bc Mon Sep 17 00:00:00 2001 From: red binder Date: Sat, 6 Jun 2026 14:31:19 +0200 Subject: [PATCH] fix up routes and add email resending --- ...6c61aaef9395170430a58dcd7ac78f8cc75b2.json | 3 +- ...67ab8f7901a9612da8077b87a7b8533b0dfcb.json | 52 ++++++ ...c1c262351465b6f102e98912f67442a1f54d9.json | 3 +- ...604095f71324011e7093ec37af15da8c158f4.json | 48 +++++- ...3087943e5816a98cdce151302055c58bd1183.json | 16 +- ...ce0b98ea2c7de03e71ac704c3ba047162c0b2.json | 16 +- ...b3d302d083ec5333f3a5ce04113c38a041100.json | 152 +++++++++++++++--- ...59bf11353f28c25e4f81268e9379b5b2cb375.json | 22 --- ...64a272a0d3ac9e929e70b399582fa3f14166d.json | 40 ++++- ...52257c0ef596eee2d9a0e6a7d0aad03de4421.json | 152 +++++++++++++++--- ...66fc2a97ac6e25a9733d1d20faf555c67abe1.json | 48 +++++- ...6ba3c9d2458d6bad32b9aac7deb718969dc07.json | 8 +- ...c3bbd90d4bcf92d20203cba5afb2664f4bb8a.json | 8 +- ...d15f9e4bafdfca12d2130a873d44a88dd435b.json | 3 +- ...00dd589cdd9cd0ac91c27edf3f79ba4174a18.json | 32 +++- ...e47d6180ff634ebf59f3a1efd92b797170ac2.json | 16 +- ...17f12ffeeb26a5eabca323abfed0e1d7bcbea.json | 16 +- ...34fc0813fc29bafac7351d817e48cfb74f4a3.json | 24 ++- src/main.rs | 5 +- src/nnid/{mapped_ids.rs => admin.rs} | 0 src/nnid/mod.rs | 2 +- src/nnid/support.rs | 57 ++++++- 22 files changed, 622 insertions(+), 101 deletions(-) create mode 100644 .sqlx/query-1ceb8af3151c013c341d9c0cafe67ab8f7901a9612da8077b87a7b8533b0dfcb.json delete mode 100644 .sqlx/query-6c1df0b05553305ba847f571a5859bf11353f28c25e4f81268e9379b5b2cb375.json rename src/nnid/{mapped_ids.rs => admin.rs} (100%) diff --git a/.sqlx/query-08c4a5721982ecd267ebc515b866c61aaef9395170430a58dcd7ac78f8cc75b2.json b/.sqlx/query-08c4a5721982ecd267ebc515b866c61aaef9395170430a58dcd7ac78f8cc75b2.json index 529604f..e536be9 100644 --- a/.sqlx/query-08c4a5721982ecd267ebc515b866c61aaef9395170430a58dcd7ac78f8cc75b2.json +++ b/.sqlx/query-08c4a5721982ecd267ebc515b866c61aaef9395170430a58dcd7ac78f8cc75b2.json @@ -6,7 +6,8 @@ { "ordinal": 0, "name": "exists", - "type_info": "Bool" + "type_info": "Bool", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-1ceb8af3151c013c341d9c0cafe67ab8f7901a9612da8077b87a7b8533b0dfcb.json b/.sqlx/query-1ceb8af3151c013c341d9c0cafe67ab8f7901a9612da8077b87a7b8533b0dfcb.json new file mode 100644 index 0000000..7aaa263 --- /dev/null +++ b/.sqlx/query-1ceb8af3151c013c341d9c0cafe67ab8f7901a9612da8077b87a7b8533b0dfcb.json @@ -0,0 +1,52 @@ +{ + "db_name": "PostgreSQL", + "query": "SELECT username, verification_code, email FROM users WHERE pid = $1", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "username", + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } + }, + { + "ordinal": 1, + "name": "verification_code", + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "verification_code" + } + } + }, + { + "ordinal": 2, + "name": "email", + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "email" + } + } + } + ], + "parameters": { + "Left": [ + "Int4" + ] + }, + "nullable": [ + false, + false, + false + ] + }, + "hash": "1ceb8af3151c013c341d9c0cafe67ab8f7901a9612da8077b87a7b8533b0dfcb" +} diff --git a/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json b/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json index 99a26f0..9607895 100644 --- a/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json +++ b/.sqlx/query-3c9b1695f8ae49e4308c048de98c1c262351465b6f102e98912f67442a1f54d9.json @@ -6,7 +6,8 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int8" + "type_info": "Int8", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json b/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json index b2783d7..88cc28a 100644 --- a/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json +++ b/.sqlx/query-48710e0b87742cc3fef816b3c95604095f71324011e7093ec37af15da8c158f4.json @@ -6,32 +6,68 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "tokens", + "name": "pid" + } + } }, { "ordinal": 1, "name": "token_id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "tokens", + "name": "token_id" + } + } }, { "ordinal": 2, "name": "token_type", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "tokens", + "name": "token_type" + } + } }, { "ordinal": 3, "name": "random", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "tokens", + "name": "random" + } + } }, { "ordinal": 4, "name": "title_id", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "tokens", + "name": "title_id" + } + } }, { "ordinal": 5, "name": "expires", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "tokens", + "name": "expires" + } + } } ], "parameters": { diff --git a/.sqlx/query-566221b869f293e6c721e2e8bbf3087943e5816a98cdce151302055c58bd1183.json b/.sqlx/query-566221b869f293e6c721e2e8bbf3087943e5816a98cdce151302055c58bd1183.json index 409a9b7..c299cab 100644 --- a/.sqlx/query-566221b869f293e6c721e2e8bbf3087943e5816a98cdce151302055c58bd1183.json +++ b/.sqlx/query-566221b869f293e6c721e2e8bbf3087943e5816a98cdce151302055c58bd1183.json @@ -6,12 +6,24 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "pid" + } + } }, { "ordinal": 1, "name": "username", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } } ], "parameters": { diff --git a/.sqlx/query-5bd26d4c9e701bde77ce598fea2ce0b98ea2c7de03e71ac704c3ba047162c0b2.json b/.sqlx/query-5bd26d4c9e701bde77ce598fea2ce0b98ea2c7de03e71ac704c3ba047162c0b2.json index 56b26e0..c60c80d 100644 --- a/.sqlx/query-5bd26d4c9e701bde77ce598fea2ce0b98ea2c7de03e71ac704c3ba047162c0b2.json +++ b/.sqlx/query-5bd26d4c9e701bde77ce598fea2ce0b98ea2c7de03e71ac704c3ba047162c0b2.json @@ -6,12 +6,24 @@ { "ordinal": 0, "name": "address", - "type_info": "Inet" + "type_info": "Inet", + "origin": { + "Table": { + "table": "nex_servers", + "name": "address" + } + } }, { "ordinal": 1, "name": "port", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "nex_servers", + "name": "port" + } + } } ], "parameters": { diff --git a/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json b/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json index 7997697..3604678 100644 --- a/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json +++ b/.sqlx/query-606364c79e0990deb07dfbe6c32b3d302d083ec5333f3a5ce04113c38a041100.json @@ -6,97 +6,211 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "pid" + } + } }, { "ordinal": 1, "name": "username", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } }, { "ordinal": 2, "name": "password", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "password" + } + } }, { "ordinal": 3, "name": "birthdate", - "type_info": "Date" + "type_info": "Date", + "origin": { + "Table": { + "table": "users", + "name": "birthdate" + } + } }, { "ordinal": 4, "name": "timezone", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "timezone" + } + } }, { "ordinal": 5, "name": "email", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "email" + } + } }, { "ordinal": 6, "name": "email_verified_since", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "users", + "name": "email_verified_since" + } + } }, { "ordinal": 7, "name": "country", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "country" + } + } }, { "ordinal": 8, "name": "language", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "language" + } + } }, { "ordinal": 9, "name": "gender", - "type_info": "Bpchar" + "type_info": "Bpchar", + "origin": { + "Table": { + "table": "users", + "name": "gender" + } + } }, { "ordinal": 10, "name": "marketing_allowed", - "type_info": "Bool" + "type_info": "Bool", + "origin": { + "Table": { + "table": "users", + "name": "marketing_allowed" + } + } }, { "ordinal": 11, "name": "off_device_allowed", - "type_info": "Bool" + "type_info": "Bool", + "origin": { + "Table": { + "table": "users", + "name": "off_device_allowed" + } + } }, { "ordinal": 12, "name": "region", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "region" + } + } }, { "ordinal": 13, "name": "mii_data", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "mii_data" + } + } }, { "ordinal": 14, "name": "account_level", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "account_level" + } + } }, { "ordinal": 15, "name": "creation_date", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "users", + "name": "creation_date" + } + } }, { "ordinal": 16, "name": "updated", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "users", + "name": "updated" + } + } }, { "ordinal": 17, "name": "nex_password", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "nex_password" + } + } }, { "ordinal": 18, "name": "verification_code", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "verification_code" + } + } } ], "parameters": { diff --git a/.sqlx/query-6c1df0b05553305ba847f571a5859bf11353f28c25e4f81268e9379b5b2cb375.json b/.sqlx/query-6c1df0b05553305ba847f571a5859bf11353f28c25e4f81268e9379b5b2cb375.json deleted file mode 100644 index f449706..0000000 --- a/.sqlx/query-6c1df0b05553305ba847f571a5859bf11353f28c25e4f81268e9379b5b2cb375.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "select nex_password from users where pid = $1", - "describe": { - "columns": [ - { - "ordinal": 0, - "name": "nex_password", - "type_info": "Varchar" - } - ], - "parameters": { - "Left": [ - "Int4" - ] - }, - "nullable": [ - false - ] - }, - "hash": "6c1df0b05553305ba847f571a5859bf11353f28c25e4f81268e9379b5b2cb375" -} diff --git a/.sqlx/query-6de07eba2f12b15f541d129b83664a272a0d3ac9e929e70b399582fa3f14166d.json b/.sqlx/query-6de07eba2f12b15f541d129b83664a272a0d3ac9e929e70b399582fa3f14166d.json index 6427fb0..c6f3eb8 100644 --- a/.sqlx/query-6de07eba2f12b15f541d129b83664a272a0d3ac9e929e70b399582fa3f14166d.json +++ b/.sqlx/query-6de07eba2f12b15f541d129b83664a272a0d3ac9e929e70b399582fa3f14166d.json @@ -6,27 +6,57 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "pid" + } + } }, { "ordinal": 1, "name": "username", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } }, { "ordinal": 2, "name": "account_level", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "account_level" + } + } }, { "ordinal": 3, "name": "nex_password", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "nex_password" + } + } }, { "ordinal": 4, "name": "mii_data", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "mii_data" + } + } } ], "parameters": { diff --git a/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json b/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json index 4e1b2d6..c06bdc6 100644 --- a/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json +++ b/.sqlx/query-93960465bbf8f670891d49b95fc52257c0ef596eee2d9a0e6a7d0aad03de4421.json @@ -6,97 +6,211 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "pid" + } + } }, { "ordinal": 1, "name": "username", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } }, { "ordinal": 2, "name": "password", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "password" + } + } }, { "ordinal": 3, "name": "birthdate", - "type_info": "Date" + "type_info": "Date", + "origin": { + "Table": { + "table": "users", + "name": "birthdate" + } + } }, { "ordinal": 4, "name": "timezone", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "timezone" + } + } }, { "ordinal": 5, "name": "email", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "email" + } + } }, { "ordinal": 6, "name": "email_verified_since", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "users", + "name": "email_verified_since" + } + } }, { "ordinal": 7, "name": "country", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "country" + } + } }, { "ordinal": 8, "name": "language", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "language" + } + } }, { "ordinal": 9, "name": "gender", - "type_info": "Bpchar" + "type_info": "Bpchar", + "origin": { + "Table": { + "table": "users", + "name": "gender" + } + } }, { "ordinal": 10, "name": "marketing_allowed", - "type_info": "Bool" + "type_info": "Bool", + "origin": { + "Table": { + "table": "users", + "name": "marketing_allowed" + } + } }, { "ordinal": 11, "name": "off_device_allowed", - "type_info": "Bool" + "type_info": "Bool", + "origin": { + "Table": { + "table": "users", + "name": "off_device_allowed" + } + } }, { "ordinal": 12, "name": "region", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "region" + } + } }, { "ordinal": 13, "name": "mii_data", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "mii_data" + } + } }, { "ordinal": 14, "name": "account_level", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "account_level" + } + } }, { "ordinal": 15, "name": "creation_date", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "users", + "name": "creation_date" + } + } }, { "ordinal": 16, "name": "updated", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "users", + "name": "updated" + } + } }, { "ordinal": 17, "name": "nex_password", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "nex_password" + } + } }, { "ordinal": 18, "name": "verification_code", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "verification_code" + } + } } ], "parameters": { diff --git a/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json b/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json index ac04967..b5366a8 100644 --- a/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json +++ b/.sqlx/query-9d3cee43a86cead9a6d078abc1266fc2a97ac6e25a9733d1d20faf555c67abe1.json @@ -6,32 +6,68 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "tokens", + "name": "pid" + } + } }, { "ordinal": 1, "name": "token_id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "tokens", + "name": "token_id" + } + } }, { "ordinal": 2, "name": "token_type", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "tokens", + "name": "token_type" + } + } }, { "ordinal": 3, "name": "random", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "tokens", + "name": "random" + } + } }, { "ordinal": 4, "name": "title_id", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "tokens", + "name": "title_id" + } + } }, { "ordinal": 5, "name": "expires", - "type_info": "Timestamp" + "type_info": "Timestamp", + "origin": { + "Table": { + "table": "tokens", + "name": "expires" + } + } } ], "parameters": { diff --git a/.sqlx/query-a79a3023d5b42b16304a48d36066ba3c9d2458d6bad32b9aac7deb718969dc07.json b/.sqlx/query-a79a3023d5b42b16304a48d36066ba3c9d2458d6bad32b9aac7deb718969dc07.json index bf4a31e..fea141d 100644 --- a/.sqlx/query-a79a3023d5b42b16304a48d36066ba3c9d2458d6bad32b9aac7deb718969dc07.json +++ b/.sqlx/query-a79a3023d5b42b16304a48d36066ba3c9d2458d6bad32b9aac7deb718969dc07.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "mii_data", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "mii_data" + } + } } ], "parameters": { diff --git a/.sqlx/query-b16ba4b6c1b7d1c207e94515268c3bbd90d4bcf92d20203cba5afb2664f4bb8a.json b/.sqlx/query-b16ba4b6c1b7d1c207e94515268c3bbd90d4bcf92d20203cba5afb2664f4bb8a.json index 51b76ad..7eca068 100644 --- a/.sqlx/query-b16ba4b6c1b7d1c207e94515268c3bbd90d4bcf92d20203cba5afb2664f4bb8a.json +++ b/.sqlx/query-b16ba4b6c1b7d1c207e94515268c3bbd90d4bcf92d20203cba5afb2664f4bb8a.json @@ -6,7 +6,13 @@ { "ordinal": 0, "name": "verification_code", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "verification_code" + } + } } ], "parameters": { diff --git a/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json b/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json index da6f233..103f7d7 100644 --- a/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json +++ b/.sqlx/query-c8d50662530cac49c4261fb321cd15f9e4bafdfca12d2130a873d44a88dd435b.json @@ -6,7 +6,8 @@ { "ordinal": 0, "name": "exists", - "type_info": "Bool" + "type_info": "Bool", + "origin": "Expression" } ], "parameters": { diff --git a/.sqlx/query-d8a0ba20ad0db4ba8821964944b00dd589cdd9cd0ac91c27edf3f79ba4174a18.json b/.sqlx/query-d8a0ba20ad0db4ba8821964944b00dd589cdd9cd0ac91c27edf3f79ba4174a18.json index 5522410..54b3fbe 100644 --- a/.sqlx/query-d8a0ba20ad0db4ba8821964944b00dd589cdd9cd0ac91c27edf3f79ba4174a18.json +++ b/.sqlx/query-d8a0ba20ad0db4ba8821964944b00dd589cdd9cd0ac91c27edf3f79ba4174a18.json @@ -6,22 +6,46 @@ { "ordinal": 0, "name": "username", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } }, { "ordinal": 1, "name": "account_level", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "account_level" + } + } }, { "ordinal": 2, "name": "nex_password", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "nex_password" + } + } }, { "ordinal": 3, "name": "mii_data", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "mii_data" + } + } } ], "parameters": { diff --git a/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json b/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json index 7c1cae0..c190306 100644 --- a/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json +++ b/.sqlx/query-e5a2f7f28c3d7b9524d3dce48a9e47d6180ff634ebf59f3a1efd92b797170ac2.json @@ -6,12 +6,24 @@ { "ordinal": 0, "name": "token_id", - "type_info": "Int8" + "type_info": "Int8", + "origin": { + "Table": { + "table": "tokens", + "name": "token_id" + } + } }, { "ordinal": 1, "name": "random", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "tokens", + "name": "random" + } + } } ], "parameters": { diff --git a/.sqlx/query-eafa97669e8ec04f1dc0a8e05d417f12ffeeb26a5eabca323abfed0e1d7bcbea.json b/.sqlx/query-eafa97669e8ec04f1dc0a8e05d417f12ffeeb26a5eabca323abfed0e1d7bcbea.json index fe69d0a..f8d50b2 100644 --- a/.sqlx/query-eafa97669e8ec04f1dc0a8e05d417f12ffeeb26a5eabca323abfed0e1d7bcbea.json +++ b/.sqlx/query-eafa97669e8ec04f1dc0a8e05d417f12ffeeb26a5eabca323abfed0e1d7bcbea.json @@ -6,12 +6,24 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "pid" + } + } }, { "ordinal": 1, "name": "username", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } } ], "parameters": { diff --git a/.sqlx/query-f34fe108f879e6ebc0c6a7e5f7a34fc0813fc29bafac7351d817e48cfb74f4a3.json b/.sqlx/query-f34fe108f879e6ebc0c6a7e5f7a34fc0813fc29bafac7351d817e48cfb74f4a3.json index 84d6edc..99fd8e9 100644 --- a/.sqlx/query-f34fe108f879e6ebc0c6a7e5f7a34fc0813fc29bafac7351d817e48cfb74f4a3.json +++ b/.sqlx/query-f34fe108f879e6ebc0c6a7e5f7a34fc0813fc29bafac7351d817e48cfb74f4a3.json @@ -6,17 +6,35 @@ { "ordinal": 0, "name": "pid", - "type_info": "Int4" + "type_info": "Int4", + "origin": { + "Table": { + "table": "users", + "name": "pid" + } + } }, { "ordinal": 1, "name": "username", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "username" + } + } }, { "ordinal": 2, "name": "mii_data", - "type_info": "Varchar" + "type_info": "Varchar", + "origin": { + "Table": { + "table": "users", + "name": "mii_data" + } + } } ], "parameters": { diff --git a/src/main.rs b/src/main.rs index c6bf40f..7257e32 100644 --- a/src/main.rs +++ b/src/main.rs @@ -100,6 +100,7 @@ async fn launch() -> _ { nnid::person_exists::person_exists, nnid::support::validate, nnid::support::verify_email, + nnid::support::resend_email, nnid::people::create_account, nnid::people::get_own_profile, nnid::people::get_device_owner, @@ -109,8 +110,8 @@ async fn launch() -> _ { nnid::oauth::generate_token::generate_token, nnid::provider::get_nex_token, nnid::provider::get_service_token, - nnid::mapped_ids::mapped_ids, - nnid::mapped_ids::get_time, + nnid::admin::mapped_ids, + nnid::admin::get_time, json_api::oauth::generate_token::generate_token, json_api::users::profile::get_own_profile, json_api::users::mii::get_mii_data_by_pid, diff --git a/src/nnid/mapped_ids.rs b/src/nnid/admin.rs similarity index 100% rename from src/nnid/mapped_ids.rs rename to src/nnid/admin.rs diff --git a/src/nnid/mod.rs b/src/nnid/mod.rs index 7fa3e4d..4ce74a8 100644 --- a/src/nnid/mod.rs +++ b/src/nnid/mod.rs @@ -6,6 +6,6 @@ pub mod oauth; mod pid_distribution; pub mod people; pub mod provider; -pub mod mapped_ids; +pub mod admin; pub mod support; pub mod miis; diff --git a/src/nnid/support.rs b/src/nnid/support.rs index cd81a49..715ca1c 100644 --- a/src/nnid/support.rs +++ b/src/nnid/support.rs @@ -3,7 +3,9 @@ use crate::error::{Error, Errors}; use chrono::Utc; use hickory_resolver::TokioAsyncResolver; use rocket::form::Form; -use rocket::{FromForm, State, post, put}; +use rocket::{FromForm, State, post, put, get, Request}; +use rocket::request::{self, FromRequest}; +use rocket::http::Status; const BAD_CODE_ERROR: Errors = Errors { error: &[Error { @@ -17,6 +19,25 @@ pub struct ValidateEmailInput { email: String, } +// sorry maple i really tried and couldn't find a better way +pub struct EmailPid(pub i32); + +#[rocket::async_trait] +impl<'r> FromRequest<'r> for EmailPid { + type Error = Errors<'static>; + + async fn from_request(req: &'r Request<'_>) -> request::Outcome { + match req.headers().get_one("x-nintendo-pid") { + Some(val) => match val.parse::() { + Ok(parsed_id) => request::Outcome::Success(EmailPid(parsed_id)), + Err(_) => request::Outcome::Error((Status::BadRequest, BAD_CODE_ERROR)), + }, + None => request::Outcome::Error((Status::BadRequest, BAD_CODE_ERROR)), + } + } +} +// i was tired at 1 am ok have mercy + #[post("/v1/api/support/validate/email", data = "")] pub async fn validate( data: Form, @@ -106,3 +127,37 @@ pub async fn verify_email( Err(BAD_CODE_ERROR) } + +#[get("/v1/api/support/resend_confirmation")] +pub async fn resend_email( + database: &State, + pid: EmailPid, +) -> Result<(), Errors<'static>> { + + let pid = pid.0; + + let user_data = sqlx::query!( + "SELECT username, verification_code, email FROM users WHERE pid = $1", + pid + ) + .fetch_optional(&**database) + .await + .map_err(|e| { + eprintln!("{}", e); + BAD_CODE_ERROR + })?; + + let user = match user_data { + Some(row) => row, + None => return Err(BAD_CODE_ERROR), + }; + + crate::email::send_verification_email(&user.email, user.verification_code, &user.username) + .await + .map_err(|e| { + eprintln!("Failed to send email: {}", e); + BAD_CODE_ERROR + })?; + + Ok(()) +} \ No newline at end of file