summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/push/app.rs57
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),
}