49 lines
1.9 KiB
Rust
49 lines
1.9 KiB
Rust
use std::{collections::HashMap, sync::Arc};
|
|
use crate::database::Database;
|
|
use tokio::sync::{broadcast, RwLock};
|
|
|
|
const CHANNEL_CAPACITY: usize = 256;
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct SmtpConfig { pub host: String, pub port: u16, pub username: String, pub password: String, pub from: String, pub public_url: String }
|
|
|
|
#[derive(Debug, Clone)]
|
|
pub struct NoteUpdate {
|
|
pub content: String,
|
|
pub revision_id: i64,
|
|
pub updated_at: String,
|
|
pub author: Option<String>,
|
|
pub owner_map: String,
|
|
}
|
|
|
|
#[derive(Debug)]
|
|
pub struct AppState {
|
|
pub db: Database,
|
|
pub asset_version: String,
|
|
pub files_dir: String,
|
|
pub upload_max_size_bytes: usize,
|
|
pub smtp: Option<SmtpConfig>,
|
|
pub registration_enabled: bool,
|
|
pub frontend_log_level: String,
|
|
channels: RwLock<HashMap<String, broadcast::Sender<NoteUpdate>>>,
|
|
}
|
|
|
|
impl AppState {
|
|
pub fn new(db: Database, asset_version: String, files_dir: String, upload_max_size_bytes: usize, smtp: Option<SmtpConfig>, registration_enabled: bool, frontend_log_level: String) -> Self {
|
|
Self { db, asset_version, files_dir, upload_max_size_bytes, smtp, registration_enabled, frontend_log_level, channels: RwLock::new(HashMap::new()) }
|
|
}
|
|
async fn channel_for_key(&self, key: String) -> broadcast::Sender<NoteUpdate> {
|
|
if let Some(sender) = self.channels.read().await.get(&key) { return sender.clone(); }
|
|
let mut channels = self.channels.write().await;
|
|
channels.entry(key).or_insert_with(|| broadcast::channel(CHANNEL_CAPACITY).0).clone()
|
|
}
|
|
pub async fn note_channel(&self, workspace_slug: &str, note_slug: &str) -> broadcast::Sender<NoteUpdate> {
|
|
self.channel_for_key(format!("workspace:{workspace_slug}/{note_slug}")).await
|
|
}
|
|
pub async fn pad_channel(&self, slug: &str) -> broadcast::Sender<NoteUpdate> {
|
|
self.channel_for_key(format!("pad:{slug}")).await
|
|
}
|
|
}
|
|
|
|
pub type SharedState = Arc<AppState>;
|