use chrono::Utc; use super::*; use crate::db::tables::shared_thread; impl Database { pub async fn upsert_shared_thread( &self, id: SharedThreadId, user_id: UserId, title: &str, data: Vec, ) -> Result<()> { let title = title.to_string(); self.transaction(|tx| { let title = title.clone(); let data = data.clone(); async move { let now = Utc::now().naive_utc(); let existing = shared_thread::Entity::find_by_id(id).one(&*tx).await?; match existing { Some(existing) => { if existing.user_id != user_id { Err(anyhow!("Cannot update shared thread owned by another user"))?; } let mut active: shared_thread::ActiveModel = existing.into(); active.title = ActiveValue::Set(title); active.data = ActiveValue::Set(data); active.updated_at = ActiveValue::Set(now); active.update(&*tx).await?; } None => { shared_thread::ActiveModel { id: ActiveValue::Set(id), user_id: ActiveValue::Set(user_id), title: ActiveValue::Set(title), data: ActiveValue::Set(data), created_at: ActiveValue::Set(now), updated_at: ActiveValue::Set(now), } .insert(&*tx) .await?; } } Ok(()) } }) .await } pub async fn get_shared_thread( &self, share_id: SharedThreadId, ) -> Result> { self.transaction(|tx| async move { let Some(thread) = shared_thread::Entity::find_by_id(share_id) .one(&*tx) .await? else { return Ok(None); }; let user = user::Entity::find_by_id(thread.user_id).one(&*tx).await?; let username = user .map(|u| u.github_login) .unwrap_or_else(|| "Unknown".to_string()); Ok(Some((thread, username))) }) .await } }