summaryrefslogtreecommitdiff
path: root/src/message/repo.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-03 20:17:07 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-03 20:17:07 -0400
commit0a5599c60d20ccc2223779eeba5dc91a95ea0fe5 (patch)
treef7ce69ad18768ff53d8fa37d8eb9c6c575633f9e /src/message/repo.rs
parentec804134c33aedb001c426c5f42f43f53c47848f (diff)
Add endpoints for deleting channels and messages.
It is deliberate that the expire() functions do not use them. To avoid races, the transactions must be committed before events get sent, in both cases, which makes them structurally pretty different.
Diffstat (limited to 'src/message/repo.rs')
-rw-r--r--src/message/repo.rs46
1 files changed, 23 insertions, 23 deletions
diff --git a/src/message/repo.rs b/src/message/repo.rs
index 3b2b8f7..ae41736 100644
--- a/src/message/repo.rs
+++ b/src/message/repo.rs
@@ -62,7 +62,25 @@ impl<'c> Messages<'c> {
Ok(message)
}
- async fn by_id(&mut self, channel: &Channel, message: &Id) -> Result<History, sqlx::Error> {
+ pub async fn in_channel(&mut self, channel: &Channel) -> Result<Vec<Id>, sqlx::Error> {
+ let messages = sqlx::query_scalar!(
+ r#"
+ select
+ message.id as "id: Id"
+ from message
+ join channel on message.channel = channel.id
+ where channel.id = $1
+ order by message.sent_sequence
+ "#,
+ channel.id,
+ )
+ .fetch_all(&mut *self.0)
+ .await?;
+
+ Ok(messages)
+ }
+
+ async fn by_id(&mut self, message: &Id) -> Result<History, sqlx::Error> {
let message = sqlx::query!(
r#"
select
@@ -78,10 +96,8 @@ impl<'c> Messages<'c> {
join channel on message.channel = channel.id
join login as sender on message.sender = sender.id
where message.id = $1
- and message.channel = $2
"#,
message,
- channel.id,
)
.map(|row| History {
message: Message {
@@ -110,11 +126,10 @@ impl<'c> Messages<'c> {
pub async fn delete(
&mut self,
- channel: &Channel,
message: &Id,
deleted: &Instant,
) -> Result<History, sqlx::Error> {
- let history = self.by_id(channel, message).await?;
+ let history = self.by_id(message).await?;
sqlx::query_scalar!(
r#"
@@ -134,31 +149,16 @@ impl<'c> Messages<'c> {
})
}
- pub async fn expired(
- &mut self,
- expire_at: &DateTime,
- ) -> Result<Vec<(Channel, Id)>, sqlx::Error> {
- let messages = sqlx::query!(
+ pub async fn expired(&mut self, expire_at: &DateTime) -> Result<Vec<Id>, sqlx::Error> {
+ let messages = sqlx::query_scalar!(
r#"
select
- channel.id as "channel_id: channel::Id",
- channel.name as "channel_name",
- message.id as "message: Id"
+ id as "message: Id"
from message
- join channel on message.channel = channel.id
where sent_at < $1
"#,
expire_at,
)
- .map(|row| {
- (
- Channel {
- id: row.channel_id,
- name: row.channel_name,
- },
- row.message,
- )
- })
.fetch_all(&mut *self.0)
.await?;