Class: Shipit::Hook

Inherits:
Record
  • Object
show all
Defined in:
app/models/shipit/hook.rb

Defined Under Namespace

Classes: DeliverySigner, DeliverySpec

Constant Summary collapse

DELIVERIES_LOG_SIZE =
500
CONTENT_TYPES =
{
  'json' => 'application/json',
  'form' => 'application/x-www-form-urlencoded'
}.freeze
EVENTS =
%w[
  stack
  review_stack
  task
  deploy
  rollback
  lock
  commit_status
  deployable_status
  merge_status
  merge
  pull_request
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Record

serializer_class

Class Method Details

.coerce_payload(payload) ⇒ Object



126
127
128
129
130
131
132
133
134
# File 'app/models/shipit/hook.rb', line 126

def coerce_payload(payload)
  coerced_payload = payload.dup
  payload.each do |key, value|
    if serializer = ActiveModel::Serializer.serializer_for(value)
      coerced_payload[key] = serializer.new(value)
    end
  end
  coerced_payload.to_json
end

.deliver(event, stack_id, payload) ⇒ Object



115
116
117
118
119
# File 'app/models/shipit/hook.rb', line 115

def deliver(event, stack_id, payload)
  for_stack(stack_id).listening_event(event).each do |hook|
    hook.deliver!(event, payload)
  end
end

.deliver_internal_hooks(event, stack, payload) ⇒ Object



109
110
111
112
113
# File 'app/models/shipit/hook.rb', line 109

def deliver_internal_hooks(event, stack, payload)
  Shipit.internal_hook_receivers.each do |receiver|
    receiver.deliver(event, stack, payload)
  end
end

.emit(event, stack, payload) ⇒ Object



98
99
100
101
102
103
104
105
106
107
# File 'app/models/shipit/hook.rb', line 98

def emit(event, stack, payload)
  raise "#{event} is not declared in Shipit::Hook::EVENTS" unless EVENTS.include?(event.to_s)

  Shipit::EmitEventJob.perform_later(
    event: event.to_s,
    stack_id: stack&.id,
    payload: coerce_payload(payload)
  )
  deliver_internal_hooks(event, stack, payload)
end

.listening_event(event) ⇒ Object



121
122
123
124
# File 'app/models/shipit/hook.rb', line 121

def listening_event(event)
  event = event.to_s
  all.to_a.select { |h| h.events.include?(event) }
end

Instance Method Details

#deliver!(event, payload) ⇒ Object



141
142
143
144
145
146
147
148
149
# File 'app/models/shipit/hook.rb', line 141

def deliver!(event, payload)
  DeliverHookJob.perform_later(
    event: event.to_s,
    url: delivery_url,
    content_type: CONTENT_TYPES[content_type],
    payload: serialize_payload(payload),
    secret:
  )
end

#purge_old_deliveries!(keep: DELIVERIES_LOG_SIZE) ⇒ Object



151
152
153
154
# File 'app/models/shipit/hook.rb', line 151

def purge_old_deliveries!(keep: DELIVERIES_LOG_SIZE)
  delivery_ids = deliveries.sent.order(id: :desc).offset(keep).limit(50).pluck(:id)
  deliveries.where(id: delivery_ids).delete_all
end

#scoped?Boolean

Returns:

  • (Boolean)


137
138
139
# File 'app/models/shipit/hook.rb', line 137

def scoped?
  stack_id?
end