summaryrefslogtreecommitdiff
path: root/server/src/routes.rs
blob: ca55c8f3ffdf1a0471ed9b9a2b0c0a9c57d89907 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
use axum::{
	extract::{ws::WebSocketUpgrade, Path},
	routing::get,
	response::Response,
	Router, Extension,
};
use tokio::sync::oneshot;
use tower_http::services::ServeDir;

use super::rooms;

pub fn routes() -> Router {
	let room_server: rooms::RoomService = rooms::start_room_server();

    let client_dir = std::env::var("CLIENT_DIR").unwrap_or_else(|_| String::from("./client"));
    println!("Service client data from: {client_dir}");

	Router::new()
		.route("/api/check", get(|| async {"ok"}))
		.route("/api/exists/:code", get(game_exists))
		.route("/api/join/:code", get(game_join))
		.nest_service("/", ServeDir::new(client_dir))
		.layer(Extension(room_server))
}

// check if a given room code exists already
async fn game_exists(
	Path(code): Path<String>,
	Extension(room_server): Extension<rooms::RoomService>
) -> &'static str {
	let (tx, rx) = oneshot::channel();
	room_server.send(rooms::RoomServiceRequest::Exists(code, tx)).await.ok();
	
	if let Ok(res) = rx.await {
		if res {
			"true"
		} else {
			"false"
		}
	} else {
		return "error";
	}
}

// start a websocket connection and join it to the room
async fn game_join(
	Path(code): Path<String>,
	ws: WebSocketUpgrade,
	Extension(room_server): Extension<rooms::RoomService>
) -> Response {
	ws.on_upgrade(|s| async move {
		room_server.send(rooms::RoomServiceRequest::Join(code, s)).await.ok();
	})
}