net-core-push-notifications
net-core-push-notifications copied to clipboard
Firebase Error Throws Exception
Hi,
When Firebase encounters an error then an exception is thrown - in previous versions it reported the error.
Call FirebaseSender.SendAsync(payload) with an invalid recipient token for example.
try
{
FirebaseResponse firebase_response = await firebase_sender.SendAsync(payload));
}
catch (Exception ex)
{
Debug.WriteLine(ex.ToString());
}
Thanks!
@Thomr77 it seems like we were always throwing errors when firebase returns non-successful response:
https://github.com/andrei-m-code/net-core-push-notifications/blob/v3.1.0/CorePush/Google/FcmSender.cs#L80
However as we're now using their new API some statuses/behaviours changed. I can't tell..
@andrei-m-code cheers!
It would be so convenient if it came back as an object (error) so that there is less code on the caller's side to take it apart.
What do you think about replacing
public class FirebaseResponse
{
public string Name { get; set; }
}
with
public class FirebaseResponse
{
public class FirebaseError
{
public class Detail
{
public string Type { get; set; }
public string ErrorCode { get; set; }
}
public int Code { get; set; }
public string Message { get; set; }
public string Status { get; set; }
public Detail[] Details { get; set; }
}
public FirebaseError Error { get; set; }
public bool Success => Error == null;
}
And then just deserialize the response every time
public async Task<FirebaseResponse> SendAsync(object payload, CancellationToken cancellationToken = default)
{
var json = serializer.Serialize(payload);
using var message = new HttpRequestMessage(
HttpMethod.Post,
$"https://fcm.googleapis.com/v1/projects/{settings.ProjectId}/messages:send");
var token = await GetJwtTokenAsync();
message.Headers.Add("Authorization", $"Bearer {token}");
message.Content = new StringContent(json, Encoding.UTF8, "application/json");
using var response = await http.SendAsync(message, cancellationToken);
var responseString = await response.Content.ReadAsStringAsync(cancellationToken);
//if (!response.IsSuccessStatusCode)
//{
// throw new HttpRequestException("Firebase notification error: " + responseString);
//}
return serializer.Deserialize<FirebaseResponse>(responseString);
}
Then it is ready to go for the caller.
Could that work?
I can add this code if this works for you - but I have not done that before so not sure - please advise.
Thanks!