add: metadata tetratto_owner_id

This commit is contained in:
trisua 2025-08-25 19:21:09 -04:00
parent be9189a474
commit 8fd5103479
5 changed files with 28 additions and 14 deletions

View file

@ -6,7 +6,7 @@
(div (div
("class" "card container") ("class" "card container")
(h1 (text "{{ entry.slug }}")) (h1 (text "{{ entry.slug }}"))
(p (text "Custom slug reclaims are handled through ") (b (text "{{ tetratto }}")) (text ". You'll need to have an account there to submit a claim request.")) (p (text "Custom slug reclaims are handled through ") (b (text "{{ config.service_hosts.tetratto }}")) (text ". You'll need to have an account there to submit a claim request."))
(p (text "Please note that you are unlikely to receive a response unless your claim is accepted. Please do not submit additional requests for the same slug.")) (p (text "Please note that you are unlikely to receive a response unless your claim is accepted. Please do not submit additional requests for the same slug."))
(text "{% if metadata.tetratto_owner_username -%}") (text "{% if metadata.tetratto_owner_username -%}")
@ -24,13 +24,13 @@
(text "{% if metadata.tetratto_owner_username -%}") (text "{% if metadata.tetratto_owner_username -%}")
; contact owner button ; contact owner button
(a (a
("href" "{{ tetratto }}/mail/compose?receivers={{ tetratto_owner_username }}&subject=Reclaim%20for%20%22{{ entry.slug }}%22") ("href" "{{ config.service_hosts.tetratto }}/mail/compose?receivers={{ tetratto_owner_username }}&subject=Reclaim%20for%20%22{{ entry.slug }}%22")
("class" "button surface no_fill") ("class" "button surface no_fill")
(text "{{ icon \"external-link\" }} Contact owner")) (text "{{ icon \"external-link\" }} Contact owner"))
(text "{%- endif %}") (text "{%- endif %}")
(a (a
("href" "{{ tetratto }}/mail/compose?receivers={{ tetratto_handler_account_username }}&subject=Reclaim%20for%20%22{{ entry.slug }}%22") ("href" "{{ config.service_hosts.tetratto }}/mail/compose?receivers={{ tetratto_handler_account_username }}&subject=Reclaim%20for%20%22{{ entry.slug }}%22")
("class" "button surface no_fill") ("class" "button surface no_fill")
(text "{{ icon \"external-link\" }} Submit request")) (text "{{ icon \"external-link\" }} Submit request"))
(text "{% else %}") (text "{% else %}")

View file

@ -46,10 +46,12 @@
(text "Owner:") (text "Owner:")
(a (a
("class" "flex items_center gap_2") ("class" "flex items_center gap_2")
("href" "{{ tetratto }}/@{{ metadata.tetratto_owner_username }}") ("href" "{{ config.service_hosts.tetratto }}/@{{ metadata.tetratto_owner_username }}")
(text "{% if metadata.tetratto_owner_id -%}")
(img (img
("class" "avatar") ("class" "avatar")
("src" "{{ tetratto }}/api/v1/auth/user/{{ metadata.tetratto_owner_username }}/avatar?selector_type=username")) ("src" "{{ config.service_hosts.buckets }}/avatars/{{ metadata.tetratto_owner_id }}"))
(text "{%- endif %}")
(text "{{ metadata.tetratto_owner_username }}"))) (text "{{ metadata.tetratto_owner_username }}")))
(text "{%- endif %}") (text "{%- endif %}")

View file

