@@ -1,12 +1,8 @@
-use collab::{Error, Result};
-use db::{DefaultDb, UserId};
+use collab::{db, Error, Result};
+use db::{ConnectOptions, Database, UserId};
use serde::{de::DeserializeOwned, Deserialize};
use std::fmt::Write;
-#[allow(unused)]
-#[path = "../db.rs"]
-mod db;
-
#[derive(Debug, Deserialize)]
struct GitHubUser {
id: i32,
@@ -17,7 +13,7 @@ struct GitHubUser {
#[tokio::main]
async fn main() {
let database_url = std::env::var("DATABASE_URL").expect("missing DATABASE_URL env var");
- let db = DefaultDb::new(&database_url, 5)
+ let db = Database::new(ConnectOptions::new(database_url))
.await
.expect("failed to connect to postgres database");
let github_token = std::env::var("GITHUB_TOKEN").expect("missing GITHUB_TOKEN env var");
@@ -1,4 +1,15 @@
+pub mod api;
+pub mod auth;
+pub mod db;
+pub mod env;
+#[cfg(test)]
+mod integration_tests;
+pub mod rpc;
+
use axum::{http::StatusCode, response::IntoResponse};
+use db::Database;
+use serde::Deserialize;
+use std::{path::PathBuf, sync::Arc};
pub type Result<T, E = Error> = std::result::Result<T, E>;
@@ -85,3 +96,57 @@ impl std::fmt::Display for Error {
}
impl std::error::Error for Error {}
+
+#[derive(Default, Deserialize)]
+pub struct Config {
+ pub http_port: u16,
+ pub database_url: String,
+ pub api_token: String,
+ pub invite_link_prefix: String,
+ pub live_kit_server: Option<String>,
+ pub live_kit_key: Option<String>,
+ pub live_kit_secret: Option<String>,
+ pub rust_log: Option<String>,
+ pub log_json: Option<bool>,
+}
+
+#[derive(Default, Deserialize)]
+pub struct MigrateConfig {
+ pub database_url: String,
+ pub migrations_path: Option<PathBuf>,
+}
+
+pub struct AppState {
+ pub db: Arc<Database>,
+ pub live_kit_client: Option<Arc<dyn live_kit_server::api::Client>>,
+ pub config: Config,
+}
+
+impl AppState {
+ pub async fn new(config: Config) -> Result<Arc<Self>> {
+ let mut db_options = db::ConnectOptions::new(config.database_url.clone());
+ db_options.max_connections(5);
+ let db = Database::new(db_options).await?;
+ let live_kit_client = if let Some(((server, key), secret)) = config
+ .live_kit_server
+ .as_ref()
+ .zip(config.live_kit_key.as_ref())
+ .zip(config.live_kit_secret.as_ref())
+ {
+ Some(Arc::new(live_kit_server::api::LiveKitClient::new(
+ server.clone(),
+ key.clone(),
+ secret.clone(),
+ )) as Arc<dyn live_kit_server::api::Client>)
+ } else {
+ None
+ };
+
+ let this = Self {
+ db: Arc::new(db),
+ live_kit_client,
+ config,
+ };
+ Ok(Arc::new(this))
+ }
+}
@@ -1,22 +1,11 @@
-mod api;
-mod auth;
-mod db;
-mod env;
-mod rpc;
-
-#[cfg(test)]
-mod integration_tests;
-
use anyhow::anyhow;
use axum::{routing::get, Router};
-use collab::{Error, Result};
+use collab::{db, env, AppState, Config, MigrateConfig, Result};
use db::Database;
-use serde::Deserialize;
use std::{
env::args,
net::{SocketAddr, TcpListener},
- path::{Path, PathBuf},
- sync::Arc,
+ path::Path,
};
use tracing_log::LogTracer;
use tracing_subscriber::{filter::EnvFilter, fmt::format::JsonFields, Layer};
@@ -24,60 +13,6 @@ use util::ResultExt;
const VERSION: &'static str = env!("CARGO_PKG_VERSION");
-#[derive(Default, Deserialize)]
-pub struct Config {
- pub http_port: u16,
- pub database_url: String,
- pub api_token: String,
- pub invite_link_prefix: String,
- pub live_kit_server: Option<String>,
- pub live_kit_key: Option<String>,
- pub live_kit_secret: Option<String>,
- pub rust_log: Option<String>,
- pub log_json: Option<bool>,
-}
-
-#[derive(Default, Deserialize)]
-pub struct MigrateConfig {
- pub database_url: String,
- pub migrations_path: Option<PathBuf>,
-}
-
-pub struct AppState {
- db: Arc<Database>,
- live_kit_client: Option<Arc<dyn live_kit_server::api::Client>>,
- config: Config,
-}
-
-impl AppState {
- async fn new(config: Config) -> Result<Arc<Self>> {
- let mut db_options = db::ConnectOptions::new(config.database_url.clone());
- db_options.max_connections(5);
- let db = Database::new(db_options).await?;
- let live_kit_client = if let Some(((server, key), secret)) = config
- .live_kit_server
- .as_ref()
- .zip(config.live_kit_key.as_ref())
- .zip(config.live_kit_secret.as_ref())
- {
- Some(Arc::new(live_kit_server::api::LiveKitClient::new(
- server.clone(),
- key.clone(),
- secret.clone(),
- )) as Arc<dyn live_kit_server::api::Client>)
- } else {
- None
- };
-
- let this = Self {
- db: Arc::new(db),
- live_kit_client,
- config,
- };
- Ok(Arc::new(this))
- }
-}
-
#[tokio::main]
async fn main() -> Result<()> {
if let Err(error) = env::load_dotenv() {
@@ -120,10 +55,10 @@ async fn main() -> Result<()> {
let listener = TcpListener::bind(&format!("0.0.0.0:{}", state.config.http_port))
.expect("failed to bind TCP listener");
- let rpc_server = rpc::Server::new(state.clone());
+ let rpc_server = collab::rpc::Server::new(state.clone());
- let app = api::routes(rpc_server.clone(), state.clone())
- .merge(rpc::routes(rpc_server.clone()))
+ let app = collab::api::routes(rpc_server.clone(), state.clone())
+ .merge(collab::rpc::routes(rpc_server.clone()))
.merge(Router::new().route("/", get(handle_root)));
axum::Server::from_tcp(listener)?