diff options
author | Tyler Murphy <tylermurphy534@gmail.com> | 2023-01-26 17:29:16 -0500 |
---|---|---|
committer | Tyler Murphy <tylermurphy534@gmail.com> | 2023-01-26 17:29:16 -0500 |
commit | 88209d88236c3d865a9f5174a0dced31920859bf (patch) | |
tree | 89a9985927393005cf632950b585a6a227b1c679 /src/api/auth.rs | |
download | xssbook-88209d88236c3d865a9f5174a0dced31920859bf.tar.gz xssbook-88209d88236c3d865a9f5174a0dced31920859bf.tar.bz2 xssbook-88209d88236c3d865a9f5174a0dced31920859bf.zip |
i did things
Diffstat (limited to 'src/api/auth.rs')
-rw-r--r-- | src/api/auth.rs | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/src/api/auth.rs b/src/api/auth.rs new file mode 100644 index 0000000..d60483f --- /dev/null +++ b/src/api/auth.rs @@ -0,0 +1,98 @@ +use axum::{Router, routing::post, response::Response}; +use serde::Deserialize; +use time::{OffsetDateTime, Duration}; +use tower_cookies::{Cookies, Cookie}; + +use crate::types::{user::User, response::ResponseCode, session::Session, extract::{Json, AuthorizedUser}}; + +#[derive(Deserialize)] +struct RegistrationRequet { + firstname: String, + lastname: String, + email: String, + password: String, + gender: String, + day: u8, + month: u8, + year: u32 +} + + +async fn register(cookies: Cookies, Json(body): Json<RegistrationRequet>) -> Response { + + let user = match User::new(body.firstname, body.lastname, body.email, body.password, body.gender, body.day, body.month, body.year) { + Ok(user) => user, + Err(err) => return err + }; + + let session = match Session::new(user.user_id) { + Ok(session) => session, + Err(err) => return err + }; + + let mut now = OffsetDateTime::now_utc(); + now += Duration::weeks(52); + + let mut cookie = Cookie::new("auth", session.token); + cookie.set_secure(false); + cookie.set_http_only(false); + cookie.set_expires(now); + cookie.set_path("/"); + + cookies.add(cookie); + + ResponseCode::Created.msg("Successfully created new user") +} + +#[derive(Deserialize)] +struct LoginRequest { + email: String, + password: String, +} + +async fn login(cookies: Cookies, Json(body): Json<LoginRequest>) -> Response { + + let Ok(user) = User::from_email(&body.email) else { + return ResponseCode::BadRequest.msg("Email is not registered") + }; + + if user.password != body.password { + return ResponseCode::BadRequest.msg("Password is not correct") + } + + let session = match Session::new(user.user_id) { + Ok(session) => session, + Err(err) => return err + }; + + let mut now = OffsetDateTime::now_utc(); + now += Duration::weeks(52); + + let mut cookie = Cookie::new("auth", session.token); + cookie.set_secure(false); + cookie.set_http_only(false); + cookie.set_expires(now); + cookie.set_path("/"); + + cookies.add(cookie); + + ResponseCode::Success.msg("Successfully logged in") +} + +async fn logout(cookies: Cookies, AuthorizedUser(user): AuthorizedUser) -> Response { + + cookies.remove(Cookie::new("auth", "")); + + if let Err(err) = Session::delete(user.user_id) { + return err + } + + ResponseCode::Success.msg("Successfully logged out") +} + +pub fn router() -> Router { + Router::new() + .route("/register", post(register)) + .route("/login", post(login)) + .route("/logout", post(logout)) +}
\ No newline at end of file |