require 'uri' module Agents class AftershipAgent < Agent cannot_receive_events! default_schedule "every_10m" description <<~MD The Aftership agent allows you to track your shipment from aftership and emit them into events. To be able to use the Aftership API, you need to generate an `API Key`. You need a paying plan to use their tracking feature. You can use this agent to retrieve tracking data. Provide the `path` for the API endpoint that you'd like to hit. For example, for all active packages, enter `trackings` (see https://www.aftership.com/docs/api/4/trackings), for a specific package, use `trackings/SLUG/TRACKING_NUMBER` and replace `SLUG` with a courier code and `TRACKING_NUMBER` with the tracking number. You can request last checkpoint of a package by providing `last_checkpoint/SLUG/TRACKING_NUMBER` instead. You can get a list of courier information here `https://www.aftership.com/courier` Required Options: * `api_key` - YOUR_API_KEY. * `path request and its full path` MD event_description <<~MD A typical tracking event have 2 important objects (tracking, and checkpoint) and the tracking/checkpoint looks like this. "trackings": [ { "id": "53aa7b5c415a670000000021", "created_at": "2014-06-25T07:33:48+00:00", "updated_at": "2014-06-25T07:33:55+00:00", "tracking_number": "123456789", "tracking_account_number": null, "tracking_postal_code": null, "tracking_ship_date": null, "slug": "dhl", "active": false, "custom_fields": { "product_price": "USD19.99", "product_name": "iPhone Case" }, "customer_name": null, "destination_country_iso3": null, "emails": [ "email@yourdomain.com", "another_email@yourdomain.com" ], "expected_delivery": null, "note": null, "order_id": "ID 1234", "order_id_path": "http://www.aftership.com/order_id=1234", "origin_country_iso3": null, "shipment_package_count": 0, "shipment_type": null, "signed_by": "raul", "smses": [], "source": "api", "tag": "Delivered", "title": "Title Name", "tracked_count": 1, "unique_token": "xy_fej9Llg", "checkpoints": [ { "slug": "dhl", "city": null, "created_at": "2014-06-25T07:33:53+00:00", "country_name": "VALENCIA - SPAIN", "message": "Awaiting collection by recipient as requested", "country_iso3": null, "tag": "InTransit", "checkpoint_time": "2014-05-12T12:02:00", "coordinates": [], "state": null, "zip": null }, ... ] }, ... ] MD def default_options { 'api_key' => 'YOUR_API_KEY', 'path' => 'trackings', } end def working? !recent_error_logs? end def validate_options errors.add(:base, "You need to specify a api key") unless options['api_key'].present? errors.add(:base, "You need to specify a path request") unless options['path'].present? end def check response = HTTParty.get(event_url, request_options) events = JSON.parse response.body create_event payload: events end private def base_url "https://api.aftership.com/v4/" end def event_url Utils.normalize_uri(base_url + interpolated[:path].to_s).to_s end def request_options { headers: { "aftership-api-key" => interpolated['api_key'], "Content-Type" => "application/json", } } end end end