context.rs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. use crate::services::{
  2. kv::PostgresKV,
  3. web_socket::{WSServer, WebSocketReceivers},
  4. };
  5. use actix::Addr;
  6. use actix_web::web::Data;
  7. use crate::services::{
  8. document::{
  9. persistence::DocumentKVPersistence,
  10. ws_receiver::{make_document_ws_receiver, HttpDocumentCloudPersistence},
  11. },
  12. folder::ws_receiver::make_folder_ws_receiver,
  13. };
  14. use flowy_collaboration::server_document::ServerDocumentManager;
  15. use lib_ws::WSChannel;
  16. use sqlx::PgPool;
  17. use std::sync::Arc;
  18. #[derive(Clone)]
  19. pub struct AppContext {
  20. pub ws_server: Data<Addr<WSServer>>,
  21. pub persistence: Data<Arc<FlowyPersistence>>,
  22. pub ws_receivers: Data<WebSocketReceivers>,
  23. pub document_manager: Data<Arc<ServerDocumentManager>>,
  24. }
  25. impl AppContext {
  26. pub fn new(ws_server: Addr<WSServer>, pg_pool: PgPool) -> Self {
  27. let ws_server = Data::new(ws_server);
  28. let mut ws_receivers = WebSocketReceivers::new();
  29. let kv_store = make_document_kv_store(pg_pool.clone());
  30. let flowy_persistence = Arc::new(FlowyPersistence { pg_pool, kv_store });
  31. let document_persistence = Arc::new(HttpDocumentCloudPersistence(flowy_persistence.kv_store()));
  32. let document_manager = Arc::new(ServerDocumentManager::new(document_persistence));
  33. let document_ws_receiver = make_document_ws_receiver(flowy_persistence.clone(), document_manager.clone());
  34. ws_receivers.set(WSChannel::Document, document_ws_receiver);
  35. let folder_ws_receiver = make_folder_ws_receiver(flowy_persistence.clone());
  36. ws_receivers.set(WSChannel::Folder, folder_ws_receiver);
  37. AppContext {
  38. ws_server,
  39. persistence: Data::new(flowy_persistence),
  40. ws_receivers: Data::new(ws_receivers),
  41. document_manager: Data::new(document_manager),
  42. }
  43. }
  44. }
  45. fn make_document_kv_store(pg_pool: PgPool) -> Arc<DocumentKVPersistence> {
  46. let kv_impl = Arc::new(PostgresKV { pg_pool });
  47. Arc::new(DocumentKVPersistence::new(kv_impl))
  48. }
  49. #[derive(Clone)]
  50. pub struct FlowyPersistence {
  51. pg_pool: PgPool,
  52. kv_store: Arc<DocumentKVPersistence>,
  53. }
  54. impl FlowyPersistence {
  55. pub fn pg_pool(&self) -> PgPool { self.pg_pool.clone() }
  56. pub fn kv_store(&self) -> Arc<DocumentKVPersistence> { self.kv_store.clone() }
  57. }