mirror of
https://github.com/Nutomic/ibis.git
synced 2024-11-22 12:31:08 +00:00
Add ghost user to be able to fetch articles in case edit author cant be fetched
This commit is contained in:
parent
026c8c81f2
commit
1a0acca3a0
3 changed files with 39 additions and 2 deletions
|
@ -164,4 +164,31 @@ impl DbPerson {
|
||||||
.select(instance::all_columns)
|
.select(instance::all_columns)
|
||||||
.get_results(conn.deref_mut())?)
|
.get_results(conn.deref_mut())?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Ghost user serves as placeholder for deleted accounts
|
||||||
|
pub fn ghost(data: &Data<IbisData>) -> MyResult<DbPerson> {
|
||||||
|
let username = "ghost";
|
||||||
|
let read = DbPerson::read_from_name(username, &None, data);
|
||||||
|
if read.is_ok() {
|
||||||
|
read
|
||||||
|
} else {
|
||||||
|
let domain = &data.config.federation.domain;
|
||||||
|
let ap_id = ObjectId::parse(&format!(
|
||||||
|
"{}://{domain}/user/{username}",
|
||||||
|
http_protocol_str()
|
||||||
|
))?;
|
||||||
|
let inbox_url = format!("{}://{domain}/inbox", http_protocol_str());
|
||||||
|
let keypair = generate_actor_keypair()?;
|
||||||
|
let person_form = DbPersonForm {
|
||||||
|
username: username.to_string(),
|
||||||
|
ap_id,
|
||||||
|
inbox_url,
|
||||||
|
public_key: keypair.public_key,
|
||||||
|
private_key: Some(keypair.private_key),
|
||||||
|
last_refreshed_at: Utc::now(),
|
||||||
|
local: true,
|
||||||
|
};
|
||||||
|
DbPerson::create(&person_form, data)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ use activitypub_federation::{
|
||||||
traits::Object,
|
traits::Object,
|
||||||
};
|
};
|
||||||
use chrono::{DateTime, Utc};
|
use chrono::{DateTime, Utc};
|
||||||
|
use log::warn;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
|
@ -77,8 +78,14 @@ impl Object for DbEdit {
|
||||||
|
|
||||||
async fn from_json(json: Self::Kind, data: &Data<Self::DataType>) -> Result<Self, Self::Error> {
|
async fn from_json(json: Self::Kind, data: &Data<Self::DataType>) -> Result<Self, Self::Error> {
|
||||||
let article = json.object.dereference(data).await?;
|
let article = json.object.dereference(data).await?;
|
||||||
let creator = json.attributed_to.dereference(data).await?;
|
let creator = match json.attributed_to.dereference(data).await {
|
||||||
// TODO: if creator fails to fetch, make a dummy user
|
Ok(c) => c,
|
||||||
|
Err(e) => {
|
||||||
|
// If actor couldnt be fetched, use ghost as placeholder
|
||||||
|
warn!("Failed to fetch user {}: {e}", json.attributed_to);
|
||||||
|
DbPerson::ghost(data)?
|
||||||
|
}
|
||||||
|
};
|
||||||
let form = DbEditForm {
|
let form = DbEditForm {
|
||||||
creator_id: creator.id,
|
creator_id: creator.id,
|
||||||
ap_id: json.id,
|
ap_id: json.id,
|
||||||
|
|
|
@ -169,6 +169,9 @@ async fn setup(data: &Data<IbisData>) -> Result<(), Error> {
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
|
// create ghost user
|
||||||
|
DbPerson::ghost(data)?;
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue