summaryrefslogtreecommitdiff
path: root/src/message/app.rs
diff options
context:
space:
mode:
authorKit La Touche <kit@transneptune.net>2024-10-30 16:50:06 -0400
committerKit La Touche <kit@transneptune.net>2024-10-30 16:50:06 -0400
commit113096a2cca42008c0a19110abe322180dbdf66b (patch)
treecb871dae060e60be7fd2114ee4741027ae38bd78 /src/message/app.rs
parent610f6839d2e449d172aa6ac35e6c1de0677a0754 (diff)
parent06c839436900ce07ec5c53175b01f3c5011e507c (diff)
Merge branch 'main' into wip/mobile
Diffstat (limited to 'src/message/app.rs')
-rw-r--r--src/message/app.rs14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/message/app.rs b/src/message/app.rs
index eed6ba4..137a27d 100644
--- a/src/message/app.rs
+++ b/src/message/app.rs
@@ -45,16 +45,24 @@ impl<'a> Messages<'a> {
Ok(message.as_sent())
}
- pub async fn delete(&self, message: &Id, deleted_at: &DateTime) -> Result<(), DeleteError> {
+ pub async fn delete(
+ &self,
+ deleted_by: &Login,
+ message: &Id,
+ deleted_at: &DateTime,
+ ) -> Result<(), DeleteError> {
let mut tx = self.db.begin().await?;
let message = tx
.messages()
.by_id(message)
.await
.not_found(|| DeleteError::NotFound(message.clone()))?;
- message
+ let snapshot = message
.as_snapshot()
.ok_or_else(|| DeleteError::Deleted(message.id().clone()))?;
+ if snapshot.sender != deleted_by.id {
+ return Err(DeleteError::NotSender(deleted_by.clone()));
+ }
let deleted = tx.sequence().next(deleted_at).await?;
let message = tx.messages().delete(&message, &deleted).await?;
@@ -138,6 +146,8 @@ impl From<channel::repo::LoadError> for SendError {
pub enum DeleteError {
#[error("message {0} not found")]
NotFound(Id),
+ #[error("login {} not the message's sender", .0.id)]
+ NotSender(Login),
#[error("message {0} deleted")]
Deleted(Id),
#[error(transparent)]