use chrono::{Datelike, NaiveDate}; use rocket::{post, State}; use serde::{Deserialize, Serialize}; use crate::account::account::{generate_password, User}; use crate::error::Errors; use crate::nnid::pid_distribution::next_pid; use crate::Pool; use crate::xml::{Xml, YesNoVal}; #[derive(Deserialize)] pub struct Email{ address: Box } #[derive(Deserialize, Serialize)] pub struct Mii{ name: Box, primary: YesNoVal, data: Box, } #[derive(Deserialize)] #[serde(rename(serialize = "person"))] pub struct AccountCreationData{ birth_date: NaiveDate, user_id: Box, password: Box, country: Box, language: Box, tz_name: Box, email: Email, mii: Mii, gender: Box, marketing_flag: YesNoVal, off_device_flag: YesNoVal, region: i32 } #[derive(Serialize)] #[serde(rename(serialize = "person"))] pub struct AccountCreationResponseData{ pid: i32 } #[post("/v1/api/people", data="")] pub async fn create_account(database: &State, data: Xml) -> Result, Option>{ let database = database.inner(); // its fine to crash here if we cant get the next pid as that is in my opinion a dead state // anyways as noone can register anymore, EVER let pid = next_pid(database).await; let AccountCreationData { user_id, password, birth_date, tz_name, language, email: Email{ address }, mii: Mii{ data, .. }, marketing_flag, gender, region, country, off_device_flag, .. } = data.0; let password = generate_password(pid, &password).ok_or(None)?; sqlx::query!(" INSERT INTO users ( pid, username, password, birthdate, timezone, email, country, language, marketing_allowed, off_device_allowed, region, gender, mii_data ) VALUES ( $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13 ) ", pid, user_id.as_ref(), password, birth_date, tz_name.as_ref(), address.as_ref(), country.as_ref(), language.as_ref(), marketing_flag.0, off_device_flag.0, region, gender.as_ref(), data.as_ref() ).execute(database).await.unwrap(); Ok( Xml(AccountCreationResponseData{ pid }) ) } #[cfg(test)] mod test{ use chrono::NaiveDate; use crate::nnid::create_account::AccountCreationData; const TEST_XML: &str = " 1991-02-03 testtest [PASSWORD] DE en Europe/Berlin 2025-02-24T19:42:45 US https://account.spfn.cc/v1/api/content/agreements/Nintendo-Network-EULA/0300 NINTENDO-NETWORK-EULA 0300
tvnebel@gmail.com
N N Y N DEFAULT
y Y AwAAQDrPvmeBxJIQ3j+V8Ip4iCWDvgAAAEB5AAAAIABOAEEATQBFAAAAAAAAAEBAAAAhAQJoRBgm NEYUgRIXaA0AACkAUkhQAAAAAAAAAAAAAAAAAAAAAAAAAAAAANzO 1 2025-02-24T19:42:45 0 M 1309343744 N uuid_account 55fdbad0-f2ab-11ef-b648-010144cdca06 uuid_common 898ed052-5e25-11ef-b648-010144cdca06 persistent_id 8000001d transferable_id_base 0800000444cdca06 transferable_id_base_common 0640000444cdca06 N
"; #[test] fn test(){ let data: AccountCreationData = quick_xml::de::from_str(TEST_XML).unwrap(); assert_eq!(data.birth_date, NaiveDate::from_ymd_opt(1991,02,03).unwrap()); assert_eq!(data.user_id.as_ref(), "testtest"); } }