🐛 fix(rule_processor): fix batch_trash and batch_delete signatures

- change &self to &mut self for batch_trash and batch_delete functions
- add logging for messages being trashed and deleted
This commit is contained in:
Jeremiah Russell
2025-10-25 22:45:55 +01:00
committed by Jeremiah Russell
parent e106455953
commit 50beaeaef4

View File

@@ -84,7 +84,7 @@ pub(crate) trait MailOperations {
fn prepare(&mut self, pages: u32) -> impl std::future::Future<Output = Result<()>> + Send; fn prepare(&mut self, pages: u32) -> impl std::future::Future<Output = Result<()>> + Send;
/// Execute trash operation on prepared messages /// Execute trash operation on prepared messages
fn batch_trash(&self) -> impl std::future::Future<Output = Result<()>> + Send; fn batch_trash(&mut self) -> impl std::future::Future<Output = Result<()>> + Send;
} }
/// Internal orchestration function for rule processing that can be unit tested. /// Internal orchestration function for rule processing that can be unit tested.
@@ -144,7 +144,7 @@ impl MailOperations for GmailClient {
self.get_messages(pages).await self.get_messages(pages).await
} }
async fn batch_trash(&self) -> Result<()> { async fn batch_trash(&mut self) -> Result<()> {
RuleProcessor::batch_trash(self).await RuleProcessor::batch_trash(self).await
} }
} }
@@ -266,7 +266,7 @@ pub trait RuleProcessor {
/// # Gmail API Requirements /// # Gmail API Requirements
/// ///
/// Requires the `https://www.googleapis.com/auth/gmail.modify` scope or broader. /// Requires the `https://www.googleapis.com/auth/gmail.modify` scope or broader.
fn batch_delete(&self) -> impl std::future::Future<Output = Result<()>> + Send; fn batch_delete(&mut self) -> impl std::future::Future<Output = Result<()>> + Send;
/// Moves all prepared messages to the Gmail trash folder. /// Moves all prepared messages to the Gmail trash folder.
/// ///
@@ -286,7 +286,7 @@ pub trait RuleProcessor {
/// # Gmail API Requirements /// # Gmail API Requirements
/// ///
/// Requires the `https://www.googleapis.com/auth/gmail.modify` scope. /// Requires the `https://www.googleapis.com/auth/gmail.modify` scope.
fn batch_trash(&self) -> impl std::future::Future<Output = Result<()>> + Send; fn batch_trash(&mut self) -> impl std::future::Future<Output = Result<()>> + Send;
} }
impl RuleProcessor for GmailClient { impl RuleProcessor for GmailClient {
@@ -365,7 +365,7 @@ impl RuleProcessor for GmailClient {
/// Uses `https://www.googleapis.com/auth/gmail.modify` scope for secure, /// Uses `https://www.googleapis.com/auth/gmail.modify` scope for secure,
/// minimal privilege access. This scope provides sufficient permissions /// minimal privilege access. This scope provides sufficient permissions
/// for message deletion while following security best practices. /// for message deletion while following security best practices.
async fn batch_delete(&self) -> Result<()> { async fn batch_delete(&mut self) -> Result<()> {
let message_ids = MessageList::message_ids(self); let message_ids = MessageList::message_ids(self);
// Early return if no messages to delete, avoiding unnecessary API calls // Early return if no messages to delete, avoiding unnecessary API calls
@@ -377,6 +377,9 @@ impl RuleProcessor for GmailClient {
let ids = Some(message_ids); let ids = Some(message_ids);
let batch_request = BatchDeleteMessagesRequest { ids }; let batch_request = BatchDeleteMessagesRequest { ids };
self.log_messages("Message with subject `", "` permanently deleted")
.await?;
log::trace!("{batch_request:#?}"); log::trace!("{batch_request:#?}");
let _res = self let _res = self
@@ -388,10 +391,6 @@ impl RuleProcessor for GmailClient {
.await .await
.map_err(Box::new)?; .map_err(Box::new)?;
for m in self.messages() {
log::info!("Message with subject `{}` permanently deleted", m.subject());
}
Ok(()) Ok(())
} }
/// Moves all prepared messages to Gmail's trash folder using batch modify API. /// Moves all prepared messages to Gmail's trash folder using batch modify API.
@@ -408,7 +407,7 @@ impl RuleProcessor for GmailClient {
/// ///
/// Uses `https://www.googleapis.com/auth/gmail.modify` scope for secure, /// Uses `https://www.googleapis.com/auth/gmail.modify` scope for secure,
/// minimal privilege access to Gmail message modification operations. /// minimal privilege access to Gmail message modification operations.
async fn batch_trash(&self) -> Result<()> { async fn batch_trash(&mut self) -> Result<()> {
let message_ids = MessageList::message_ids(self); let message_ids = MessageList::message_ids(self);
// Early return if no messages to trash, avoiding unnecessary API calls // Early return if no messages to trash, avoiding unnecessary API calls
@@ -427,6 +426,9 @@ impl RuleProcessor for GmailClient {
remove_label_ids, remove_label_ids,
}; };
self.log_messages("Message with subject `", "` moved to trash")
.await?;
log::trace!("{batch_request:#?}"); log::trace!("{batch_request:#?}");
let _res = self let _res = self
@@ -438,10 +440,6 @@ impl RuleProcessor for GmailClient {
.await .await
.map_err(Box::new)?; .map_err(Box::new)?;
for m in self.messages() {
log::info!("Message with subject `{}` moved to trash", m.subject());
}
Ok(()) Ok(())
} }
} }
@@ -576,7 +574,7 @@ mod tests {
Ok(()) Ok(())
} }
async fn batch_trash(&self) -> Result<()> { async fn batch_trash(&mut self) -> Result<()> {
// Always increment the counter to track that batch_trash was called // Always increment the counter to track that batch_trash was called
*self.batch_trash_call_count.lock().unwrap() += 1; *self.batch_trash_call_count.lock().unwrap() += 1;
@@ -722,11 +720,11 @@ mod tests {
Ok(()) Ok(())
} }
async fn batch_delete(&self) -> Result<()> { async fn batch_delete(&mut self) -> Result<()> {
Ok(()) Ok(())
} }
async fn batch_trash(&self) -> Result<()> { async fn batch_trash(&mut self) -> Result<()> {
Ok(()) Ok(())
} }
} }