Module: PostProxy::WebhookEvents

Defined in:
lib/postproxy/webhook_events.rb

Defined Under Namespace

Classes: CommentCreatedData, Event, ImportedProfile, MediaFailedData, MessageEventData, PlatformPostData, PostImportedData, PostProcessedData, PostProcessedPlatform, ProfileCommentCreatedData, ProfileEventData, ProfileStatsData, ReactionEventData

Constant Summary collapse

DATA_CLASSES =
{
  "post.processed" => PostProcessedData,
  "post.imported" => PostImportedData,
  "platform_post.published" => PlatformPostData,
  "platform_post.failed" => PlatformPostData,
  "platform_post.failed_waiting_for_retry" => PlatformPostData,
  "platform_post.insights" => PlatformPostData,
  "profile.connected" => ProfileEventData,
  "profile.disconnected" => ProfileEventData,
  "profile.stats" => ProfileStatsData,
  "media.failed" => MediaFailedData,
  "comment.created" => CommentCreatedData,
  "profile_comment.created" => ProfileCommentCreatedData,
  "message.received" => MessageEventData,
  "message.sent" => MessageEventData,
  "message.delivered" => MessageEventData,
  "message.read" => MessageEventData,
  "message.edited" => MessageEventData,
  "message.deleted" => MessageEventData,
  "message.failed_waiting_for_retry" => MessageEventData,
  "message.failed" => MessageEventData,
  "reaction.received" => ReactionEventData
}.freeze

Class Method Summary collapse

Class Method Details

.parse(body) ⇒ Object

Parse a webhook body and return a typed Event. ‘data` is parsed into the appropriate model based on `type`. Raises WebhookParseError on bad input.



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/postproxy/webhook_events.rb', line 129

def self.parse(body)
  parsed =
    case body
    when String then JSON.parse(body, symbolize_names: true)
    when Hash then body.transform_keys(&:to_sym)
    else raise WebhookParseError, "Webhook body must be a String or Hash"
    end
rescue JSON::ParserError => e
  raise WebhookParseError, "Invalid JSON: #{e.message}"
else
  type = parsed[:type].to_s
  raise WebhookParseError, "Unknown webhook event type: #{type.inspect}" unless DATA_CLASSES.key?(type)

  data_class = DATA_CLASSES[type]
  data_hash = (parsed[:data] || {}).transform_keys(&:to_sym)
  Event.new(
    id: parsed[:id],
    type: type,
    created_at: parsed[:created_at],
    data: data_class.new(**data_hash)
  )
end