# interval length for registration limit
register_per_second: 3600
}
-# # email sending configuration
+# # optional: parameters for automatic configuration of new instance (only used at first start)
+# setup: {
+# # username for the admin user
+# admin_username: "lemmy"
+# # password for the admin user
+# admin_password: "lemmy"
+# # name of the site (can be changed later)
+# site_name: "Lemmy Test"
+# }
+# # optional: email sending configuration
# email: {
# # hostname of the smtp server
# smtp_server: ""
use super::*;
+use crate::api::user::Register;
+use crate::api::{Oper, Perform};
+use crate::settings::Settings;
use diesel::PgConnection;
+use log::info;
use std::str::FromStr;
#[derive(Serialize, Deserialize)]
#[derive(Serialize, Deserialize)]
pub struct CreateSite {
- name: String,
- description: Option<String>,
- enable_downvotes: bool,
- open_registration: bool,
- enable_nsfw: bool,
- auth: String,
+ pub name: String,
+ pub description: Option<String>,
+ pub enable_downvotes: bool,
+ pub open_registration: bool,
+ pub enable_nsfw: bool,
+ pub auth: String,
}
#[derive(Serialize, Deserialize)]
fn perform(&self, conn: &PgConnection) -> Result<GetSiteResponse, Error> {
let _data: &GetSite = &self.data;
- // It can return a null site in order to redirect
- let site_view = match Site::read(&conn, 1) {
- Ok(_site) => Some(SiteView::read(&conn)?),
- Err(_e) => None,
+ let site = Site::read(&conn, 1);
+ let site_view = if site.is_ok() {
+ Some(SiteView::read(&conn)?)
+ } else if let Some(setup) = Settings::get().setup.as_ref() {
+ let register = Register {
+ username: setup.admin_username.to_owned(),
+ email: setup.admin_email.to_owned(),
+ password: setup.admin_password.to_owned(),
+ password_verify: setup.admin_password.to_owned(),
+ admin: true,
+ show_nsfw: true,
+ };
+ let login_response = Oper::new(register).perform(&conn)?;
+ info!("Admin {} created", setup.admin_username);
+
+ let create_site = CreateSite {
+ name: setup.site_name.to_owned(),
+ description: None,
+ enable_downvotes: false,
+ open_registration: false,
+ enable_nsfw: false,
+ auth: login_response.jwt,
+ };
+ Oper::new(create_site).perform(&conn)?;
+ info!("Site {} created", setup.site_name);
+ Some(SiteView::read(&conn)?)
+ } else {
+ None
};
let mut admins = UserView::admins(&conn)?;
#[derive(Serialize, Deserialize)]
pub struct Register {
- username: String,
- email: Option<String>,
- password: String,
- password_verify: String,
- admin: bool,
- show_nsfw: bool,
+ pub username: String,
+ pub email: Option<String>,
+ pub password: String,
+ pub password_verify: String,
+ pub admin: bool,
+ pub show_nsfw: bool,
}
#[derive(Serialize, Deserialize)]
#[derive(Serialize, Deserialize)]
pub struct LoginResponse {
- jwt: String,
+ pub jwt: String,
}
#[derive(Serialize, Deserialize)]
#[derive(Debug, Deserialize)]
pub struct Settings {
+ pub setup: Option<Setup>,
pub database: Database,
pub hostname: String,
pub bind: IpAddr,
pub federation_enabled: bool,
}
+#[derive(Debug, Deserialize)]
+pub struct Setup {
+ pub admin_username: String,
+ pub admin_password: String,
+ pub admin_email: Option<String>,
+ pub site_name: String,
+}
+
#[derive(Debug, Deserialize)]
pub struct RateLimitConfig {
pub message: i32,