feat: set timed reveals
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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>,
|
||||
|
||||
Reference in New Issue
Block a user