use crate::{
activities::{generate_activity_id, send_lemmy_activity, verify_activity, verify_is_public},
activity_lists::AnnouncableActivities,
- http::{is_activity_already_known, ActivityCommonFields},
+ http::ActivityCommonFields,
insert_activity,
objects::community::ApubCommunity,
protocol::activities::{community::announce::AnnounceActivity, CreateOrUpdateType},
let object_value = serde_json::to_value(&self.object)?;
let object_data: ActivityCommonFields = serde_json::from_value(object_value.to_owned())?;
- if is_activity_already_known(context.pool(), &object_data.id).await? {
- return Ok(());
- }
insert_activity(&object_data.id, object_value, false, true, context.pool()).await?;
}
}
traits::{ActivityHandler, ActorType},
APUB_JSON_CONTENT_TYPE,
};
-use lemmy_db_schema::{source::activity::Activity, DbPool};
+use lemmy_db_schema::source::activity::Activity;
use lemmy_utils::{location_info, LemmyError};
use lemmy_websocket::LemmyContext;
use log::info;
.await?;
verify_signature(&request, &actor.public_key())?;
- // Do nothing if we received the same activity before
- if is_activity_already_known(context.pool(), &activity_data.id).await? {
- return Ok(HttpResponse::Ok().finish());
- }
info!("Verifying activity {}", activity_data.id.to_string());
activity
.verify(&Data::new(context.clone()), request_counter)
}
}
-pub(crate) async fn is_activity_already_known(
- pool: &DbPool,
- activity_id: &Url,
-) -> Result<bool, LemmyError> {
- let activity_id = activity_id.to_owned().into();
- let existing = blocking(pool, move |conn| {
- Activity::read_from_apub_id(conn, &activity_id)
- })
- .await?;
- match existing {
- Ok(_) => Ok(true),
- Err(_) => Ok(false),
- }
-}
-
fn assert_activity_not_local(id: &Url, hostname: &str) -> Result<(), LemmyError> {
let activity_domain = id.domain().context(location_info!())?;
let inserted_activity = Activity::create(&conn, &activity_form).unwrap();
let expected_activity = Activity {
- ap_id: Some(ap_id.clone()),
+ ap_id: ap_id.clone(),
id: inserted_activity.id,
data: test_json,
local: true,
local -> Bool,
published -> Timestamp,
updated -> Nullable<Timestamp>,
- ap_id -> Nullable<Text>,
+ ap_id -> Text,
sensitive -> Nullable<Bool>,
}
}
pub local: bool,
pub published: chrono::NaiveDateTime,
pub updated: Option<chrono::NaiveDateTime>,
- pub ap_id: Option<DbUrl>,
+ pub ap_id: DbUrl,
pub sensitive: Option<bool>,
}
--- /dev/null
+alter table activity alter column ap_id drop not null;
+
+create unique index idx_activity_unique_apid on activity ((data ->> 'id'::text));
+
+drop index idx_activity_ap_id;
--- /dev/null
+
+-- Delete the empty ap_ids
+delete from activity where ap_id is null;
+
+-- Make it required
+alter table activity alter column ap_id set not null;
+
+-- Delete dupes, keeping the first one
+delete
+from activity
+where id not in (
+ select min(id)
+ from activity
+ group by ap_id
+);
+
+-- The index
+create unique index idx_activity_ap_id on activity(ap_id);
+
+-- Drop the old index
+drop index idx_activity_unique_apid;
+