Skip to content

Commit 89798e9

Browse files
committed
wip: fix some server-side compile errors
1 parent 341d4f1 commit 89798e9

File tree

7 files changed

+53
-33
lines changed

7 files changed

+53
-33
lines changed

sandpolis-mobile/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
//! The entry point for iOS applications.
2-
use bevy_mobile_example::main;
2+
use sandpolis_mobile::main;

sandpolis-user/src/lib.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// }
66

77
use anyhow::Result;
8+
use anyhow::bail;
89
use native_db::ToKey;
910
use native_model::Model;
1011
use sandpolis_core::RealmName;
@@ -45,6 +46,17 @@ impl UserLayer {
4546
database,
4647
})
4748
}
49+
50+
// TODO better users.find
51+
pub async fn user(&self, username: &UserName) -> Result<UserData> {
52+
let user = for user in self.users.iter().await {
53+
if user.read().await.username == *username {
54+
return Ok(user.read().await.clone());
55+
}
56+
};
57+
58+
bail!("User not found");
59+
}
4860
}
4961

5062
#[derive(Validate)]

sandpolis-user/src/server/routes.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,7 @@ pub async fn login(
3333
.validate()
3434
.map_err(|_| Json(LoginResponse::Invalid))?;
3535

36-
let Some(user) = state
37-
.users
38-
.stream()
39-
.await
40-
.find(async |user| user.read().await.username == request.username)
41-
.await
42-
else {
36+
let Ok(user) = state.user(&request.username).await else {
4337
debug!(username = %request.username, "User does not exist");
4438
return Err(Json(LoginResponse::Denied));
4539
};
@@ -78,12 +72,12 @@ pub async fn login(
7872
}
7973

8074
let claims = Claims {
81-
sub: user.read().await.username.to_string(),
75+
sub: user.username.to_string(),
8276
exp: (SystemTime::now() + Duration::from_secs(3600))
8377
.duration_since(SystemTime::UNIX_EPOCH)
8478
.unwrap()
8579
.as_secs() as usize,
86-
admin: user.read().await.admin,
80+
admin: user.admin,
8781
};
8882

8983
info!(claims = ?claims, "Login succeeded");

sandpolis/src/cli.rs

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
use crate::config::Configuration;
12
use anyhow::Result;
3+
use anyhow::bail;
24
use clap::Parser;
35
use clap::Subcommand;
46
use colored::Colorize;
7+
use sandpolis_core::RealmName;
8+
use std::path::PathBuf;
59
use std::process::ExitCode;
6-
7-
use crate::config::Configuration;
10+
use tracing::info;
811

912
#[derive(Parser, Debug, Clone)]
1013
#[clap(author, version, about = "Test")]
@@ -72,23 +75,32 @@ pub enum Commands {
7275
}
7376

7477
impl Commands {
75-
pub fn dispatch(&self, config: &Configuration) -> Result<ExitCode> {
78+
pub async fn dispatch(self, config: &Configuration) -> Result<ExitCode> {
7679
match self {
7780
#[cfg(feature = "server")]
7881
Commands::NewClientCert { realm, output } => {
79-
let db = Database::new(&config.database.storage)?;
82+
use sandpolis_realm::RealmClusterCert;
83+
84+
let database = sandpolis_database::DatabaseLayer::new(
85+
config.database.clone(),
86+
&crate::MODELS,
87+
)?;
88+
89+
let db = database.realm(realm.parse()?).await?;
90+
let r = db.r_transaction()?;
91+
92+
let cluster_certs: Vec<RealmClusterCert> =
93+
r.scan().primary()?.all()?.try_collect()?;
8094

81-
let realms: Collection<RealmData> = db
82-
.document::<RealmLayerData>("/realm")?
83-
.collection("/realms")?;
84-
let g = realms.get_document(realm)?.expect("the realm exists");
85-
let ca: Document<RealmClusterCert> = g.get_document("ca")?.expect("the CA exists");
95+
let Some(cluster_cert) = cluster_certs.first() else {
96+
bail!("No cluster cert found");
97+
};
8698

87-
let cert = ca.data.client_cert()?;
99+
let client_cert = cluster_cert.client_cert()?;
88100

89101
if let Some(path) = output {
90102
info!(path = %path.display(), "Writing endpoint certificate");
91-
std::fs::write(path, &serde_json::to_vec(&cert)?)?;
103+
std::fs::write(path, &serde_json::to_vec(&client_cert)?)?;
92104
} else {
93105
todo!()
94106
}

sandpolis/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
#![feature(iterator_try_collect)]
2+
13
use anyhow::Result;
24
use axum_macros::FromRef;
35
use config::Configuration;
@@ -254,7 +256,7 @@ pub static MODELS: LazyLock<Models> = LazyLock::new(|| {
254256
m.define::<sandpolis_user::UserLayerData>().unwrap();
255257
m.define::<sandpolis_user::UserData>().unwrap();
256258
#[cfg(feature = "server")]
257-
m.define::<sandpolis_user::PasswordData>().unwrap();
259+
m.define::<sandpolis_user::server::PasswordData>().unwrap();
258260
}
259261

260262
// Server layer

sandpolis/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ async fn main() -> Result<ExitCode> {
8080
#[cfg(any(feature = "agent", feature = "client"))]
8181
Some(Commands::Server) => run_instances = vec!["server"],
8282

83-
Some(command) => return Ok(command.dispatch(&config)?),
83+
Some(command) => return Ok(command.dispatch(&config).await?),
8484
None => (),
8585
}
8686

sandpolis/src/server/mod.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@ use axum::{
55
routing::{get, post},
66
};
77
use rand::Rng;
8-
use sandpolis_database::Database;
9-
use sandpolis_instance::{ClusterId, InstanceId};
8+
use sandpolis_core::{ClusterId, InstanceId};
109
use sandpolis_realm::RealmClusterCert;
1110
use std::path::PathBuf;
1211
use tempfile::TempDir;
@@ -39,10 +38,13 @@ pub async fn main(config: Configuration, state: InstanceState) -> Result<()> {
3938

4039
info!(listener = ?config.server.listen, "Starting server listener");
4140
axum_server::bind(config.server.listen)
42-
.acceptor(sandpolis_realm::server::RealmAcceptor::new(
43-
state.instance.clone(),
44-
state.realm.clone(),
45-
)?)
41+
.acceptor(
42+
sandpolis_realm::server::RealmAcceptor::new(
43+
state.instance.clone(),
44+
state.realm.clone(),
45+
)
46+
.await?,
47+
)
4648
.serve(app.with_state(state).into_make_service())
4749
.await
4850
.context("binding socket")?;
@@ -55,7 +57,6 @@ pub struct TestServer {
5557
pub port: u16,
5658
pub endpoint_cert: PathBuf,
5759
certs: TempDir,
58-
db: Database,
5960
}
6061

6162
/// Run a standalone server instance for testing.
@@ -71,7 +72,7 @@ pub async fn test_server() -> Result<TestServer> {
7172
let mut config = Configuration::default();
7273

7374
// Create temporary database
74-
let db = Database::new_ephemeral()?;
75+
let database = sandpolis_database::DatabaseLayer::new(config.database.clone(), &crate::MODELS)?;
7576

7677
// Generate temporary certs
7778
let certs = tempdir()?;
@@ -84,7 +85,7 @@ pub async fn test_server() -> Result<TestServer> {
8485
let port: u16 = rand::rng().random_range(9000..9999);
8586
config.server.listen = format!("127.0.0.1:{port}",).parse()?;
8687

87-
let state = InstanceState::new(config.clone(), db.clone()).await?;
88+
let state = InstanceState::new(config.clone(), database).await?;
8889

8990
// Spawn the server
9091
tokio::spawn(async move { main(config, state).await });
@@ -93,6 +94,5 @@ pub async fn test_server() -> Result<TestServer> {
9394
port,
9495
endpoint_cert: certs.path().join("client.cert"),
9596
certs,
96-
db,
9797
})
9898
}

0 commit comments

Comments
 (0)