net-core-push-notifications icon indicating copy to clipboard operation
net-core-push-notifications copied to clipboard

Firebase Error Throws Exception

Open Thomr77 opened this issue 2 years ago • 2 comments

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 avatar Mar 11 '23 21:03 Thomr77

@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 avatar Mar 15 '23 16:03 andrei-m-code

@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!

Thomr77 avatar Mar 15 '23 23:03 Thomr77