Compare commits
2 Commits
ft/integra
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| ed0c107a80 | |||
| f319f41835 |
@@ -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`
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
10
src/models/game_result.rs
Normal file
10
src/models/game_result.rs
Normal file
@@ -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,
|
||||
}
|
||||
@@ -1,2 +1,3 @@
|
||||
pub mod auth;
|
||||
pub mod game_result;
|
||||
pub mod generic;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
pub mod auth;
|
||||
pub mod pool;
|
||||
pub mod routes;
|
||||
pub mod server_state;
|
||||
|
||||
25
src/server/pool/add_match.rs
Normal file
25
src/server/pool/add_match.rs
Normal file
@@ -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<ServerState>,
|
||||
Json(game_result): Json<GameResult>,
|
||||
) -> (StatusCode, Result<(), Json<GenericResponse>>) {
|
||||
(
|
||||
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"
|
||||
// }
|
||||
}
|
||||
1
src/server/pool/mod.rs
Normal file
1
src/server/pool/mod.rs
Normal file
@@ -0,0 +1 @@
|
||||
pub mod add_match;
|
||||
@@ -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)
|
||||
|
||||
@@ -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<G> {
|
||||
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::<GenericResponse>().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<PageState, BlamedError<std::convert::Infallible>> {
|
||||
Ok(PageState {
|
||||
winner: "Ferris".to_owned(),
|
||||
new_user: "newguy".to_owned(),
|
||||
winner: String::new(),
|
||||
loser: String::new(),
|
||||
error: String::new(),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
|
||||
|
||||
Reference in New Issue
Block a user