context.rs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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::ws_receiver::{make_document_ws_receiver, HttpDocumentCloudPersistence},
  9. folder::ws_receiver::{make_folder_ws_receiver, HttpFolderCloudPersistence},
  10. kv::revision_kv::RevisionKVPersistence,
  11. };
  12. use flowy_collaboration::{server_document::ServerDocumentManager, server_folder::ServerFolderManager};
  13. use lib_ws::WSChannel;
  14. use sqlx::PgPool;
  15. use std::sync::Arc;
  16. #[derive(Clone)]
  17. pub struct AppContext {
  18. pub ws_server: Data<Addr<WSServer>>,
  19. pub persistence: Data<Arc<FlowyPersistence>>,
  20. pub ws_receivers: Data<WebSocketReceivers>,
  21. pub document_manager: Data<Arc<ServerDocumentManager>>,
  22. pub folder_manager: Data<Arc<ServerFolderManager>>,
  23. }
  24. impl AppContext {
  25. pub fn new(ws_server: Addr<WSServer>, pg_pool: PgPool) -> Self {
  26. let ws_server = Data::new(ws_server);
  27. let mut ws_receivers = WebSocketReceivers::new();
  28. let document_store = make_document_kv_store(pg_pool.clone());
  29. let folder_store = make_folder_kv_store(pg_pool.clone());
  30. let flowy_persistence = Arc::new(FlowyPersistence {
  31. pg_pool,
  32. document_store,
  33. folder_store,
  34. });
  35. let document_persistence = Arc::new(HttpDocumentCloudPersistence(flowy_persistence.document_kv_store()));
  36. let document_manager = Arc::new(ServerDocumentManager::new(document_persistence));
  37. let document_ws_receiver = make_document_ws_receiver(flowy_persistence.clone(), document_manager.clone());
  38. ws_receivers.set(WSChannel::Document, document_ws_receiver);
  39. let folder_persistence = Arc::new(HttpFolderCloudPersistence(flowy_persistence.folder_kv_store()));
  40. let folder_manager = Arc::new(ServerFolderManager::new(folder_persistence));
  41. let folder_ws_receiver = make_folder_ws_receiver(flowy_persistence.clone(), folder_manager.clone());
  42. ws_receivers.set(WSChannel::Folder, folder_ws_receiver);
  43. AppContext {
  44. ws_server,
  45. persistence: Data::new(flowy_persistence),
  46. ws_receivers: Data::new(ws_receivers),
  47. document_manager: Data::new(document_manager),
  48. folder_manager: Data::new(folder_manager),
  49. }
  50. }
  51. }
  52. pub type DocumentRevisionKV = RevisionKVPersistence;
  53. pub type FolderRevisionKV = RevisionKVPersistence;
  54. fn make_document_kv_store(pg_pool: PgPool) -> Arc<DocumentRevisionKV> {
  55. let kv_impl = Arc::new(PostgresKV { pg_pool });
  56. Arc::new(DocumentRevisionKV::new(kv_impl))
  57. }
  58. fn make_folder_kv_store(pg_pool: PgPool) -> Arc<FolderRevisionKV> {
  59. let kv_impl = Arc::new(PostgresKV { pg_pool });
  60. Arc::new(FolderRevisionKV::new(kv_impl))
  61. }
  62. #[derive(Clone)]
  63. pub struct FlowyPersistence {
  64. pg_pool: PgPool,
  65. document_store: Arc<DocumentRevisionKV>,
  66. folder_store: Arc<FolderRevisionKV>,
  67. }
  68. impl FlowyPersistence {
  69. pub fn pg_pool(&self) -> PgPool {
  70. self.pg_pool.clone()
  71. }
  72. pub fn document_kv_store(&self) -> Arc<DocumentRevisionKV> {
  73. self.document_store.clone()
  74. }
  75. pub fn folder_kv_store(&self) -> Arc<FolderRevisionKV> {
  76. self.folder_store.clone()
  77. }
  78. }