use crate::{ boot::app::Boot, conversation::app::Conversations, event::{self, app::Events}, invite::app::Invites, message::app::Messages, push::app::Push, setup::app::Setup, token::{self, app::Tokens}, }; use sqlx::sqlite::SqlitePool; use web_push::PartialVapidSignatureBuilder; #[cfg(test)] use crate::user::app::Users; #[derive(Clone)] pub struct App { db: SqlitePool, events: event::Broadcaster, token_events: token::Broadcaster, vapid_public_key: String, vapid_signer: PartialVapidSignatureBuilder, } impl App { pub fn from( db: SqlitePool, vapid_public_key: String, vapid_signer: PartialVapidSignatureBuilder, ) -> Self { let events = event::Broadcaster::default(); let token_events = token::Broadcaster::default(); Self { db, events, token_events, vapid_public_key, vapid_signer, } } } impl App { pub const fn boot(&self) -> Boot { Boot::new(&self.db) } pub const fn conversations(&self) -> Conversations { Conversations::new(&self.db, &self.events) } pub const fn events(&self) -> Events { Events::new(&self.db, &self.events) } pub const fn invites(&self) -> Invites { Invites::new(&self.db, &self.events) } #[cfg(test)] pub const fn users(&self) -> Users { Users::new(&self.db, &self.events) } pub const fn messages(&self) -> Messages { Messages::new(&self.db, &self.events) } pub fn push(&self) -> Push { Push::new(&self.db, &self.vapid_public_key, &self.vapid_signer) } pub const fn setup(&self) -> Setup { Setup::new(&self.db, &self.events) } pub const fn tokens(&self) -> Tokens { Tokens::new(&self.db, &self.token_events) } }