Add `published` field to outgoing activities (ref #4529)

pull/4554/head
Felix Ableitner 2024-03-19 10:50:14 +01:00
parent 2fd81067c7
commit 1d5b474c05
2 changed files with 23 additions and 1 deletions

2
Cargo.lock generated
View File

@ -2633,6 +2633,7 @@ version = "0.19.3"
dependencies = [ dependencies = [
"activitypub_federation", "activitypub_federation",
"actix-web", "actix-web",
"anyhow",
"chrono", "chrono",
"encoding", "encoding",
"enum-map", "enum-map",
@ -2645,6 +2646,7 @@ dependencies = [
"lemmy_db_views_moderator", "lemmy_db_views_moderator",
"lemmy_utils", "lemmy_utils",
"mime", "mime",
"moka",
"once_cell", "once_cell",
"pretty_assertions", "pretty_assertions",
"regex", "regex",

View File

@ -30,6 +30,7 @@ use activitypub_federation::{
traits::{ActivityHandler, Actor}, traits::{ActivityHandler, Actor},
}; };
use anyhow::anyhow; use anyhow::anyhow;
use chrono::{DateTime, Local, Utc};
use lemmy_api_common::{ use lemmy_api_common::{
context::LemmyContext, context::LemmyContext,
send_activity::{ActivityChannel, SendActivityData}, send_activity::{ActivityChannel, SendActivityData},
@ -204,8 +205,9 @@ where
{ {
info!("Saving outgoing activity to queue {}", activity.id()); info!("Saving outgoing activity to queue {}", activity.id());
let activity = WithPublished::new(activity);
let form = SentActivityForm { let form = SentActivityForm {
ap_id: activity.id().clone().into(), ap_id: activity.inner.id().clone().into(),
data: serde_json::to_value(activity)?, data: serde_json::to_value(activity)?,
sensitive, sensitive,
send_inboxes: send_targets send_inboxes: send_targets
@ -223,6 +225,24 @@ where
Ok(()) Ok(())
} }
/// Wrapper struct that adds `published` field with timestamp to outgoing activities. Important that
/// the timestamp includes milliseconds and timezone.
#[derive(Serialize)]
struct WithPublished<T> {
published: DateTime<Utc>,
#[serde(flatten)]
inner: T,
}
impl<T> WithPublished<T> {
pub fn new(inner: T) -> WithPublished<T> {
Self {
published: Local::now().into(),
inner,
}
}
}
pub async fn handle_outgoing_activities(context: Data<LemmyContext>) { pub async fn handle_outgoing_activities(context: Data<LemmyContext>) {
while let Some(data) = ActivityChannel::retrieve_activity().await { while let Some(data) = ActivityChannel::retrieve_activity().await {
if let Err(e) = match_outgoing_activities(data, &context.reset_request_count()).await { if let Err(e) = match_outgoing_activities(data, &context.reset_request_count()).await {