Update actor JSON object in database when receiving Update(Person) activity

This commit is contained in:
silverpill 2021-12-31 12:01:08 +00:00
parent 5b0a9ff931
commit a9a99d7172
6 changed files with 28 additions and 6 deletions

View file

@ -150,7 +150,7 @@ pub async fn fetch_profile_by_actor_id(
avatar,
banner,
extra_fields,
actor: Some(actor_value),
actor_json: Some(actor_value),
};
Ok(profile_data)
}

View file

@ -536,12 +536,29 @@ pub async fn receive_activity(
}
},
(UPDATE, PERSON) => {
let actor_value = activity.object.clone();
let actor: Actor = serde_json::from_value(activity.object)
.map_err(|_| ValidationError("invalid actor data"))?;
let profile = get_profile_by_actor_id(db_client, &actor.id).await?;
let (avatar, banner) = fetch_avatar_and_banner(&actor, &config.media_dir()).await
.map_err(|_| ValidationError("failed to fetch image"))?;
let extra_fields = actor.extra_fields();
let actor_old = profile.remote_actor()
.map_err(|_| HttpError::InternalError)?.unwrap();
if actor_old.id != actor.id {
log::warn!(
"actor ID changed from {} to {}",
actor_old.id,
actor.id,
);
};
if actor_old.public_key.public_key_pem != actor.public_key.public_key_pem {
log::warn!(
"actor public key changed from {} to {}",
actor_old.public_key.public_key_pem,
actor.public_key.public_key_pem,
);
};
let mut profile_data = ProfileUpdateData {
display_name: actor.name,
bio: actor.summary.clone(),
@ -549,6 +566,7 @@ pub async fn receive_activity(
avatar,
banner,
extra_fields,
actor_json: Some(actor_value),
};
profile_data.clean()?;
update_profile(db_client, &profile.id, profile_data).await?;

View file

@ -168,6 +168,7 @@ impl AccountUpdateData {
avatar,
banner,
extra_fields,
actor_json: None,
};
Ok(profile_data)
}

View file

@ -43,7 +43,7 @@ pub async fn create_profile(
&profile_data.avatar,
&profile_data.banner,
&extra_fields,
&profile_data.actor,
&profile_data.actor_json,
],
).await.map_err(catch_unique_violation("profile"))?;
let profile = row.try_get("actor_profile")?;
@ -64,8 +64,9 @@ pub async fn update_profile(
bio_source = $3,
avatar_file_name = $4,
banner_file_name = $5,
extra_fields = $6
WHERE id = $7
extra_fields = $6,
actor_json = $7
WHERE id = $8
RETURNING actor_profile
",
&[
@ -75,6 +76,7 @@ pub async fn update_profile(
&data.avatar,
&data.banner,
&ExtraFields(data.extra_fields),
&data.actor_json,
&profile_id,
],
).await?;

View file

@ -138,7 +138,7 @@ pub struct ProfileCreateData {
pub avatar: Option<String>,
pub banner: Option<String>,
pub extra_fields: Vec<ExtraField>,
pub actor: Option<Value>,
pub actor_json: Option<Value>,
}
impl ProfileCreateData {
@ -156,6 +156,7 @@ pub struct ProfileUpdateData {
pub avatar: Option<String>,
pub banner: Option<String>,
pub extra_fields: Vec<ExtraField>,
pub actor_json: Option<Value>,
}
impl ProfileUpdateData {

View file

@ -83,7 +83,7 @@ pub async fn create_user(
avatar: None,
banner: None,
extra_fields: vec![],
actor: None,
actor_json: None,
};
let profile = create_profile(&transaction, &profile_data).await?;
// Create user