@ -3,6 +3,12 @@ use pathbufd::PathBufD;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use tetratto_shared::hash::random_id; use tetratto_shared::hash::random_id;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct ServiceHostsConfig {
pub tetratto: String,
pub buckets: String,
}
#[derive(Clone, Debug, Serialize, Deserialize)] #[derive(Clone, Debug, Serialize, Deserialize)]
pub struct Config { pub struct Config {
/// The name of the site. Shown in the UI. /// The name of the site. Shown in the UI.
@ -11,9 +17,6 @@ pub struct Config {
/// The (CSS) theme color of the site. Shown in the UI. /// The (CSS) theme color of the site. Shown in the UI.
#[serde(default = "default_theme_color")] #[serde(default = "default_theme_color")]
pub theme_color: String, pub theme_color: String,
/// The URL of the Tetratto host associated with this instance.
#[serde(default = "default_tetratto")]
pub tetratto: String,
/// The slug of the instance's information page. /// The slug of the instance's information page.
/// ///
/// Should be the pathname WITHOUT the leading slash. /// Should be the pathname WITHOUT the leading slash.
@ -29,6 +32,9 @@ pub struct Config {
/// Real IP header (for reverse proxy). /// Real IP header (for reverse proxy).
#[serde(default = "default_real_ip_header")] #[serde(default = "default_real_ip_header")]
pub real_ip_header: String, pub real_ip_header: String,
/// The host URL of required services.
#[serde(default = "default_service_hosts")]
pub service_hosts: ServiceHostsConfig,
/// The master password which is allowed to do anything without password checks. /// The master password which is allowed to do anything without password checks.
pub master_pass: String, pub master_pass: String,
} }
@ -41,10 +47,6 @@ fn default_theme_color() -> String {
"#a3b3ff".to_string() "#a3b3ff".to_string()
} }
fn default_tetratto() -> String {
"https://tetratto.com".to_string()
}
fn default_what_page_slug() -> String { fn default_what_page_slug() -> String {
"what".to_string() "what".to_string()
} }
@ -61,6 +63,13 @@ fn default_real_ip_header() -> String {
"CF-Connecting-IP".to_string() "CF-Connecting-IP".to_string()
} }
fn default_service_hosts() -> ServiceHostsConfig {
ServiceHostsConfig {
tetratto: "https://tetratto.com".to_string(),
buckets: "https://assetdelivery.tetratto.com".to_string(),
}
}
impl Configuration for Config { impl Configuration for Config {
fn db_config(&self) -> DatabaseConfig { fn db_config(&self) -> DatabaseConfig {
self.database.to_owned() self.database.to_owned()
@ -72,11 +81,11 @@ impl Default for Config {
Self { Self {
name: default_name(), name: default_name(),
theme_color: default_theme_color(), theme_color: default_theme_color(),
tetratto: default_tetratto(),
what_page_slug: default_what_page_slug(), what_page_slug: default_what_page_slug(),
tetratto_handler_account_username: default_tetratto_handler_account_username(), tetratto_handler_account_username: default_tetratto_handler_account_username(),
database: default_database(), database: default_database(),
real_ip_header: default_real_ip_header(), real_ip_header: default_real_ip_header(),
service_hosts: default_service_hosts(),
master_pass: random_id(), master_pass: random_id(),
} }
} }

View file

@ -444,6 +444,9 @@ pub struct EntryMetadata {
#[serde(default, alias = "TETRATTO_OWNER_USERNAME")] #[serde(default, alias = "TETRATTO_OWNER_USERNAME")]
#[validate(max_length = 32)] #[validate(max_length = 32)]
pub tetratto_owner_username: String, pub tetratto_owner_username: String,
/// The ID of the owner of this entry on the Tetratto instance.
#[serde(default, alias = "TETRATTO_OWNER_ID")]
pub tetratto_owner_id: usize,
} }
macro_rules! metadata_css { macro_rules! metadata_css {

View file

@ -42,7 +42,7 @@ fn default_context(config: &Config, build_code: &str) -> Context {
let mut ctx = Context::new(); let mut ctx = Context::new();
ctx.insert("name", &config.name); ctx.insert("name", &config.name);
ctx.insert("theme_color", &config.theme_color); ctx.insert("theme_color", &config.theme_color);
ctx.insert("tetratto", &config.tetratto); ctx.insert("config", &config);
ctx.insert("what_page_slug", &config.what_page_slug); ctx.insert("what_page_slug", &config.what_page_slug);
ctx.insert( ctx.insert(
"tetratto_handler_account_username", "tetratto_handler_account_username",