*,
};
use lemmy_apub::{
- generate_apub_endpoint,
generate_followers_url,
generate_inbox_url,
+ generate_local_apub_endpoint,
generate_shared_inbox_url,
+ generate_site_inbox_url,
EndpointType,
};
-use lemmy_db_queries::{
- source::{comment::Comment_, post::Post_, private_message::PrivateMessage_},
- Crud,
-};
use lemmy_db_schema::{
naive_now,
source::{
person::{Person, PersonForm},
post::Post,
private_message::PrivateMessage,
+ site::{Site, SiteForm},
},
+ traits::Crud,
};
use lemmy_utils::{apub::generate_actor_keypair, LemmyError};
-use log::info;
+use tracing::info;
+use url::Url;
pub fn run_advanced_migrations(
conn: &PgConnection,
private_message_updates_2020_05_05(conn, protocol_and_hostname)?;
post_thumbnail_url_updates_2020_07_27(conn, protocol_and_hostname)?;
apub_columns_2021_02_02(conn)?;
+ instance_actor_2022_01_28(conn, protocol_and_hostname)?;
Ok(())
}
// Update the actor_id, private_key, and public_key, last_refreshed_at
let incorrect_persons = person
- .filter(actor_id.like("http://changeme_%"))
+ .filter(actor_id.like("http://changeme%"))
.filter(local.eq(true))
.load::<Person>(conn)?;
let form = PersonForm {
name: cperson.name.to_owned(),
- actor_id: Some(generate_apub_endpoint(
+ actor_id: Some(generate_local_apub_endpoint(
EndpointType::Person,
&cperson.name,
protocol_and_hostname,
)?),
private_key: Some(Some(keypair.private_key)),
- public_key: Some(Some(keypair.public_key)),
+ public_key: keypair.public_key,
last_refreshed_at: Some(naive_now()),
..PersonForm::default()
};
// Update the actor_id, private_key, and public_key, last_refreshed_at
let incorrect_communities = community
- .filter(actor_id.like("http://changeme_%"))
+ .filter(actor_id.like("http://changeme%"))
.filter(local.eq(true))
.load::<Community>(conn)?;
for ccommunity in &incorrect_communities {
let keypair = generate_actor_keypair()?;
- let community_actor_id = generate_apub_endpoint(
+ let community_actor_id = generate_local_apub_endpoint(
EndpointType::Community,
&ccommunity.name,
protocol_and_hostname,
name: ccommunity.name.to_owned(),
title: ccommunity.title.to_owned(),
description: ccommunity.description.to_owned(),
- removed: None,
- deleted: None,
- nsfw: None,
- updated: None,
+ hidden: Some(false),
actor_id: Some(community_actor_id.to_owned()),
local: Some(ccommunity.local),
- private_key: Some(keypair.private_key),
- public_key: Some(keypair.public_key),
+ private_key: Some(Some(keypair.private_key)),
+ public_key: keypair.public_key,
last_refreshed_at: Some(naive_now()),
- published: None,
icon: Some(ccommunity.icon.to_owned()),
banner: Some(ccommunity.banner.to_owned()),
- followers_url: None,
- inbox_url: None,
- shared_inbox_url: None,
+ ..Default::default()
};
Community::update(conn, ccommunity.id, &form)?;
// Update the ap_id
let incorrect_posts = post
- .filter(ap_id.like("http://changeme_%"))
+ .filter(ap_id.like("http://changeme%"))
.filter(local.eq(true))
.load::<Post>(conn)?;
for cpost in &incorrect_posts {
- let apub_id = generate_apub_endpoint(
+ let apub_id = generate_local_apub_endpoint(
EndpointType::Post,
&cpost.id.to_string(),
protocol_and_hostname,
// Update the ap_id
let incorrect_comments = comment
- .filter(ap_id.like("http://changeme_%"))
+ .filter(ap_id.like("http://changeme%"))
.filter(local.eq(true))
.load::<Comment>(conn)?;
for ccomment in &incorrect_comments {
- let apub_id = generate_apub_endpoint(
+ let apub_id = generate_local_apub_endpoint(
EndpointType::Comment,
&ccomment.id.to_string(),
protocol_and_hostname,
// Update the ap_id
let incorrect_pms = private_message
- .filter(ap_id.like("http://changeme_%"))
+ .filter(ap_id.like("http://changeme%"))
.filter(local.eq(true))
.load::<PrivateMessage>(conn)?;
for cpm in &incorrect_pms {
- let apub_id = generate_apub_endpoint(
+ let apub_id = generate_local_apub_endpoint(
EndpointType::PrivateMessage,
&cpm.id.to_string(),
protocol_and_hostname,
{
use lemmy_db_schema::schema::person::dsl::*;
let persons = person
- .filter(inbox_url.like("http://changeme_%"))
+ .filter(inbox_url.like("http://changeme%"))
.load::<Person>(conn)?;
for p in &persons {
{
use lemmy_db_schema::schema::community::dsl::*;
let communities = community
- .filter(inbox_url.like("http://changeme_%"))
+ .filter(inbox_url.like("http://changeme%"))
.load::<Community>(conn)?;
for c in &communities {
Ok(())
}
+
+/// Site object turns into an actor, so that things like instance description can be federated. This
+/// means we need to add actor columns to the site table, and initialize them with correct values.
+/// Before this point, there is only a single value in the site table which refers to the local
+/// Lemmy instance, so thats all we need to update.
+fn instance_actor_2022_01_28(
+ conn: &PgConnection,
+ protocol_and_hostname: &str,
+) -> Result<(), LemmyError> {
+ info!("Running instance_actor_2021_09_29");
+ if let Ok(site) = Site::read_local_site(conn) {
+ let key_pair = generate_actor_keypair()?;
+ let actor_id = Url::parse(protocol_and_hostname)?;
+ let site_form = SiteForm {
+ name: site.name,
+ actor_id: Some(actor_id.clone().into()),
+ last_refreshed_at: Some(naive_now()),
+ inbox_url: Some(generate_site_inbox_url(&actor_id.into())?),
+ private_key: Some(Some(key_pair.private_key)),
+ public_key: Some(key_pair.public_key),
+ ..Default::default()
+ };
+ Site::update(conn, site.id, &site_form)?;
+ }
+ Ok(())
+}