From 89a71c7fcd0762909a53331e1c016bc811738a24 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Fri, 12 Jan 2024 16:48:24 +0100 Subject: [PATCH] register working based on leptos example --- src/backend/api/user.rs | 4 +- src/backend/mod.rs | 4 +- src/common/mod.rs | 2 +- src/frontend/api.rs | 20 ++----- src/frontend/app.rs | 30 ++++++++--- src/frontend/components/credentials.rs | 75 ++++++++++++++++++++++++++ src/frontend/components/mod.rs | 2 + src/frontend/{ => components}/nav.rs | 1 + src/frontend/login.rs | 52 ------------------ src/frontend/mod.rs | 5 +- src/frontend/{ => pages}/article.rs | 0 src/frontend/pages/login.rs | 51 ++++++++++++++++++ src/frontend/pages/mod.rs | 21 ++++++++ src/frontend/pages/register.rs | 59 ++++++++++++++++++++ tests/common.rs | 2 +- 15 files changed, 246 insertions(+), 82 deletions(-) create mode 100644 src/frontend/components/credentials.rs create mode 100644 src/frontend/components/mod.rs rename src/frontend/{ => components}/nav.rs (84%) delete mode 100644 src/frontend/login.rs rename src/frontend/{ => pages}/article.rs (100%) create mode 100644 src/frontend/pages/login.rs create mode 100644 src/frontend/pages/mod.rs create mode 100644 src/frontend/pages/register.rs diff --git a/src/backend/api/user.rs b/src/backend/api/user.rs index 6d6994e..1fdf50a 100644 --- a/src/backend/api/user.rs +++ b/src/backend/api/user.rs @@ -1,6 +1,7 @@ use crate::backend::database::user::{DbLocalUser, DbPerson, LocalUserView}; -use crate::backend::database::{MyDataHandle, read_jwt_secret}; +use crate::backend::database::{read_jwt_secret, MyDataHandle}; use crate::backend::error::MyResult; +use crate::common::{LoginResponse, LoginUserData, RegisterUserData}; use activitypub_federation::config::Data; use anyhow::anyhow; use axum::{Form, Json}; @@ -12,7 +13,6 @@ use jsonwebtoken::Validation; use jsonwebtoken::{decode, get_current_timestamp}; use jsonwebtoken::{encode, EncodingKey, Header}; use serde::{Deserialize, Serialize}; -use crate::common::{LoginResponse, LoginUserData, RegisterUserData}; #[derive(Debug, Serialize, Deserialize)] struct Claims { diff --git a/src/backend/mod.rs b/src/backend/mod.rs index 0e75718..d0949bc 100644 --- a/src/backend/mod.rs +++ b/src/backend/mod.rs @@ -96,11 +96,11 @@ pub async fn start(hostname: &str, database_url: &str) -> MyResult<()> { .nest_service("/assets", ServeDir::new("assets")) .nest_service( "/pkg/ibis.js", - ServeFile::new_with_mime("dist/ibis.js", &"application/javascript".parse()?), + ServeFile::new_with_mime("assets/dist/ibis.js", &"application/javascript".parse()?), ) .nest_service( "/pkg/ibis_bg.wasm", - ServeFile::new_with_mime("dist/ibis_bg.wasm", &"application/wasm".parse()?), + ServeFile::new_with_mime("assets/dist/ibis_bg.wasm", &"application/wasm".parse()?), ) .nest("", federation_routes()) .nest("/api/v1", api_routes()) diff --git a/src/common/mod.rs b/src/common/mod.rs index 20d9100..8022273 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -61,7 +61,7 @@ pub struct RegisterUserData { pub password: String, } -#[derive(Deserialize, Serialize)] +#[derive(Deserialize, Serialize, Clone)] pub struct LoginResponse { pub jwt: String, } diff --git a/src/frontend/api.rs b/src/frontend/api.rs index fbc1892..a9b9d16 100644 --- a/src/frontend/api.rs +++ b/src/frontend/api.rs @@ -1,10 +1,10 @@ -use crate::common::{ArticleView, LoginResponse, LoginUserData, RegisterUserData}; use crate::common::GetArticleData; +use crate::common::{ArticleView, LoginResponse, LoginUserData, RegisterUserData}; +use crate::frontend::error::MyResult; use anyhow::anyhow; use once_cell::sync::Lazy; use reqwest::{Client, RequestBuilder}; use serde::{Deserialize, Serialize}; -use crate::frontend::error::MyResult; pub static CLIENT: Lazy = Lazy::new(Client::new); @@ -33,30 +33,20 @@ where let status = res.status(); let text = res.text().await?; if status == reqwest::StatusCode::OK { - Ok(serde_json::from_str(&text) - .map_err(|e| anyhow!("Json error on {text}: {e}")) - ?) + Ok(serde_json::from_str(&text).map_err(|e| anyhow!("Json error on {text}: {e}"))?) } else { Err(anyhow!("API error: {text}").into()) } } -pub async fn register(hostname: &str, username: &str, password: &str) -> MyResult { - let register_form = RegisterUserData { - username: username.to_string(), - password: password.to_string(), - }; +pub async fn register(hostname: &str, register_form: RegisterUserData) -> MyResult { let req = CLIENT .post(format!("http://{}/api/v1/user/register", hostname)) .form(®ister_form); handle_json_res(req).await } -pub async fn login( - hostname: &str, - username: &str, - password: &str, -) -> MyResult { +pub async fn login(hostname: &str, username: &str, password: &str) -> MyResult { let login_form = LoginUserData { username: username.to_string(), password: password.to_string(), diff --git a/src/frontend/app.rs b/src/frontend/app.rs index 39767d9..3fcdeb7 100644 --- a/src/frontend/app.rs +++ b/src/frontend/app.rs @@ -1,16 +1,33 @@ -use crate::frontend::article::Article; -use crate::frontend::login::Login; -use crate::frontend::nav::Nav; -use leptos::{component, view, IntoView}; +use crate::frontend::components::nav::Nav; +use crate::frontend::pages::article::Article; +use crate::frontend::pages::login::Login; +use crate::frontend::pages::register::Register; +use crate::frontend::pages::Page; +use leptos::{component, provide_context, use_context, view, IntoView}; use leptos_meta::provide_meta_context; use leptos_meta::*; use leptos_router::Route; use leptos_router::Router; use leptos_router::Routes; +// TODO: change to GlobalState and also store auth token here +// https://book.leptos.dev/15_global_state.html +#[derive(Clone)] +pub struct BackendHostname(String); + +impl BackendHostname { + pub fn read() -> String { + use_context::() + .expect("backend hostname is provided") + .0 + } +} + #[component] pub fn App() -> impl IntoView { provide_meta_context(); + let backend_hostname = BackendHostname("localhost:8080".to_string()); + provide_context(backend_hostname); view! { <> @@ -19,8 +36,9 @@ pub fn App() -> impl IntoView {