Skip to main content

max / makenotwork

1.0 KB · 34 lines History Blame Raw
1 //! mention inserts, written as one batch per post
2
3 use std::fmt::Write as _;
4
5 use super::Uuid;
6
7 /// Insert mention rows for a post (batch insert). Ignores duplicates.
8 #[tracing::instrument(skip_all)]
9 pub async fn insert_mentions<'e, E: sqlx::PgExecutor<'e>>(
10 executor: E,
11 post_id: Uuid,
12 user_ids: &[Uuid],
13 ) -> Result<(), sqlx::Error> {
14 if user_ids.is_empty() {
15 return Ok(());
16 }
17 // runtime-checked: dynamic SQL (cannot use compile-time macro)
18 // Build multi-row INSERT: VALUES ($1, $2), ($1, $3), ... ON CONFLICT DO NOTHING
19 let mut sql = String::from("INSERT INTO post_mentions (post_id, mentioned_user_id) VALUES ");
20 for (i, _) in user_ids.iter().enumerate() {
21 if i > 0 {
22 sql.push_str(", ");
23 }
24 let _ = write!(sql, "($1, ${})", i + 2);
25 }
26 sql.push_str(" ON CONFLICT DO NOTHING");
27 let mut query = sqlx::query(&sql).bind(post_id);
28 for user_id in user_ids {
29 query = query.bind(user_id);
30 }
31 query.execute(executor).await?;
32 Ok(())
33 }
34