Class: DigiwinDsp::Webhooks::Event

Inherits:
Object
  • Object
show all
Defined in:
lib/digiwin_dsp/webhooks/event.rb

Overview

Base value-object for an inbound DSP webhook event. Subclasses add action-specific accessors over the ‘request` payload but share the JSON-parse + envelope-extract logic that lives here.

Direct Known Subclasses

InventoryUpdate, InvoiceUpdate, LogisticsUpdate

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(digi_header:, request:, raw:) ⇒ Event

Returns a new instance of Event.



33
34
35
36
37
# File 'lib/digiwin_dsp/webhooks/event.rb', line 33

def initialize(digi_header:, request:, raw:)
  @digi_header = digi_header
  @request = request
  @raw = raw
end

Instance Attribute Details

#digi_headerObject (readonly)

Returns the value of attribute digi_header.



11
12
13
# File 'lib/digiwin_dsp/webhooks/event.rb', line 11

def digi_header
  @digi_header
end

#rawObject (readonly)

Returns the value of attribute raw.



11
12
13
# File 'lib/digiwin_dsp/webhooks/event.rb', line 11

def raw
  @raw
end

#requestObject (readonly)

Returns the value of attribute request.



11
12
13
# File 'lib/digiwin_dsp/webhooks/event.rb', line 11

def request
  @request
end

Class Method Details

.extract_request(hash) ⇒ Object

Raises:



26
27
28
29
30
31
# File 'lib/digiwin_dsp/webhooks/event.rb', line 26

def self.extract_request(hash)
  raise ParseError, "envelope must be a JSON object" unless hash.is_a?(Hash)

  hash.dig("digi_body", "std_data", "parameter", "request") ||
    raise(ParseError, "envelope missing digi_body.std_data.parameter.request")
end

.parse(raw_body) ⇒ Object



13
14
15
16
17
# File 'lib/digiwin_dsp/webhooks/event.rb', line 13

def self.parse(raw_body)
  hash = parse_json(raw_body)
  request = extract_request(hash)
  new(digi_header: hash["digi_header"] || {}, request: request, raw: hash)
end

.parse_json(raw_body) ⇒ Object



19
20
21
22
23
24
# File 'lib/digiwin_dsp/webhooks/event.rb', line 19

def self.parse_json(raw_body)
  # max_nesting mirrors the Client's parser DoS guard.
  JSON.parse(raw_body, max_nesting: 50)
rescue JSON::ParserError => e
  raise ParseError, "invalid JSON: #{e.message}"
end