From 8f9d7b5bc5f18d06439dc0c86b8dfc548a42ea32 Mon Sep 17 00:00:00 2001 From: Ethan Girouard Date: Sun, 4 Feb 2024 21:22:49 -0500 Subject: [PATCH] Implement authentication on backend --- src/auth.rs | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 1 + 2 files changed, 66 insertions(+) create mode 100644 src/auth.rs diff --git a/src/auth.rs b/src/auth.rs new file mode 100644 index 0000000..1d702a3 --- /dev/null +++ b/src/auth.rs @@ -0,0 +1,65 @@ +use leptos::*; +use crate::models::NewUser; + +/// Create a new user and log them in +/// Takes in a NewUser struct, with the password in plaintext +/// Returns a Result with the error message if the user could not be created +#[server(endpoint = "signup")] +pub async fn signup(new_user: NewUser) -> Result<(), ServerFnError> { + use crate::users::create_user; + + use leptos_actix::extract; + use actix_web::{HttpMessage, HttpRequest}; + use actix_identity::Identity; + + create_user(&new_user).await + .map_err(|e| ServerFnError::ServerError(format!("Error creating user: {}", e)))?; + + extract(|request: HttpRequest| async move { + Identity::login(&request.extensions(), new_user.username.clone()) + }).await??; + + Ok(()) +} + +/// Log a user in +/// Takes in a username or email and a password in plaintext +/// Returns a Result with a boolean indicating if the login was successful +#[server(endpoint = "login")] +pub async fn login(username_or_email: String, password: String) -> Result { + use crate::users::validate_user; + use actix_web::{HttpMessage, HttpRequest}; + use actix_identity::Identity; + use leptos_actix::extract; + + let possible_user = validate_user(username_or_email, password).await + .map_err(|e| ServerFnError::ServerError(format!("Error validating user: {}", e)))?; + + let user = match possible_user { + Some(user) => user, + None => return Ok(false) + }; + + extract(|request: HttpRequest| async move { + Identity::login(&request.extensions(), user.username.clone()) + }).await??; + + Ok(true) +} + +/// Log a user out +/// Returns a Result with the error message if the user could not be logged out +#[server(endpoint = "logout")] +pub async fn logout() -> Result<(), ServerFnError> { + use leptos_actix::extract; + use actix_identity::Identity; + + extract(|user: Option| async move { + if let Some(user) = user { + user.logout(); + } + }).await?; + + Ok(()) +} + diff --git a/src/lib.rs b/src/lib.rs index ad311de..5eaf272 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,5 @@ pub mod app; +pub mod auth; pub mod songdata; pub mod playstatus; pub mod playbar;