+
+/// This ensures that your local site is initialized and exists.
+///
+/// If a site already exists, the DB migration should generate a local_site row.
+/// This will only be run for brand new sites.
+fn initialize_local_site_2022_10_10(
+ conn: &mut PgConnection,
+ settings: &Settings,
+) -> Result<(), LemmyError> {
+ info!("Running initialize_local_site_2022_10_10");
+
+ // Check to see if local_site exists
+ if LocalSite::read(conn).is_ok() {
+ return Ok(());
+ }
+ info!("No Local Site found, creating it.");
+
+ let domain = settings
+ .get_hostname_without_port()
+ .expect("must have domain");
+
+ // Upsert this to the instance table
+ let instance = Instance::create(conn, &domain)?;
+
+ if let Some(setup) = &settings.setup {
+ let person_keypair = generate_actor_keypair()?;
+ let person_actor_id = generate_local_apub_endpoint(
+ EndpointType::Person,
+ &setup.admin_username,
+ &settings.get_protocol_and_hostname(),
+ )?;
+
+ // Register the user if there's a site setup
+ let person_form = PersonInsertForm::builder()
+ .name(setup.admin_username.to_owned())
+ .admin(Some(true))
+ .instance_id(instance.id)
+ .actor_id(Some(person_actor_id.clone()))
+ .private_key(Some(person_keypair.private_key))
+ .public_key(person_keypair.public_key)
+ .inbox_url(Some(generate_inbox_url(&person_actor_id)?))
+ .shared_inbox_url(Some(generate_shared_inbox_url(&person_actor_id)?))
+ .build();
+ let person_inserted = Person::create(conn, &person_form)?;
+
+ let local_user_form = LocalUserInsertForm::builder()
+ .person_id(person_inserted.id)
+ .password_encrypted(setup.admin_password.to_owned())
+ .email(setup.admin_email.to_owned())
+ .build();
+ LocalUser::create(conn, &local_user_form)?;
+ };
+
+ // Add an entry for the site table
+ let site_key_pair = generate_actor_keypair()?;
+ let site_actor_id = Url::parse(&settings.get_protocol_and_hostname())?;
+
+ let site_form = SiteInsertForm::builder()
+ .name(
+ settings
+ .setup
+ .to_owned()
+ .map(|s| s.site_name)
+ .unwrap_or_else(|| "New Site".to_string()),
+ )
+ .instance_id(instance.id)
+ .actor_id(Some(site_actor_id.clone().into()))
+ .last_refreshed_at(Some(naive_now()))
+ .inbox_url(Some(generate_site_inbox_url(&site_actor_id.into())?))
+ .private_key(Some(site_key_pair.private_key))
+ .public_key(Some(site_key_pair.public_key))
+ .build();
+ let site = Site::create(conn, &site_form)?;
+
+ // Finally create the local_site row
+ let local_site_form = LocalSiteInsertForm::builder()
+ .site_id(site.id)
+ .site_setup(Some(settings.setup.is_some()))
+ .build();
+ let local_site = LocalSite::create(conn, &local_site_form)?;
+
+ // Create the rate limit table
+ let local_site_rate_limit_form = LocalSiteRateLimitInsertForm::builder()
+ // TODO these have to be set, because the database defaults are too low for the federation
+ // tests to pass, and there's no way to live update the rate limits without restarting the
+ // server.
+ // This can be removed once live rate limits are enabled.
+ .message(Some(999))
+ .post(Some(999))
+ .register(Some(999))
+ .image(Some(999))
+ .comment(Some(999))
+ .search(Some(999))
+ .local_site_id(local_site.id)
+ .build();
+ LocalSiteRateLimit::create(conn, &local_site_rate_limit_form)?;
+
+ Ok(())
+}