toggle achievements

This commit is contained in:
2023-06-11 15:50:59 +02:00
parent fb1b863746
commit e12d616436
8 changed files with 972 additions and 21 deletions

View File

@@ -15,5 +15,5 @@ common.workspace = true
thiserror = "1.0.40"
tower = "0.4.13"
uuid.workspace = true
tower-http = { version = "0.4.0", features = ["fs", "trace"] }
tower-http = { version = "0.4.0", features = ["fs", "trace", "cors"] }
tokio-stream = { version = "0.1.14", features = ["sync"] }

View File

@@ -13,6 +13,7 @@ use axum::TypedHeader;
use common::Achievement;
use common::CreateAchievement;
use common::DeleteAchievement;
use common::ToggleAchievement;
use serde::Deserialize;
use serde::Serialize;
use std::net::SocketAddr;
@@ -21,6 +22,7 @@ use std::time::Duration;
use tokio::fs;
use tokio_stream::StreamExt;
use tower::ServiceBuilder;
use tower_http::cors::CorsLayer;
use tower_http::trace::DefaultMakeSpan;
use tower_http::trace::TraceLayer;
@@ -87,6 +89,7 @@ async fn main() {
tokio::spawn(async move {
let app = Router::new()
.route("/create", post(create_achievement))
.route("/toggle", post(toggle_achievement))
.route("/delete", post(delete_achievement))
.route("/ws", get(ws_handler))
.layer(
@@ -97,7 +100,8 @@ async fn main() {
.layer(
TraceLayer::new_for_http()
.make_span_with(DefaultMakeSpan::default().include_headers(true)),
);
)
.layer(CorsLayer::permissive());
let addr = SocketAddr::from(([127, 0, 0, 1], 4000));
@@ -160,6 +164,7 @@ async fn create_achievement(
Extension(app_state): Extension<SharedState>,
Json(create_achievement): Json<CreateAchievement>,
) -> Result<(StatusCode, ()), HandlerError> {
tracing::debug!("Creating achievement: {create_achievement:?}.");
let achievement = Achievement {
goal: create_achievement.goal,
completed: false,
@@ -173,10 +178,32 @@ async fn create_achievement(
Ok((StatusCode::CREATED, ()))
}
async fn toggle_achievement(
Extension(app_state): Extension<SharedState>,
Json(toggle_achievement): Json<ToggleAchievement>,
) -> Result<(StatusCode, ()), HandlerError> {
tracing::debug!("Toggling achievement: {toggle_achievement:?}.");
let mut lock = app_state.write().await;
if let Some(achievement) = lock
.app_state
.state
.achievements
.iter_mut()
.find(|x| x.uuid == toggle_achievement.uuid)
{
achievement.completed = !achievement.completed;
lock.watcher_tx
.send(lock.app_state.state.clone())
.expect("watch channel is closed, every receiver was dropped.");
}
Ok((StatusCode::OK, ()))
}
async fn delete_achievement(
Extension(app_state): Extension<SharedState>,
Json(delete_achievement): Json<DeleteAchievement>,
) -> Result<(StatusCode, ()), HandlerError> {
tracing::debug!("Deleting achievement: {delete_achievement:?}.");
let mut lock = app_state.write().await;
if let Some(pos) = lock
.app_state