diff --git a/README.md b/README.md index c1afbe0..ca89cd1 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ https://daisyui.com/components/button/ `cargo install sea-orm-cli@1.0.0-rc.5` -## 5. Install tailwindcss, for styling +## 6. Install tailwindcss, for styling `npm install -D tailwindcss` diff --git a/src/endpoints.rs b/src/endpoints.rs index a166646..549ff89 100644 --- a/src/endpoints.rs +++ b/src/endpoints.rs @@ -1,5 +1,6 @@ pub const REGISTER: &str = "/api/register"; pub const LOGIN: &str = "/api/login"; +pub const ADD_MATCH: &str = "/api/add-match"; // TODO -> remove once it's used #[cfg(engine)] pub const LOGIN_TEST: &str = "/api/login-test"; diff --git a/src/models/game_result.rs b/src/models/game_result.rs new file mode 100644 index 0000000..cd21c2f --- /dev/null +++ b/src/models/game_result.rs @@ -0,0 +1,10 @@ +use serde::{Deserialize, Serialize}; + +use crate::entity::sea_orm_active_enums::GameType; + +#[derive(Serialize, Deserialize, Clone)] +pub struct GameResult { + pub winner: String, + pub loser: String, + pub game_type: GameType, +} diff --git a/src/models/mod.rs b/src/models/mod.rs index bcb51d1..3c9e4cc 100644 --- a/src/models/mod.rs +++ b/src/models/mod.rs @@ -1,2 +1,3 @@ pub mod auth; +pub mod game_result; pub mod generic; diff --git a/src/server/mod.rs b/src/server/mod.rs index a3505e9..85f616b 100644 --- a/src/server/mod.rs +++ b/src/server/mod.rs @@ -1,3 +1,4 @@ pub mod auth; +pub mod pool; pub mod routes; pub mod server_state; diff --git a/src/server/pool/add_match.rs b/src/server/pool/add_match.rs new file mode 100644 index 0000000..38dae88 --- /dev/null +++ b/src/server/pool/add_match.rs @@ -0,0 +1,25 @@ +use crate::{ + // entity::{prelude::*, user}, + models::{game_result::GameResult, generic::GenericResponse}, + server::server_state::ServerState, +}; +use axum::{ + extract::{Json, State}, + http::StatusCode, +}; + +pub async fn post_game_result( + State(state): State, + Json(game_result): Json, +) -> (StatusCode, Result<(), Json>) { + ( + StatusCode::BAD_REQUEST, + Err(Json(GenericResponse { + status: "Oopsie we had a fucky wucky".to_owned(), + })), + ) + + // if (game_result.loser == "ferris"){ + // throw 406 "Not Acceptable; Ferris cannot lose" + // } +} diff --git a/src/server/pool/mod.rs b/src/server/pool/mod.rs new file mode 100644 index 0000000..a91e93b --- /dev/null +++ b/src/server/pool/mod.rs @@ -0,0 +1 @@ +pub mod add_match; diff --git a/src/server/routes.rs b/src/server/routes.rs index 16c52ea..d9feba1 100644 --- a/src/server/routes.rs +++ b/src/server/routes.rs @@ -1,5 +1,5 @@ // (Server only) Routes -use crate::endpoints::{FORGOT_PASSWORD, LOGIN, LOGIN_TEST, REGISTER}; +use crate::endpoints::{ADD_MATCH, FORGOT_PASSWORD, LOGIN, LOGIN_TEST, REGISTER}; use axum::routing::{post, Router}; use super::{ @@ -8,6 +8,7 @@ use super::{ login::{post_login_user, post_test_login}, register::post_register_user, }, + pool::add_match::post_game_result, server_state::ServerState, }; @@ -15,6 +16,7 @@ pub fn get_api_router(state: ServerState) -> Router { Router::new() .route(REGISTER, post(post_register_user)) .route(LOGIN, post(post_login_user)) + .route(ADD_MATCH, post(post_game_result)) .route(LOGIN_TEST, post(post_test_login)) .route(FORGOT_PASSWORD, post(post_forgot_password)) .with_state(state) diff --git a/src/templates/pool/add_game_form.rs b/src/templates/pool/add_game_form.rs index 0b74c2c..c2c7bb7 100644 --- a/src/templates/pool/add_game_form.rs +++ b/src/templates/pool/add_game_form.rs @@ -1,70 +1,80 @@ -use crate::{components::layout::Layout, state_enums::ContentState}; +use crate::{ + components::{layout::Layout, sub_components::error_block::ErrorBlock}, + state_enums::ContentState, +}; use perseus::prelude::*; use serde::{Deserialize, Serialize}; use sycamore::prelude::*; use web_sys::Event; +cfg_if::cfg_if! { + if #[cfg(client)] { + use crate::{ + endpoints::ADD_MATCH, + models::{game_result::GameResult, generic::GenericResponse}, + templates::get_api_path, + }; + + use crate::entity::sea_orm_active_enums::GameType; + use reqwest::StatusCode; + } +} + // Reactive page #[derive(Serialize, Deserialize, Clone, ReactiveState)] #[rx(alias = "PageStateRx")] struct PageState { winner: String, - new_user: String, + loser: String, + error: String, } fn add_game_form_page<'a, G: Html>(cx: BoundedScope<'_, 'a>, state: &'a PageStateRx) -> View { let handle_add_match = move |_event: Event| { #[cfg(client)] { - // state.winner.get().as_ref().clone() - spawn_local_scoped(cx, async move {}) - } - }; + let var_name = async move { + let game_result = GameResult { + winner: (*state.winner.get()).clone(), + loser: (*state.loser.get()).clone(), + game_type: GameType::Pool, + }; - let handle_add_user = move |_event: Event| { - #[cfg(client)] - { - // state.winner.get().as_ref().clone() - spawn_local_scoped(cx, async move {}) + let client = reqwest::Client::new(); + let response = client + .post(get_api_path(ADD_MATCH).as_str()) + .json(&game_result) + .send() + .await + .unwrap(); + + if response.status() != StatusCode::OK { + let response = response.json::().await.unwrap(); + state.error.set(response.status.to_string()); + return; + } + + // let response = response.json::<())>().await.unwrap(); + }; + let var_name = var_name; + spawn_local_scoped(cx, var_name) } }; view! { cx, Layout(content_state = ContentState::Pool) { - div (class = "flex flex-wrap") { - select { - option (value="red") - option (value="blue") - } - } - div (class = "flex flex-wrap") { - input (bind:value = state.winner, - class = "appearance-none block w-full bg-gray-200 text-gray-700 border \ - border-red-500 rounded py-3 px-4 mb-3 leading-tight focus:outline-none \ - focus:bg-white",) - } - div (class = "flex flex-wrap") { - button(on:click = handle_add_match, - class = "flex-shrink-0 bg-teal-500 hover:bg-teal-700 border-teal-500 \ - hover:border-teal-700 text-sm border-4 text-white py-1 px-2 rounded", - ) { - "Add result" - } - } - div (class = "flex flex-wrap") { - input (bind:value = state.new_user, - class = "appearance-none block w-full bg-gray-200 text-gray-700 border \ - border-red-500 rounded py-3 px-4 mb-3 leading-tight focus:outline-none \ - focus:bg-white",) - } - div (class = "flex flex-wrap") { - button(on:click = handle_add_user, - class = "flex-shrink-0 bg-teal-500 hover:bg-teal-700 border-teal-500 \ - hover:border-teal-700 text-sm border-4 text-white py-1 px-2 rounded", - ) { - "Add new user" - } + + ErrorBlock(error = state.error.clone()) + + div (class = "label") { span (class = "label-text") { "Winner" } } + input (bind:value = state.winner, class = "input input-bordered w-full m-2") + + div (class = "label") { span (class = "label-text") { "Loser" } } + input (bind:value = state.loser, class = "input input-bordered w-full m-2") + + div (class = "flex justify-center") { + button (on:click = handle_add_match, class="btn"){"Record Match"} } } } @@ -76,8 +86,9 @@ async fn get_request_state( _req: Request, ) -> Result> { Ok(PageState { - winner: "Ferris".to_owned(), - new_user: "newguy".to_owned(), + winner: String::new(), + loser: String::new(), + error: String::new(), }) } diff --git a/src/templates/user/mod.rs b/src/templates/user/mod.rs index e69de29..8b13789 100644 --- a/src/templates/user/mod.rs +++ b/src/templates/user/mod.rs @@ -0,0 +1 @@ +