add: user settings

fix: actually use cached stuff in auto_method macro
add: profile ui base
This commit is contained in:
trisua 2025-03-25 23:58:27 -04:00
parent 8580e34be2
commit 7d96a3d20f
16 changed files with 222 additions and 8 deletions

View file

@ -2,7 +2,7 @@ use super::*;
use crate::cache::Cache;
use crate::model::{
Error, Result,
auth::{Token, User},
auth::{Token, User, UserSettings},
permissions::FinePermission,
};
use crate::{auto_method, execute, get, query_row};
@ -145,6 +145,7 @@ impl DataManager {
}
auto_method!(update_user_tokens(Vec<Token>) -> "UPDATE users SET tokens = $1 WHERE id = $2" --serde --cache-key-tmpl="atto.user:{}");
auto_method!(update_user_settings(UserSettings) -> "UPDATE users SET settings = $1 WHERE id = $2" --serde --cache-key-tmpl="atto.user:{}");
auto_method!(incr_user_notifications() -> "UPDATE users SET notification_count = notification_count + 1 WHERE id = $1" --cache-key-tmpl="atto.user:{}" --incr);
auto_method!(decr_user_notifications() -> "UPDATE users SET notification_count = notification_count - 1 WHERE id = $1" --cache-key-tmpl="atto.user:{}" --decr);

View file

@ -50,6 +50,10 @@ macro_rules! auto_method {
($name:ident()@$select_fn:ident -> $query:literal --name=$name_:literal --returns=$returns_:tt --cache-key-tmpl=$cache_key_tmpl:literal) => {
pub async fn $name(&self, id: usize) -> Result<$returns_> {
if let Some(cached) = self.2.get(format!($cache_key_tmpl, id)).await {
return Ok(serde_json::from_str(&cached).unwrap());
}
let conn = match self.connect().await {
Ok(c) => c,
Err(e) => return Err(Error::DatabaseConnection(e.to_string())),
@ -94,6 +98,10 @@ macro_rules! auto_method {
($name:ident($selector_t:ty)@$select_fn:ident -> $query:literal --name=$name_:literal --returns=$returns_:tt --cache-key-tmpl=$cache_key_tmpl:literal) => {
pub async fn $name(&self, selector: $selector_t) -> Result<$returns_> {
if let Some(cached) = self.2.get(format!($cache_key_tmpl, selector)).await {
return Ok(serde_json::from_str(&cached).unwrap());
}
let conn = match self.connect().await {
Ok(c) => c,
Err(e) => return Err(Error::DatabaseConnection(e.to_string())),

View file

@ -9,7 +9,7 @@ use tetratto_shared::{
/// `(ip, token, creation timestamp)`
pub type Token = (String, String, usize);
#[derive(Debug, Serialize)]
#[derive(Debug, Serialize, Deserialize)]
pub struct User {
pub id: usize,
pub created: usize,
@ -25,11 +25,22 @@ pub struct User {
}
#[derive(Debug, Serialize, Deserialize)]
pub struct UserSettings;
pub struct UserSettings {
#[serde(default)]
pub display_name: String,
#[serde(default)]
pub biography: String,
#[serde(default)]
pub private_profile: bool,
}
impl Default for UserSettings {
fn default() -> Self {
Self {}
Self {
display_name: String::new(),
biography: String::new(),
private_profile: false,
}
}
}
@ -79,7 +90,7 @@ impl User {
}
}
#[derive(Debug, Serialize)]
#[derive(Debug, Serialize, Deserialize)]
pub struct Notification {
pub id: usize,
pub created: usize,