Skip to content

Commit

Permalink
fix(notifications): handle unrecognized device token in FcmError
Browse files Browse the repository at this point in the history
  • Loading branch information
thevaibhav-dixit committed Feb 13, 2024
1 parent 1f330dc commit 7611bb4
Show file tree
Hide file tree
Showing 2 changed files with 57 additions and 2 deletions.
57 changes: 56 additions & 1 deletion core/notifications/src/executor/fcm/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,60 @@ pub enum FcmError {
#[error("FcmError - I/O Error: {0}")]
IOError(#[from] std::io::Error),
#[error("FcmError - GoogleFcm1Error: {0}")]
GoogleFcm1Error(#[from] google_fcm1::Error),
GoogleFcm1Error(google_fcm1::Error),
#[error("FcmError: UnrecognizedDeviceToken: {0}")]
UnrecognizedDeviceToken(google_fcm1::Error),
}

impl From<google_fcm1::Error> for FcmError {
fn from(err: google_fcm1::Error) -> Self {
match err {
google_fcm1::Error::BadRequest(ref value) => {
if value["error"]["status"].as_str() == Some("NOT_FOUND")
&& value["error"]["details"]
.as_array()
.map_or(false, |details| {
details
.iter()
.any(|detail| detail["errorCode"].as_str() == Some("UNREGISTERED"))
})
{
return FcmError::UnrecognizedDeviceToken(err);
}
FcmError::GoogleFcm1Error(err)
}
_ => FcmError::GoogleFcm1Error(err),
}
}
}

#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;

#[test]
fn unrecognized_device_token_err() {
let err_json = json!({
"error": {
"code": 404,
"message": "Requested entity was not found.",
"status": "NOT_FOUND",
"details": [
{
"@type": "type.googleapis.com/google.firebase.fcm.v1.FcmError",
"errorCode": "UNREGISTERED"
}
]
}
});

let err = google_fcm1::Error::BadRequest(err_json);
let converted_err: FcmError = err.into();

assert!(matches!(
converted_err,
FcmError::UnrecognizedDeviceToken(_)
));
}
}
2 changes: 1 addition & 1 deletion core/notifications/src/executor/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ impl Executor {
let mut n_removed_tokens = 0;
for device_token in settings.push_device_tokens() {
match self.fcm.send(&device_token, &msg, event.deep_link()).await {
Err(FcmError::GoogleFcm1Error(google_fcm1::Error::BadRequest(e))) => {
Err(FcmError::UnrecognizedDeviceToken(e)) => {
n_errs += 1;
n_removed_tokens += 1;
error!("BadRequest sending to device: {}", e);
Expand Down

0 comments on commit 7611bb4

Please sign in to comment.