feat: set timed reveals

This commit is contained in:
2023-06-16 21:14:53 +02:00
parent 17faadf7cd
commit 35d53d82c6
15 changed files with 350 additions and 25 deletions

View File

@@ -6,16 +6,17 @@ edition.workspace = true
[dependencies]
serde.workspace = true
uuid.workspace = true
common.workspace = true
thiserror.workspace = true
axum = { version = "0.6", features = ["ws", "headers"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
tracing = "0.1"
tracing-subscriber = "0.3"
common.workspace = true
thiserror = "1.0.40"
tower = "0.4.13"
uuid.workspace = true
tower-http = { version = "0.4.0", features = ["fs", "trace", "cors"] }
tokio-stream = { version = "0.1.14", features = ["sync"] }
clap = { version = "4.3.3", features = ["derive"] }
futures-util = "0.3.28"
tower = "0.4"
tower-http = { version = "0.4", features = ["fs", "trace", "cors"] }
chrono.workspace = true
tokio-stream = { version = "0.1", features = ["sync"] }
clap = { version = "4", features = ["derive"] }
futures-util.workspace = true
serde_json.workspace = true

View File

@@ -20,6 +20,7 @@ use common::DeleteMilestone;
use common::Milestone;
use common::RestResponse;
use common::ToggleAchievement;
use common::UpdateAchievementTimeOfReveal;
use futures_util::SinkExt;
use futures_util::StreamExt;
use serde::Deserialize;
@@ -133,6 +134,10 @@ async fn main() {
.route("/api/v1/toggle", post(toggle_achievement))
.route("/api/v1/create-milestone", post(create_milestone))
.route("/api/v1/delete-milestone", post(delete_milestone))
.route(
"/api/v1/update-time-of-reveal",
post(update_achievement_time_of_reveal),
)
.route("/api/ws", get(ws_handler))
.layer(
ServiceBuilder::new()
@@ -245,10 +250,12 @@ async fn create_achievement(
Json(create_achievement): Json<CreateAchievement>,
) -> Response<()> {
tracing::debug!("Creating achievement: {create_achievement:?}.");
let CreateAchievement { goal, time_of_reveal } = create_achievement;
let achievement = Achievement {
goal: create_achievement.goal,
goal,
completed: false,
uuid: uuid::Uuid::new_v4(),
time_of_reveal,
};
let mut lock = app_state.write().await;
lock.app_state.state.achievements.push(achievement);
@@ -326,6 +333,27 @@ async fn toggle_achievement(
Ok((StatusCode::OK, Json(Ok(()))))
}
async fn update_achievement_time_of_reveal(
Extension(app_state): Extension<SharedState>,
Json(update): Json<UpdateAchievementTimeOfReveal>,
) -> Response<()> {
tracing::debug!("Updating achievement time of reveal: {update:?}.");
let mut lock = app_state.write().await;
if let Some(achievement) = lock
.app_state
.state
.achievements
.iter_mut()
.find(|x| x.uuid == update.uuid)
{
achievement.time_of_reveal = update.time_of_reveal;
lock.watcher_tx
.send(lock.app_state.state.clone())
.expect("watch channel is closed, every receiver was dropped.");
}
Ok((StatusCode::OK, Json(Ok(()))))
}
async fn delete_achievement(
Extension(app_state): Extension<SharedState>,
Json(delete_achievement): Json<DeleteAchievement>,