From 780b88eb2fa0cb0a746453de9c607685a2c5265e Mon Sep 17 00:00:00 2001 From: Paul Makles Date: Fri, 4 Feb 2022 14:57:10 +0000 Subject: [PATCH] feat(onboard): implement onboarding routes --- src/routes/onboard/complete.rs | 28 ++++++++++++++++++++++++---- src/routes/onboard/hello.rs | 7 +++++-- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/routes/onboard/complete.rs b/src/routes/onboard/complete.rs index d373544f..bc0fabef 100644 --- a/src/routes/onboard/complete.rs +++ b/src/routes/onboard/complete.rs @@ -1,9 +1,9 @@ -use revolt_quark::{EmptyResponse, Result}; +use revolt_quark::{EmptyResponse, Error, Result, models::User, Database}; use crate::util::regex::RE_USERNAME; use mongodb::bson::doc; use rauth::entities::Session; -use rocket::serde::json::Json; +use rocket::{serde::json::Json, State}; use serde::{Deserialize, Serialize}; use validator::Validate; @@ -14,6 +14,26 @@ pub struct Data { } #[post("/complete", data = "")] -pub async fn req(/*session: Session, user: Option,*/ data: Json) -> Result { - todo!() +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) } diff --git a/src/routes/onboard/hello.rs b/src/routes/onboard/hello.rs index 52f59f08..eba3235d 100644 --- a/src/routes/onboard/hello.rs +++ b/src/routes/onboard/hello.rs @@ -1,7 +1,10 @@ use rauth::entities::Session; +use revolt_quark::models::User; use rocket::serde::json::Value; #[get("/hello")] -pub async fn req(/*_session: Session, user: Option*/) -> Value { - todo!() +pub async fn req(_session: Session, user: Option) -> Value { + json!({ + "onboarding": user.is_none() + }) }