Module: ActiveProject::Adapters::Basecamp::Webhooks
- Included in:
- ActiveProject::Adapters::BasecampAdapter
- Defined in:
- lib/active_project/adapters/basecamp/webhooks.rb
Instance Method Summary collapse
-
#parse_webhook(request_body, _headers = {}) ⇒ ActiveProject::WebhookEvent?
Parses an incoming Basecamp webhook payload.
Instance Method Details
#parse_webhook(request_body, _headers = {}) ⇒ ActiveProject::WebhookEvent?
Parses an incoming Basecamp webhook payload.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/active_project/adapters/basecamp/webhooks.rb', line 11 def parse_webhook(request_body, _headers = {}) payload = begin JSON.parse(request_body) rescue StandardError nil end return nil unless payload.is_a?(Hash) kind = payload["kind"] recording = payload["recording"] creator = payload["creator"] = begin Time.parse(payload["created_at"]) rescue StandardError nil end return nil unless recording && kind event_type = nil object_kind = nil event_object_id = recording["id"] object_key = nil project_id = recording.dig("bucket", "id") changes = nil object_data = nil case kind when /todo_created$/ event_type = :issue_created object_kind = :issue when /todo_assignment_changed$/, /todo_completion_changed$/, /todo_content_updated$/, /todo_description_changed$/, /todo_due_on_changed$/ event_type = :issue_updated object_kind = :issue when /comment_created$/ event_type = :comment_added object_kind = :comment when /comment_content_changed$/ event_type = :comment_updated object_kind = :comment else return nil end WebhookEvent.new( type: event_type, resource_type: object_kind, resource_id: event_object_id, project_id: project_id, actor: map_user_data(creator), timestamp: , source: webhook_type, data: (object_data || {}).merge(changes: changes, object_key: object_key), raw_data: payload ) rescue JSON::ParserError nil end |