Module: ActiveProject::Adapters::Basecamp::Webhooks

Included in:
ActiveProject::Adapters::BasecampAdapter
Defined in:
lib/active_project/adapters/basecamp/webhooks.rb

Instance Method Summary collapse

Instance Method Details

#parse_webhook(request_body, _headers = {}) ⇒ ActiveProject::WebhookEvent?

Parses an incoming Basecamp webhook payload.

Parameters:

  • request_body (String)

    The raw JSON request body.

  • headers (Hash)

    Request headers (unused).

Returns:



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"]
  timestamp = 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: timestamp,
    source: webhook_type,
    data: (object_data || {}).merge(changes: changes, object_key: object_key),
    raw_data: payload
  )
rescue JSON::ParserError
  nil
end