2025-04-11 04:58:16 +03:00
|
|
|
use std::sync::{Arc, LazyLock, RwLock};
|
|
|
|
|
|
|
|
use axum::{
|
2025-04-16 06:27:08 +03:00
|
|
|
Extension, Json, Router,
|
2025-04-11 04:58:16 +03:00
|
|
|
http::StatusCode,
|
|
|
|
response::IntoResponse,
|
|
|
|
routing::{get, post},
|
|
|
|
};
|
|
|
|
use axum_macros::debug_handler;
|
2025-04-16 06:27:08 +03:00
|
|
|
use protocol::{Signal, User, UserAndSignal};
|
2025-04-11 04:58:16 +03:00
|
|
|
use tokio::net::TcpListener;
|
2025-04-16 06:27:08 +03:00
|
|
|
use tower_http::{cors::CorsLayer, trace::TraceLayer};
|
2025-04-11 04:58:16 +03:00
|
|
|
|
2025-04-16 06:27:08 +03:00
|
|
|
use crate::middleware::{
|
|
|
|
UserAndExpectedSignal, verify_then_get_user, verify_then_get_user_and_expected_signal,
|
|
|
|
};
|
|
|
|
|
|
|
|
static USERS_AND_SIGNALS: LazyLock<RwLock<Vec<UserAndSignal>>> =
|
|
|
|
LazyLock::new(|| RwLock::new(vec![]));
|
2025-04-11 04:58:16 +03:00
|
|
|
|
|
|
|
pub async fn start_signalling() {
|
2025-04-16 06:27:08 +03:00
|
|
|
let route = route()
|
|
|
|
.layer(CorsLayer::permissive())
|
|
|
|
.layer(TraceLayer::new_for_http());
|
|
|
|
let listener = TcpListener::bind("192.168.1.3:4546").await.unwrap();
|
|
|
|
println!("http://192.168.1.3:4546");
|
2025-04-11 04:58:16 +03:00
|
|
|
axum::serve(listener, route).await.unwrap();
|
|
|
|
}
|
|
|
|
|
|
|
|
fn route() -> Router {
|
|
|
|
Router::new()
|
|
|
|
.route("/alive", get(alive))
|
2025-04-16 06:27:08 +03:00
|
|
|
.route(
|
|
|
|
"/",
|
|
|
|
get(read_signal).route_layer(axum::middleware::from_fn(
|
|
|
|
verify_then_get_user_and_expected_signal,
|
|
|
|
)),
|
|
|
|
)
|
|
|
|
.route(
|
|
|
|
"/",
|
|
|
|
post(create_signal).route_layer(axum::middleware::from_fn(verify_then_get_user)),
|
|
|
|
)
|
2025-04-11 04:58:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
async fn alive() -> impl IntoResponse {
|
|
|
|
StatusCode::OK
|
|
|
|
}
|
|
|
|
|
|
|
|
#[debug_handler]
|
2025-04-16 06:27:08 +03:00
|
|
|
async fn create_signal(
|
|
|
|
Extension(user): Extension<Arc<User>>,
|
|
|
|
Json(signal): Json<Signal>,
|
|
|
|
) -> impl IntoResponse {
|
|
|
|
let user = (*user).clone();
|
|
|
|
let user_and_signal = UserAndSignal::new(user, signal).await;
|
|
|
|
USERS_AND_SIGNALS.write().unwrap().push(user_and_signal);
|
2025-04-11 04:58:16 +03:00
|
|
|
StatusCode::OK
|
|
|
|
}
|
2025-04-16 06:27:08 +03:00
|
|
|
|
2025-04-17 04:09:18 +03:00
|
|
|
#[debug_handler]
|
2025-04-16 06:27:08 +03:00
|
|
|
async fn read_signal(
|
|
|
|
Extension(user_and_expected_signal): Extension<Arc<UserAndExpectedSignal>>,
|
|
|
|
) -> impl IntoResponse {
|
|
|
|
let mut target_index = None;
|
|
|
|
let mut json_body = serde_json::json!("");
|
|
|
|
for (index, user_and_signal) in USERS_AND_SIGNALS.read().unwrap().iter().enumerate() {
|
2025-04-17 04:09:18 +03:00
|
|
|
if user_and_signal.signal.get_signal_type() == user_and_expected_signal.expected_signal
|
|
|
|
&& user_and_signal.user != user_and_expected_signal.user
|
|
|
|
{
|
2025-04-16 06:27:08 +03:00
|
|
|
json_body = serde_json::json!(user_and_signal);
|
|
|
|
target_index = Some(index);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
match target_index {
|
|
|
|
Some(target_index) => {
|
|
|
|
USERS_AND_SIGNALS.write().unwrap().remove(target_index);
|
|
|
|
(StatusCode::OK, Json(json_body)).into_response()
|
|
|
|
}
|
|
|
|
None => StatusCode::BAD_REQUEST.into_response(),
|
|
|
|
}
|
|
|
|
}
|