diff options
Diffstat (limited to 'src/boot/app.rs')
| -rw-r--r-- | src/boot/app.rs | 46 |
1 files changed, 21 insertions, 25 deletions
diff --git a/src/boot/app.rs b/src/boot/app.rs index fc84b3a..ef48b2f 100644 --- a/src/boot/app.rs +++ b/src/boot/app.rs @@ -1,8 +1,9 @@ use sqlx::sqlite::SqlitePool; -use super::{Channel, Snapshot}; +use super::Snapshot; use crate::{ - channel::repo::Provider as _, event::repo::Provider as _, message::repo::Provider as _, + channel::repo::Provider as _, event::repo::Provider as _, login::repo::Provider as _, + message::repo::Provider as _, }; pub struct Boot<'a> { @@ -17,38 +18,33 @@ impl<'a> Boot<'a> { pub async fn snapshot(&self) -> Result<Snapshot, sqlx::Error> { let mut tx = self.db.begin().await?; let resume_point = tx.sequence().current().await?; - let channels = tx.channels().all(resume_point.into()).await?; - - let channels = { - let mut snapshots = Vec::with_capacity(channels.len()); - - let channels = channels.into_iter().filter_map(|channel| { - channel - .as_of(resume_point) - .map(|snapshot| (channel, snapshot)) - }); - for (channel, snapshot) in channels { - let messages = tx - .messages() - .in_channel(&channel, resume_point.into()) - .await?; + let logins = tx.logins().all(resume_point.into()).await?; + let channels = tx.channels().all(resume_point.into()).await?; + let messages = tx.messages().all(resume_point.into()).await?; - let messages = messages - .into_iter() - .filter_map(|message| message.as_of(resume_point)); + tx.commit().await?; - snapshots.push(Channel::new(snapshot, messages)); - } + let logins = logins + .into_iter() + .filter_map(|login| login.as_of(resume_point)) + .collect(); - snapshots - }; + let channels = channels + .into_iter() + .filter_map(|channel| channel.as_of(resume_point)) + .collect(); - tx.commit().await?; + let messages = messages + .into_iter() + .filter_map(|message| message.as_of(resume_point)) + .collect(); Ok(Snapshot { resume_point, + logins, channels, + messages, }) } } |
