diff options
Diffstat (limited to 'src/events')
| -rw-r--r-- | src/events/repo/message.rs | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/src/events/repo/message.rs b/src/events/repo/message.rs index ec17d55..f6fce0e 100644 --- a/src/events/repo/message.rs +++ b/src/events/repo/message.rs @@ -4,7 +4,7 @@ use crate::{ clock::DateTime, events::types::{self, Sequence}, repo::{ - channel::Channel, + channel::{self, Channel}, login::{self, Login}, message, }, @@ -30,7 +30,7 @@ impl<'c> Events<'c> { body: &str, sent_at: &DateTime, ) -> Result<types::ChannelEvent, sqlx::Error> { - let sequence = self.next_sequence_for(channel).await?; + let sequence = self.assign_sequence(&channel.id).await?; let id = message::Id::generate(); @@ -72,20 +72,20 @@ impl<'c> Events<'c> { Ok(message) } - async fn next_sequence_for(&mut self, channel: &Channel) -> Result<Sequence, sqlx::Error> { - let current = sqlx::query_scalar!( + async fn assign_sequence(&mut self, channel: &channel::Id) -> Result<Sequence, sqlx::Error> { + let next = sqlx::query_scalar!( r#" - -- `max` never returns null, but sqlx can't detect that - select max(sequence) as "sequence!: Sequence" - from message - where channel = $1 + update channel + set last_sequence = last_sequence + 1 + where id = $1 + returning last_sequence as "next_sequence: Sequence" "#, - channel.id, + channel, ) .fetch_one(&mut *self.0) .await?; - Ok(current.next()) + Ok(next) } pub async fn expire(&mut self, expire_at: &DateTime) -> Result<(), sqlx::Error> { |
