implement deleted posts cleanup, extend sync response features

This commit is contained in:
postscriptum 2025-07-03 12:00:05 +03:00
parent e85a4bb7d0
commit 499a78004a
7 changed files with 160 additions and 36 deletions

View file

@ -1,9 +1,11 @@
mod config;
mod nex;
mod response;
mod snac;
use anyhow::Result;
use nex::Nex;
use response::Response;
use snac::Snac;
fn main() -> Result<()> {
@ -22,26 +24,33 @@ fn main() -> Result<()> {
let s = Snac::init(c.source, c.user)?;
println!("export begin...");
let (mut u, mut t) = sync(&s, &n)?;
let mut r = sync(&s, &n)?;
match c.rotate {
Some(r) => loop {
println!("queue completed (updated: {u} / total: {t}), await {r} seconds to rotate...");
std::thread::sleep(std::time::Duration::from_secs(r));
(u, t) = sync(&s, &n)?;
Some(t) => loop {
println!(
"queue completed:\n\tcreated: {}\n\tupdated: {}\n\tdeleted:\n\t\tfiles: {}\n\t\tdirectories: {}\n\tignored: {}\n\ttotal: {}\nawait {t} seconds to rotate...",
r.created, r.updated, r.deleted.files, r.deleted.directories, r.ignored, r.total
);
std::thread::sleep(std::time::Duration::from_secs(t));
r = sync(&s, &n)?;
},
None => println!("export completed (updated: {u} / total: {t})."),
None => println!(
"export completed:\n\tcreated: {}\n\tupdated: {}\n\tdeleted:\n\t\tfiles: {}\n\t\tdirectories: {}\n\tignored: {}\n\ttotal: {}",
r.created, r.updated, r.deleted.files, r.deleted.directories, r.ignored, r.total
),
}
Ok(())
}
fn sync(snac: &Snac, nex: &Nex) -> Result<(usize, usize)> {
let mut t = 0; // total
let mut u = 0; // updated
fn sync(snac: &Snac, nex: &Nex) -> Result<Response> {
use std::collections::HashSet;
let mut r = Response::default();
for user in &snac.users {
println!("\tsync profile for `{}`...", user.name);
let mut keep = HashSet::with_capacity(100); // @TODO estimated
for post in user.public()? {
t += 1;
r.total += 1;
// make sure post entry has expected content type
if !post.is_note() {
todo!()
@ -49,12 +58,12 @@ fn sync(snac: &Snac, nex: &Nex) -> Result<(usize, usize)> {
// skip non authorized content
if let Some(content) = post.source_content {
println!("\t\tsync post `{}`...", post.id);
u += nex.sync(
let response = nex.sync(
&user.name,
content,
post.url,
post.attachment.map(|a| {
use nex::Source;
use nex::source::Source;
let mut attachments = Vec::with_capacity(a.len());
for attachment in a {
attachments.push((
@ -81,8 +90,31 @@ fn sync(snac: &Snac, nex: &Nex) -> Result<(usize, usize)> {
}),
(post.published, post.updated),
)?;
use nex::response::change::Change;
let f = ""; //response.file.to_string_lossy();
match response.change {
Change::Created => {
r.created += 1;
println!("\t\t\tcreate new post file `{f}`.")
}
Change::Ignored => {
r.ignored += 1;
println!("\t\t\tpost file `{f}` is up to date.")
}
Change::Updated => {
r.updated += 1;
println!("\t\t\tpost file `{f}` update with new content.")
}
}
for i in response.keep {
keep.insert(i);
}
}
}
// cleanup removed post entries
let d = nex.clean(&user.name, keep)?;
r.deleted.directories += d.directories;
r.deleted.files += d.files;
}
Ok((u, t))
Ok(r)
}