feat: expire cache when updating user
Some checks failed
ci/woodpecker/push/publish-docs Pipeline is pending
ci/woodpecker/push/build-and-publish Pipeline failed

This commit is contained in:
Radical 2025-06-01 14:09:38 +02:00
parent cade49d9c6
commit 57f52d96df
2 changed files with 39 additions and 16 deletions

View file

@ -81,8 +81,7 @@ pub async fn update(
let byte_slice: &[u8] = &bytes; let byte_slice: &[u8] = &bytes;
me.set_avatar( me.set_avatar(
&data.bunny_cdn, &data,
&mut conn,
data.config.bunny.cdn_url.clone(), data.config.bunny.cdn_url.clone(),
byte_slice.into(), byte_slice.into(),
) )
@ -91,15 +90,15 @@ pub async fn update(
if let Some(new_info) = form.json.0 { if let Some(new_info) = form.json.0 {
if let Some(username) = &new_info.username { if let Some(username) = &new_info.username {
me.set_username(&mut conn, username.clone()).await?; me.set_username(&data, username.clone()).await?;
} }
if let Some(display_name) = &new_info.display_name { if let Some(display_name) = &new_info.display_name {
me.set_display_name(&mut conn, display_name.clone()).await?; me.set_display_name(&data, display_name.clone()).await?;
} }
if let Some(email) = &new_info.email { if let Some(email) = &new_info.email {
me.set_email(&mut conn, email.to_string()).await?; me.set_email(&data, email.to_string()).await?;
} }
} }

View file

@ -961,25 +961,27 @@ impl Me {
pub async fn set_avatar( pub async fn set_avatar(
&mut self, &mut self,
bunny_cdn: &bunny_api_tokio::Client, data: &Data,
conn: &mut Conn,
cdn_url: Url, cdn_url: Url,
avatar: BytesMut, avatar: BytesMut,
) -> Result<(), Error> { ) -> Result<(), Error> {
let avatar_clone = avatar.clone(); let avatar_clone = avatar.clone();
let image_type = task::spawn_blocking(move || image_check(avatar_clone)).await??; let image_type = task::spawn_blocking(move || image_check(avatar_clone)).await??;
let mut conn = data.pool.get().await?;
if let Some(avatar) = &self.avatar { if let Some(avatar) = &self.avatar {
let avatar_url: Url = avatar.parse()?; let avatar_url: Url = avatar.parse()?;
let relative_url = avatar_url.path().trim_start_matches('/'); let relative_url = avatar_url.path().trim_start_matches('/');
bunny_cdn.storage.delete(relative_url).await?; data.bunny_cdn.storage.delete(relative_url).await?;
} }
let path = format!("avatar/{}/avatar.{}", self.uuid, image_type); let path = format!("avatar/{}/avatar.{}", self.uuid, image_type);
bunny_cdn data.
bunny_cdn
.storage .storage
.upload(path.clone(), avatar.into()) .upload(path.clone(), avatar.into())
.await?; .await?;
@ -990,9 +992,13 @@ impl Me {
update(users::table) update(users::table)
.filter(dsl::uuid.eq(self.uuid)) .filter(dsl::uuid.eq(self.uuid))
.set(dsl::avatar.eq(avatar_url.as_str())) .set(dsl::avatar.eq(avatar_url.as_str()))
.execute(conn) .execute(&mut conn)
.await?; .await?;
if data.get_cache_key(self.uuid.to_string()).await.is_ok() {
data.del_cache_key(self.uuid.to_string()).await?
}
self.avatar = Some(avatar_url.to_string()); self.avatar = Some(avatar_url.to_string());
Ok(()) Ok(())
@ -1011,20 +1017,26 @@ impl Me {
pub async fn set_username( pub async fn set_username(
&mut self, &mut self,
conn: &mut Conn, data: &Data,
new_username: String, new_username: String,
) -> Result<(), Error> { ) -> Result<(), Error> {
if !USERNAME_REGEX.is_match(&new_username) { if !USERNAME_REGEX.is_match(&new_username) {
return Err(Error::BadRequest("Invalid username".to_string())); return Err(Error::BadRequest("Invalid username".to_string()));
} }
let mut conn = data.pool.get().await?;
use users::dsl; use users::dsl;
update(users::table) update(users::table)
.filter(dsl::uuid.eq(self.uuid)) .filter(dsl::uuid.eq(self.uuid))
.set(dsl::username.eq(new_username.as_str())) .set(dsl::username.eq(new_username.as_str()))
.execute(conn) .execute(&mut conn)
.await?; .await?;
if data.get_cache_key(self.uuid.to_string()).await.is_ok() {
data.del_cache_key(self.uuid.to_string()).await?
}
self.username = new_username; self.username = new_username;
Ok(()) Ok(())
@ -1032,26 +1044,34 @@ impl Me {
pub async fn set_display_name( pub async fn set_display_name(
&mut self, &mut self,
conn: &mut Conn, data: &Data,
new_display_name: String, new_display_name: String,
) -> Result<(), Error> { ) -> Result<(), Error> {
let mut conn = data.pool.get().await?;
use users::dsl; use users::dsl;
update(users::table) update(users::table)
.filter(dsl::uuid.eq(self.uuid)) .filter(dsl::uuid.eq(self.uuid))
.set(dsl::display_name.eq(new_display_name.as_str())) .set(dsl::display_name.eq(new_display_name.as_str()))
.execute(conn) .execute(&mut conn)
.await?; .await?;
if data.get_cache_key(self.uuid.to_string()).await.is_ok() {
data.del_cache_key(self.uuid.to_string()).await?
}
self.display_name = Some(new_display_name); self.display_name = Some(new_display_name);
Ok(()) Ok(())
} }
pub async fn set_email(&mut self, conn: &mut Conn, new_email: String) -> Result<(), Error> { pub async fn set_email(&mut self, data: &Data, new_email: String) -> Result<(), Error> {
if !EMAIL_REGEX.is_match(&new_email) { if !EMAIL_REGEX.is_match(&new_email) {
return Err(Error::BadRequest("Invalid username".to_string())); return Err(Error::BadRequest("Invalid username".to_string()));
} }
let mut conn = data.pool.get().await?;
use users::dsl; use users::dsl;
update(users::table) update(users::table)
.filter(dsl::uuid.eq(self.uuid)) .filter(dsl::uuid.eq(self.uuid))
@ -1059,9 +1079,13 @@ impl Me {
dsl::email.eq(new_email.as_str()), dsl::email.eq(new_email.as_str()),
dsl::email_verified.eq(false), dsl::email_verified.eq(false),
)) ))
.execute(conn) .execute(&mut conn)
.await?; .await?;
if data.get_cache_key(self.uuid.to_string()).await.is_ok() {
data.del_cache_key(self.uuid.to_string()).await?
}
self.email = new_email; self.email = new_email;
Ok(()) Ok(())