diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2025-12-08 12:34:39 -0500 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2025-12-17 15:29:30 -0500 |
| commit | 41a5a0f7e13bf5a82aaef59e34eb68f0fe7fa7f5 (patch) | |
| tree | 46d86051b50c17613831d3c8836b71ba87e3f6cc /src | |
| parent | d85a28ecb408a05e9efae41e7ce4f5a707417875 (diff) | |
Web Push handling should use Failed as well.
This was something I missed in the original Failed refactoring.
Diffstat (limited to 'src')
| -rw-r--r-- | src/push/app.rs | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/src/push/app.rs b/src/push/app.rs index 5e57800..2bd6c25 100644 --- a/src/push/app.rs +++ b/src/push/app.rs @@ -10,10 +10,9 @@ use web_push::{ use super::repo::Provider as _; use crate::{ db, - error::failed::{ErrorExt, Failed, ResultExt as _}, + error::failed::{ErrorExt as _, Failed, ResultExt as _}, login::Login, token::extract::Identity, - vapid, vapid::repo::Provider as _, }; @@ -85,24 +84,37 @@ where fn prepare_ping( signer: &PartialVapidSignatureBuilder, subscription: &SubscriptionInfo, - ) -> Result<WebPushMessage, WebPushError> { - let signature = signer.clone().add_sub_info(subscription).build()?; + ) -> Result<WebPushMessage, PushError> { + let signature = signer + .clone() + .add_sub_info(subscription) + .build() + .fail("Failed to build VAPID signature")?; let payload = "ping".as_bytes(); let mut message = WebPushMessageBuilder::new(subscription); message.set_payload(ContentEncoding::Aes128Gcm, payload); message.set_vapid_signature(signature); - let message = message.build()?; + let message = message.build().fail("Failed to build push message")?; Ok(message) } pub async fn ping(&self, recipient: &Login) -> Result<(), PushError> { - let mut tx = self.db.begin().await?; + let mut tx = self.db.begin().await.fail(db::failed::BEGIN)?; - let signer = tx.vapid().signer().await?; - let subscriptions = tx.push().by_login(recipient).await?; + let signer = tx + .vapid() + .signer() + .await + .fail("Failed to load current VAPID signer")?; + let subscriptions = tx.push().by_login(recipient).await.fail_with(|| { + format!( + "Failed to find push subscriptions for login: {}", + recipient.id + ) + })?; let pings: Vec<_> = subscriptions .into_iter() @@ -131,7 +143,10 @@ where | WebPushError::EndpointNotFound(_) | WebPushError::InvalidCryptoKeys | WebPushError::MissingCryptoKeys => { - tx.push().unsubscribe(sub).await?; + tx.push() + .unsubscribe(sub) + .await + .fail("Failed to unsubscribe after permanent push message rejection")?; } _ => (), } @@ -142,7 +157,7 @@ where )); } - tx.commit().await?; + tx.commit().await.fail(db::failed::COMMIT)?; Ok(()) } @@ -163,26 +178,8 @@ pub enum SubscribeError { #[derive(Debug, thiserror::Error)] pub enum PushError { - #[error(transparent)] - Database(#[from] sqlx::Error), - #[error(transparent)] - Ecdsa(#[from] p256::ecdsa::Error), - #[error(transparent)] - Pkcs8(#[from] p256::pkcs8::Error), - #[error(transparent)] - WebPush(#[from] WebPushError), #[error("push message delivery failures: {0:?}")] Delivery(Vec<WebPushError>), -} - -impl From<vapid::repo::Error> for PushError { - fn from(error: vapid::repo::Error) -> Self { - use vapid::repo::Error; - match error { - Error::Database(error) => error.into(), - Error::Ecdsa(error) => error.into(), - Error::Pkcs8(error) => error.into(), - Error::WebPush(error) => error.into(), - } - } + #[error(transparent)] + Failed(#[from] Failed), } |
