1
Fork 0
mirror of https://github.com/thegeneralist01/archivr synced 2026-07-21 18:55:36 +02:00

feat(settings): db — display_name column, InstanceSettings struct, profile and instance-settings helpers

This commit is contained in:
TheGeneralist 2026-06-26 17:17:34 +02:00
parent 4d0daf2dc0
commit 69af2d2060
Signed by: thegeneralist01
SSH key fingerprint: SHA256:pp9qddbCNmVNoSjevdvQvM5z0DHN7LTa8qBMbcMq/R4

View file

@ -130,6 +130,14 @@ pub struct RoleRecord {
pub is_builtin: bool, pub is_builtin: bool,
} }
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct InstanceSettings {
pub public_index_enabled: bool,
pub public_entry_content_enabled: bool,
pub open_registration_enabled: bool, // maps to public_archive_submission_enabled column
pub default_entry_visibility: u32,
}
#[derive(Debug, Clone, serde::Serialize)] #[derive(Debug, Clone, serde::Serialize)]
pub struct CollectionRecord { pub struct CollectionRecord {
pub id: i64, pub id: i64,
@ -417,6 +425,7 @@ pub fn initialize_auth_schema(conn: &Connection) -> Result<()> {
username TEXT NOT NULL UNIQUE, username TEXT NOT NULL UNIQUE,
email TEXT UNIQUE, email TEXT UNIQUE,
password_hash TEXT NOT NULL, password_hash TEXT NOT NULL,
display_name TEXT,
status TEXT NOT NULL CHECK (status IN ('active', 'disabled')), status TEXT NOT NULL CHECK (status IN ('active', 'disabled')),
role TEXT NOT NULL CHECK (role IN ('admin', 'user')), role TEXT NOT NULL CHECK (role IN ('admin', 'user')),
created_at TEXT NOT NULL, created_at TEXT NOT NULL,
@ -424,6 +433,9 @@ pub fn initialize_auth_schema(conn: &Connection) -> Result<()> {
); );
"#, "#,
)?; )?;
// Add display_name column to users if not present (idempotent migration)
let _ = conn.execute("ALTER TABLE users ADD COLUMN display_name TEXT", []);
Ok(()) Ok(())
} }
@ -645,6 +657,78 @@ pub fn list_user_tokens(conn: &Connection, user_id: i64) -> Result<Vec<ApiTokenR
Ok(records) Ok(records)
} }
pub fn get_instance_settings(conn: &Connection) -> Result<InstanceSettings> {
conn.query_row(
"SELECT public_index_enabled, public_entry_content_enabled,
public_archive_submission_enabled, default_entry_visibility
FROM instance_settings WHERE id = 1",
[],
|row| {
Ok(InstanceSettings {
public_index_enabled: row.get::<_, i64>(0)? != 0,
public_entry_content_enabled: row.get::<_, i64>(1)? != 0,
open_registration_enabled: row.get::<_, i64>(2)? != 0,
default_entry_visibility: row.get::<_, i64>(3)? as u32,
})
},
)
.map_err(Into::into)
}
pub fn update_instance_settings(conn: &Connection, settings: &InstanceSettings) -> Result<()> {
conn.execute(
"UPDATE instance_settings
SET public_index_enabled = ?1,
public_entry_content_enabled = ?2,
public_archive_submission_enabled = ?3,
default_entry_visibility = ?4
WHERE id = 1",
params![
settings.public_index_enabled as i64,
settings.public_entry_content_enabled as i64,
settings.open_registration_enabled as i64,
settings.default_entry_visibility as i64,
],
)?;
Ok(())
}
pub fn get_user_password_hash(conn: &Connection, user_id: i64) -> Result<Option<String>> {
conn.query_row(
"SELECT password_hash FROM users WHERE id = ?1",
[user_id],
|r| r.get(0),
)
.optional()
.map_err(Into::into)
}
pub fn update_user_password(conn: &Connection, user_id: i64, new_hash: &str) -> Result<()> {
conn.execute(
"UPDATE users SET password_hash = ?1 WHERE id = ?2",
params![new_hash, user_id],
)?;
Ok(())
}
pub fn update_user_display_name(conn: &Connection, user_id: i64, display_name: Option<&str>) -> Result<()> {
conn.execute(
"UPDATE users SET display_name = ?1 WHERE id = ?2",
params![display_name, user_id],
)?;
Ok(())
}
pub fn get_user_display_name(conn: &Connection, user_id: i64) -> Result<Option<String>> {
conn.query_row(
"SELECT display_name FROM users WHERE id = ?1",
[user_id],
|r| r.get(0),
)
.optional()
.map_err(Into::into)
}
/// Deletes all sessions for a user. Called on ban or role change. /// Deletes all sessions for a user. Called on ban or role change.
pub fn invalidate_user_sessions(conn: &Connection, user_id: i64) -> Result<usize> { pub fn invalidate_user_sessions(conn: &Connection, user_id: i64) -> Result<usize> {
let n = conn.execute("DELETE FROM sessions WHERE user_id = ?1", [user_id])?; let n = conn.execute("DELETE FROM sessions WHERE user_id = ?1", [user_id])?;