use chrono::NaiveDate; use rocket::{post, State}; use serde::{Deserialize, Serialize}; use crate::account::account::{generate_password, User}; use crate::error::Errors; use crate::Pool; use crate::xml::{Xml, YesNoVal}; #[derive(Deserialize)] struct Email{ address: Box } #[derive(Deserialize, Serialize)] struct Mii{ name: Box, primary: YesNoVal, data: Box, } #[derive(Deserialize)] #[serde(rename(serialize = "person"))] struct AccountCreationData{ birth_date: NaiveDate, user_id: Box, password: Box, country: Box, language: Box, tz_name: Box, email: Email, gender: Box, marketing_flag: YesNoVal, region: i32 } #[derive(Serialize)] #[serde(rename(serialize = "person"))] struct AccountCreationResponseData{ pid: i32 } #[post("/v1/api/people", data="")] async fn create_account(database: &State, data: Xml) -> Result, Errors>{ let database = database.inner(); let AccountCreationData { user_id, password, birth_date, tz_name, language, email: Email{ address }, marketing_flag, gender, region, country, .. } = *data; let new_account = sqlx::query(" INSERT INTO users.users ( pid, username, password, birthdate, birthdate, timezone, email, country, language, marketing_allowed, off_device_allowed, region, mii_data ) VALUES ( ?,?,?,?,?,?,?,?,?,? ) "); let pid = connection.transaction::<_, diesel::result::Error, _>(|conn| Box::pin(async move{ use crate::schema::users::dsl::*; diesel::insert_into(users) .values(&new_account) .returning(User::as_returning()) .get_result(conn) .await?; Ok(()) })).await; } #[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"); } }