sendgrid / sendgrid-ruby

The Official Twilio SendGrid Led, Community Driven Ruby API Library
https://sendgrid.com
MIT License
620 stars 324 forks source link

[BUG] Filter all messages does not work as described in documentation #454

Open shelmire opened 3 years ago

shelmire commented 3 years ago

Issue Summary

Getting messages via the described steps in the documentation does not work. Note that below I demonstrate that the example code fails.

Steps to Reproduce

  1. Create a script with the following code (code copied exactly from the initialize step and this section), per https://github.com/sendgrid/sendgrid-ruby/blob/main/USAGE.md#email-activity .

  2. Execute the script.

  3. Observe error.

  4. Note that what I really want to do is get any email status updates within the past hour or so (5 mins in example) with something like this, which should probably work according to https://sendgrid.com/docs/for-developers/sending-email/getting-started-email-activity-api/#creating-compound-queries:

filter_key = 'last_event_time'
filter_operator = ERB::Util.url_encode('>')
filter_value = (Time.now - 300).utc.strftime('%Y-%m-%dT%H:%M:%S.%L%z') # check the last 5 minutes
filter_value = ERB::Util.url_encode(format('"%s"', filter_value))
query_params = {}
query_params['query'] = format("%s%s%s", filter_key, filter_operator, filter_value)
query_params['limit'] = '10000'

Code Snippet

require 'sendgrid-ruby'

sg = SendGrid::API.new(api_key: ENV['SENDGRID_API_KEY'])

require 'erb'

filter_key = 'to_email'
filter_operator = ERB::Util.url_encode('=')
filter_value = 'testing@sendgrid.net'
filter_value = ERB::Util.url_encode(format('"%s"', filter_value))
query_params = {}
query_params['query'] = format("%s%s%s", filter_key, filter_operator, filter_value)
query_params['limit'] = '1'

params = query_params
response = sg.client.messages.get(query_params: params)
puts response.status_code
puts response.body
puts response.headers

Exception/Log

400
{"errors":[{"message":"error parsing input at line 1, position 11: syntax error: unexpected IDENTIFIER","field":"query"}]}
{"server"=>["nginx"], "date"=>["Fri, 08 Jan 2021 14:43:14 GMT"], "content-type"=>["application/json"], "content-length"=>["123"], "connection"=>["close"], "x-request-id"=>["b753cf16-8c0b-43c4-9301-275a2d002678"], "access-control-allow-methods"=>["HEAD, GET, PUT, POST, DELETE, OPTIONS, PATCH"], "access-control-max-age"=>["21600"], "access-control-expose-headers"=>["Link, Location"], "access-control-allow-origin"=>["*"], "access-control-allow-headers"=>["AUTHORIZATION, Content-Type, On-behalf-of, x-sg-elas-acl, X-Recaptcha, X-Request-Source, Browser-Fingerprint"], "content-security-policy"=>["default-src https://api.sendgrid.com; frame-src 'none'; object-src 'none'"], "x-content-type-options"=>["nosniff"], "strict-transport-security"=>["max-age=31536000"], "x-client-ff"=>["1000"], "x-ratelimit-remaining"=>["7"], "x-ratelimit-limit"=>["10"], "x-ratelimit-reset"=>["1610117100"]}

Technical details:

shelmire commented 3 years ago

Note that doing a query directly with curl DOES work, so the gem is not behaving as expected:

curl --request GET \
 --url 'https://api.sendgrid.com/v3/messages?limit=10&query=to_email%3D%22testing%40sendgrid.net%22' \
 --header 'authorization: Bearer <<api_key>>'

Or

curl --request GET \
 --url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20BETWEEN%20TIMESTAMP%20%22#{s}%22%20AND%20TIMESTAMP%20%22#{e}%22' \
 --header "authorization: Bearer $SENDGRID_API_KEY"

Or

curl --request GET --url 'https://api.sendgrid.com/v3/messages?limit=10&query=last_event_time%20%3E%20TIMESTAMP%20%222021-01-07T20%3A02%3A25Z%22' --header "authorization: Bearer $SENDGRID_API_KEY"
thinkingserious commented 3 years ago

Hello @shelmire,

I'm in the process of trying to reproduce this and I will post my findings here. Thank you!

With best regards,

Elmer

shelmire commented 3 years ago

@thinkingserious Thanks!

thinkingserious commented 3 years ago

Hello @shelmire,

Thank you for your patience!

I was able to reproduce this issue and confirm that via cURL your query works as expected and within this helper library the error you described is being thrown.

This issue has been added to our internal backlog to be prioritized. Pull requests and +1s on the issue summary will help it move up the backlog.

With best regards,

Elmer

saurabh-dgdp commented 2 years ago

Hello @thinkingserious,

The issue was we don't need to encode the query params, it is even mentioned in USAGE.md.

Queries may need to be URL encoded. URL encoding depends on how you're using the API - if you are trying it out here, or using one of the Libraries, we handle the encoding for you. If you are using cURL, or your own implementation, you probably need to encode it.

I have raised a PR for this issue. https://github.com/sendgrid/sendgrid-ruby/pull/485