aboutsummaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2023-08-03 12:57:35 +0200
committermetamuffin <metamuffin@disroot.org>2023-08-03 12:57:35 +0200
commitc0828abd8a0f02240520f3c36419d3a83086fd2b (patch)
treedbc494b0630ee6f89191f5b0117899544c5b07ae /server
parent78203f2546d4e5292985095538236d69a4eb8593 (diff)
downloadjellything-c0828abd8a0f02240520f3c36419d3a83086fd2b.tar
jellything-c0828abd8a0f02240520f3c36419d3a83086fd2b.tar.bz2
jellything-c0828abd8a0f02240520f3c36419d3a83086fd2b.tar.zst
import children from remote
Diffstat (limited to 'server')
-rw-r--r--server/src/import.rs66
1 files changed, 44 insertions, 22 deletions
diff --git a/server/src/import.rs b/server/src/import.rs
index 98e0504..2cd1998 100644
--- a/server/src/import.rs
+++ b/server/src/import.rs
@@ -6,6 +6,7 @@
use crate::{database::Database, federation::Federation, CONF};
use anyhow::{anyhow, bail, Context, Ok};
use async_recursion::async_recursion;
+use jellyclient::Session;
use jellycommon::{MediaSource, Node, NodePrivate, RemoteImportOptions};
use log::{error, info};
use std::{ffi::OsStr, fs::File, os::unix::prelude::OsStrExt, path::PathBuf, sync::LazyLock};
@@ -92,49 +93,70 @@ pub async fn import_path(
.to_string();
if let Some(io) = data.private.import.take() {
- let title = data.public.title;
- data = import_remote(io, db, fed)
+ let session = fed
+ .get_session(&io.host)
+ .await
+ .context("creating session")?;
+
+ import_remote(io, db, &session, &identifier, parent)
.await
.context("federated import")?;
- data.public.title = title;
+ } else {
+ info!("adding {identifier}");
+ data.public.parent = parent;
+ db.node.insert(&identifier, &data)?;
}
-
- info!("adding {identifier}");
- data.public.parent = parent;
- db.node.insert(&identifier, &data)?;
Ok((vec![identifier], 0))
} else {
bail!("did somebody really put a fifo or socket in the library?!")
}
}
+#[async_recursion]
async fn import_remote(
opts: RemoteImportOptions,
db: &Database,
- fed: &Federation,
-) -> anyhow::Result<Node> {
- let sess = fed
- .get_session(&opts.host)
+ session: &Session,
+ identifier: &String,
+ parent: Option<String>,
+) -> anyhow::Result<()> {
+ info!("loading federated node {identifier:?}");
+ let node = session
+ .node(&opts.id)
.await
- .context("creating session")?;
- let node = sess.node(&opts.id).await.context("fetching remote node")?;
-
- if !node.children.is_empty() {
- todo!()
- }
-
- let node = Node {
+ .context("fetching remote node")?;
+ let mut node = Node {
public: node,
private: NodePrivate {
backdrop: None,
poster: None,
import: None,
source: Some(MediaSource::Remote {
- host: opts.host,
- remote_id: opts.id,
+ host: opts.host.clone(),
+ remote_id: opts.id.clone(),
}),
},
};
- Ok(node)
+ for c in &mut node.public.children {
+ let prefixed = format!("{}{c}", opts.prefix.clone().unwrap_or(String::new()));
+ import_remote(
+ RemoteImportOptions {
+ id: c.to_owned(),
+ ..opts.clone()
+ },
+ db,
+ session,
+ &prefixed,
+ Some(opts.id.clone()),
+ )
+ .await?;
+ *c = prefixed;
+ }
+
+ node.public.parent = parent;
+ info!("adding {identifier}");
+ db.node.insert(identifier, &node)?;
+
+ Ok(())
}