use std::fmt::Write as _; use super::Uuid; /// Insert mention rows for a post (batch insert). Ignores duplicates. #[tracing::instrument(skip_all)] pub async fn insert_mentions<'e, E: sqlx::PgExecutor<'e>>( executor: E, post_id: Uuid, user_ids: &[Uuid], ) -> Result<(), sqlx::Error> { if user_ids.is_empty() { return Ok(()); } // runtime-checked: dynamic SQL (cannot use compile-time macro) // Build multi-row INSERT: VALUES ($1, $2), ($1, $3), ... ON CONFLICT DO NOTHING let mut sql = String::from("INSERT INTO post_mentions (post_id, mentioned_user_id) VALUES "); for (i, _) in user_ids.iter().enumerate() { if i > 0 { sql.push_str(", "); } let _ = write!(sql, "($1, ${})", i + 2); } sql.push_str(" ON CONFLICT DO NOTHING"); let mut query = sqlx::query(&sql).bind(post_id); for user_id in user_ids { query = query.bind(user_id); } query.execute(executor).await?; Ok(()) }