use crate::util::regex::RE_USERNAME; use revolt_quark::{models::User, Database, EmptyResponse, Error, Result}; use rauth::entities::Session; use rocket::{serde::json::Json, State}; use serde::{Deserialize, Serialize}; use validator::Validate; /// # New User Data #[derive(Validate, Serialize, Deserialize, JsonSchema)] pub struct DataOnboard { /// New username which will be used to identify the user on the platform #[validate(length(min = 2, max = 32), regex = "RE_USERNAME")] username: String, } /// # Complete Onboarding /// /// This sets a new username, completes onboarding and allows a user to start using Revolt. #[openapi(tag = "Onboarding")] #[post("/complete", data = "")] pub async fn req( db: &State, session: Session, user: Option, data: Json, ) -> Result { if user.is_some() { return Err(Error::AlreadyOnboarded); } let data = data.into_inner(); data.validate() .map_err(|error| Error::FailedValidation { error })?; if db.is_username_taken(&data.username).await? { return Err(Error::UsernameTaken); } let user = User { id: session.user_id, username: data.username, ..Default::default() }; db.insert_user(&user).await.map(|_| EmptyResponse) }