feat: account purge handler, tombstone cleanup, AP tombstone signing + 410

This commit is contained in:
2026-10-26 02:30:09 +01:00
parent 9a03de8956
commit 51a70b5260
32 changed files with 1708 additions and 27 deletions

View File

@@ -40,6 +40,7 @@ pub struct DatabaseOutput {
pub refresh_session: Arc<dyn RefreshSessionRepository>,
pub processed_events: Arc<dyn domain::ports::ProcessedEventLedger>,
pub deduplicator: Arc<dyn MovieDeduplicator>,
pub account_purger: Arc<dyn domain::ports::AccountPurger>,
pub image_ref_command: Arc<dyn ImageRefCommand>,
pub image_ref_query: Arc<dyn ImageRefQuery>,
pub follow_command: Arc<dyn domain::ports::FollowCommand>,
@@ -117,6 +118,10 @@ fn assemble(
refresh_session: Arc::new(sqlite::SqliteRefreshSessionAdapter::new(w.pool.clone())) as _,
processed_events: Arc::new(sqlite::SqliteProcessedEventLedger::new(w.pool.clone())) as _,
deduplicator: w.deduplicator,
account_purger: Arc::new(sqlite::SqliteAccountPurger::new(
w.pool.clone(),
instance.clone(),
)) as _,
image_ref_command,
image_ref_query,
follow_command: Arc::clone(&social) as _,

View File

@@ -123,15 +123,19 @@ pub async fn wire_server_social(
})
}
/// The worker's federation event handlers: the ActivityPub delivery handler and
/// the follow-accepted outbox backfill.
/// The worker's federation event handlers (the ActivityPub delivery handler and
/// the follow-accepted outbox backfill) and the notifier that tells followers
/// an account was deleted.
#[cfg(feature = "federation")]
pub async fn wire_worker_handlers(
db: &DatabaseOutput,
instance: &InstanceIdentity,
config: &config::AppConfig,
event_publisher: &Arc<dyn EventPublisher>,
) -> anyhow::Result<Vec<Arc<dyn domain::ports::EventHandler>>> {
) -> anyhow::Result<(
Vec<Arc<dyn domain::ports::EventHandler>>,
Arc<dyn domain::ports::FederationDeletionNotifier>,
)> {
let fed_repos = sqlite_federation::wire(db.db_pool.clone(), instance.clone());
let ap_wire = activitypub::wire(activitypub::ActivityPubDeps {
@@ -160,10 +164,13 @@ pub async fn wire_worker_handlers(
.await?;
tracing::info!("federation event handler registered");
Ok(vec![
ap_wire.event_handler,
Arc::new(crate::follow_backfill_handler::FollowBackfillHandler {
backfill: ap_wire.backfill,
}),
])
Ok((
vec![
ap_wire.event_handler,
Arc::new(crate::follow_backfill_handler::FollowBackfillHandler {
backfill: ap_wire.backfill,
}),
],
ap_wire.deletion_notifier,
))
}

View File

@@ -133,9 +133,12 @@ async fn assemble(
let image_ref_query = Arc::clone(&db.image_ref_query);
#[cfg(feature = "federation")]
let federation_handlers =
let (federation_handlers, deletion_notifier) =
crate::federation::wire_worker_handlers(&db, &instance, config, &event_publisher_arc)
.await?;
#[cfg(not(feature = "federation"))]
let deletion_notifier: Arc<dyn domain::ports::FederationDeletionNotifier> =
Arc::new(domain::ports::noop::NoopFederationDeletionNotifier);
let movie_command = db.movie_command;
let movie_query = db.movie_query;
@@ -148,6 +151,7 @@ async fn assemble(
let wrapup_repo = db.wrapup_repo;
let refresh_session = db.refresh_session;
let processed_events = db.processed_events;
let account_purger = db.account_purger;
let event_publisher = event_publisher_arc;
let metadata = metadata_client;
@@ -225,6 +229,9 @@ async fn assemble(
Arc::new(application::jobs::ProcessedEventsCleanupJob::new(
Arc::clone(&processed_events),
)),
Arc::new(application::jobs::TombstoneCleanupJob::new(Arc::clone(
&account_purger,
))),
];
if let Some(job) = enrichment_job {
periodic_jobs.push(job);
@@ -282,7 +289,15 @@ async fn assemble(
let reindex_handler = Arc::new(SearchReindexHandler::new(worker_deps.reindex_search))
as Arc<dyn EventHandler>;
let account_purge = Arc::new(application::users::purge_account::AccountPurgeHandler::new(
Arc::clone(&user),
deletion_notifier,
Arc::clone(&account_purger),
Arc::clone(&object_storage),
)) as Arc<dyn EventHandler>;
let mut h = vec![
account_purge,
poster,
cleanup,
search_cleanup,