diff options
| -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), } |
