aboutsummaryrefslogtreecommitdiff
path: root/base/src/federation.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-12-21 23:57:42 +0100
committermetamuffin <metamuffin@disroot.org>2023-12-21 23:57:42 +0100
commit3a29113e965a94bdef06655f1583cc6e86edd606 (patch)
treea0910fa9687a9935ba1ca85a9cb5def1a0bc9069 /base/src/federation.rs
parenta8b2480e898e269e7e0d41dbd46d9a18c7d1e4ba (diff)
downloadjellything-3a29113e965a94bdef06655f1583cc6e86edd606.tar
jellything-3a29113e965a94bdef06655f1583cc6e86edd606.tar.bz2
jellything-3a29113e965a94bdef06655f1583cc6e86edd606.tar.zst
rework import system pt. 1
Diffstat (limited to 'base/src/federation.rs')
-rw-r--r--base/src/federation.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/base/src/federation.rs b/base/src/federation.rs
new file mode 100644
index 0000000..509b87c
--- /dev/null
+++ b/base/src/federation.rs
@@ -0,0 +1,61 @@
+/*
+ This file is part of jellything (https://codeberg.org/metamuffin/jellything)
+ which is licensed under the GNU Affero General Public License (version 3); see /COPYING.
+ Copyright (C) 2023 metamuffin <metamuffin.org>
+*/
+use anyhow::anyhow;
+use crate::CONF;
+use jellyclient::{Instance, LoginDetails, Session};
+use std::{collections::HashMap, sync::Arc};
+use tokio::sync::RwLock;
+
+pub struct Federation {
+ instances: HashMap<String, Instance>,
+ sessions: RwLock<HashMap<String, Arc<Session>>>,
+}
+
+impl Federation {
+ pub fn initialize() -> Self {
+ let instances = CONF
+ .remote_credentials
+ .iter()
+ .map(|(k, (_, _, tls))| (k.to_owned(), Instance::new(k.to_owned(), *tls)))
+ .collect::<HashMap<_, _>>();
+
+ Self {
+ instances,
+ sessions: Default::default(),
+ }
+ }
+
+ pub fn get_instance(&self, host: &String) -> anyhow::Result<&Instance> {
+ Ok(self
+ .instances
+ .get(host)
+ .ok_or(anyhow!("unknown instance"))?)
+ }
+ pub async fn get_session(&self, host: &String) -> anyhow::Result<Arc<Session>> {
+ let mut w = self.sessions.write().await;
+ if let Some(s) = w.get(host) {
+ Ok(s.to_owned())
+ } else {
+ let (username, password, _) = CONF
+ .remote_credentials
+ .get(host)
+ .ok_or(anyhow!("no credentials of the remote server"))?;
+ let s = Arc::new(
+ self.get_instance(host)?
+ .to_owned()
+ .login(LoginDetails {
+ username: username.to_owned(),
+ password: password.to_owned(),
+ expire: None,
+ drop_permissions: None,
+ })
+ .await?,
+ );
+ w.insert(host.to_owned(), s.clone());
+ Ok(s)
+ }
+ }
+}