use axum::body::Body;
use axum::http::{Method, Request, StatusCode};
use axum::response::{IntoResponse, Response};
use axum::{routing::get, Router};
use axum_session::{Key, SessionConfig, SessionLayer, SessionStore};
use axum_session_surreal::{SessionSurrealPool, SessionSurrealSession};
use http_body_util::BodyExt;
use surrealdb::engine::any::{connect, Any};
use surrealdb::opt::auth::Root;
use tower::ServiceExt;
#[tokio::main]
async fn main() {
let db = connect("ws://localhost:8080").await.unwrap();
db.signin(Root {
username: "root",
password: "root",
})
.await
.unwrap();
db.use_ns("test").use_db("test").await.unwrap();
let session_config = SessionConfig::default().with_key(Key::generate());
let session_store =
SessionStore::new(Some(SessionSurrealPool::new(db.clone())), session_config)
.await
.unwrap();
let app = Router::new()
.route("/", get(root))
.route("/counter", get(counter))
.layer(SessionLayer::new(session_store));
let request = Request::builder()
.uri("/")
.method(Method::GET)
.body(Body::empty())
.unwrap();
let response = app.clone().oneshot(request).await.unwrap();
let mut sessionid = Some(
response
.headers()
.get("session")
.unwrap()
.to_str()
.unwrap()
.to_owned(),
);
for _ in 0..10 {
let response = app
.clone()
.oneshot(
Request::builder()
.uri("/counter")
.method(Method::GET)
.header("session", sessionid.take().unwrap())
.body(Body::empty())
.unwrap(),
)
.await
.unwrap();
sessionid = Some(
response
.headers()
.get("session")
.cloned()
.unwrap()
.to_str()
.unwrap()
.to_owned(),
);
println!("Status: {:?}", response.status());
let bytes = response
.into_body()
.collect()
.await
.unwrap()
.to_bytes()
.to_vec();
let body = String::from_utf8(bytes).unwrap();
println!("Body: {:?}", body);
}
println!("Finished!")
}
async fn root() -> Response {
StatusCode::OK.into_response()
}
async fn counter(session: SessionSurrealSession<Any>) -> Response {
let mut count: usize = session.get("count").unwrap_or(0);
count += 1;
session.set("count", count);
let sessions_count = session.count().await;
let new_count = session.get::<usize>("count").expect("error setting count");
(
StatusCode::OK,
format!(
"We have set the counter to surreal: {new_count}, Sessions Count: {sessions_count}"
),
)
.into_response()
}