Class: PactBroker::Webhooks::Repository

Inherits:
Object
  • Object
show all
Includes:
Logging, Repositories
Defined in:
lib/pact_broker/webhooks/repository.rb

Instance Method Summary collapse

Methods included from Repositories

#branch_version_repository, #integration_repository, #label_repository, #matrix_repository, #pact_repository, #pacticipant_repository, #tag_repository, #verification_repository, #version_repository, #webhook_repository

Methods included from Logging

included, #log_error, #log_with_tag

Instance Method Details

#any_webhooks_configured_for_pact?(pact) ⇒ Boolean

needs to know if there are any at all, regardless of whether or not user can edit them

Returns:

  • (Boolean)


71
72
73
# File 'lib/pact_broker/webhooks/repository.rb', line 71

def any_webhooks_configured_for_pact?(pact)
  deliberately_unscoped(Webhook).find_by_consumer_and_or_provider(pact.consumer, pact.provider).any?
end

#create(uuid, webhook, consumer, provider) ⇒ Object



19
20
21
22
23
24
25
26
27
28
29
# File 'lib/pact_broker/webhooks/repository.rb', line 19

def create uuid, webhook, consumer, provider
  consumer = find_pacticipant_by_name(webhook.consumer) || consumer
  provider = find_pacticipant_by_name(webhook.provider) || provider
  db_webhook = Webhook.from_domain webhook, consumer, provider
  db_webhook.uuid = uuid
  db_webhook.save
  (webhook.events || []).each do | webhook_event |
    db_webhook.add_event(webhook_event)
  end
  find_by_uuid db_webhook.uuid
end

#create_execution(triggered_webhook, webhook_execution_result) ⇒ Object



126
127
128
129
130
131
132
133
134
135
136
# File 'lib/pact_broker/webhooks/repository.rb', line 126

def create_execution triggered_webhook, webhook_execution_result
  # TriggeredWebhook may have been deleted since the webhook execution started
  if deliberately_unscoped(TriggeredWebhook).where(id: triggered_webhook.id).any?
    Execution.create(
      triggered_webhook: triggered_webhook,
      success: webhook_execution_result.success?,
      logs: webhook_execution_result.logs)
  else
    logger.info("Could not save webhook execution for triggered webhook with id #{triggered_webhook.id} as it has been delete from the database")
  end
end

#create_triggered_webhook(uuid, webhook, pact, verification, trigger_type, event_name, event_context) ⇒ Object

rubocop: disable Metrics/ParameterLists



100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/pact_broker/webhooks/repository.rb', line 100

def create_triggered_webhook uuid, webhook, pact, verification, trigger_type, event_name, event_context
  db_webhook = deliberately_unscoped(Webhook).where(uuid: webhook.uuid).single_record
  # trigger_uuid was meant to be one per *event*, not one per triggered webhook, but its intent got lost over time.
  # Retiring it now in favour of uuid, but can't leave it empty because
  # it has a not-null and unique webhook_uuid/trigger_uuid constraint on it.
  TriggeredWebhook.create(
    uuid: uuid,
    status: TriggeredWebhook::STATUS_NOT_RUN,
    pact_publication_id: pact.id,
    verification: verification,
    webhook: db_webhook,
    webhook_uuid: db_webhook.uuid,
    trigger_uuid: uuid,
    trigger_type: trigger_type,
    consumer: pact.consumer,
    provider: pact.provider,
    event_name: event_name,
    event_context: event_context
  )
end

#delete_by_consumer_and_provider(consumer, provider) ⇒ Object

deleting a particular integration do delete triggered webhooks only delete stuff matching both, as other integrations may still be present



82
83
84
85
86
87
88
# File 'lib/pact_broker/webhooks/repository.rb', line 82

def delete_by_consumer_and_provider consumer, provider
  webhooks_to_delete = deliberately_unscoped(Webhook).where(consumer: consumer, provider: provider)
  TriggeredWebhook.where(webhook: webhooks_to_delete).delete
  # Delete the orphaned triggerred webhooks
  TriggeredWebhook.where(consumer: consumer, provider: provider).delete
  webhooks_to_delete.delete
end

#delete_by_pacticipant(pacticipant) ⇒ Object

policy applied at resource level for pacticipant If we’re deleting the pacticipant, then we actually do want to delete the triggered webhooks



56
57
58
59
60
61
62
63
# File 'lib/pact_broker/webhooks/repository.rb', line 56

def delete_by_pacticipant pacticipant
  deliberately_unscoped(TriggeredWebhook).where(consumer_id: pacticipant.id).delete
  deliberately_unscoped(TriggeredWebhook).where(provider_id: pacticipant.id).delete
  deliberately_unscoped(TriggeredWebhook).where(webhook: deliberately_unscoped(Webhook).where(consumer_id: pacticipant.id)).delete
  deliberately_unscoped(TriggeredWebhook).where(webhook: deliberately_unscoped(Webhook).where(provider_id: pacticipant.id)).delete
  deliberately_unscoped(Webhook).where(consumer_id: pacticipant.id).delete
  deliberately_unscoped(Webhook).where(provider_id: pacticipant.id).delete
end

#delete_by_uuid(uuid) ⇒ Object

policy applied at resource level



50
51
52
# File 'lib/pact_broker/webhooks/repository.rb', line 50

def delete_by_uuid uuid
  deliberately_unscoped(Webhook).where(uuid: uuid).destroy
end

#delete_triggered_webhooks_by_pact_publication_ids(pact_publication_ids) ⇒ Object



147
148
149
150
# File 'lib/pact_broker/webhooks/repository.rb', line 147

def delete_triggered_webhooks_by_pact_publication_ids pact_publication_ids
  triggered_webhook_ids = TriggeredWebhook.where(pact_publication_id: pact_publication_ids).select_for_subquery(:id)
  delete_triggered_webhooks_and_executions(triggered_webhook_ids)
end

#delete_triggered_webhooks_by_verification_ids(verification_ids) ⇒ Object



143
144
145
# File 'lib/pact_broker/webhooks/repository.rb', line 143

def delete_triggered_webhooks_by_verification_ids verification_ids
  delete_triggered_webhooks_and_executions(TriggeredWebhook.where(verification_id: verification_ids).select_for_subquery(:id))
end

#delete_triggered_webhooks_by_version_id(version_id) ⇒ Object



138
139
140
141
# File 'lib/pact_broker/webhooks/repository.rb', line 138

def delete_triggered_webhooks_by_version_id version_id
  delete_triggered_webhooks_by_pact_publication_ids(PactBroker::Pacts::PactPublication.where(consumer_version_id: version_id).select_for_subquery(:id))
  delete_triggered_webhooks_by_verification_ids(PactBroker::Domain::Verification.where(provider_version_id: version_id).select_for_subquery(:id))
end

#fail_retrying_triggered_webhooksObject



184
185
186
# File 'lib/pact_broker/webhooks/repository.rb', line 184

def fail_retrying_triggered_webhooks
  deliberately_unscoped(TriggeredWebhook).retrying.update(status: TriggeredWebhook::STATUS_FAILURE)
end

#find_allObject

this needs the scope!



66
67
68
# File 'lib/pact_broker/webhooks/repository.rb', line 66

def find_all
  scope_for(Webhook).all.collect(&:to_domain)
end

#find_by_consumer_and_provider(consumer, provider) ⇒ Object



75
76
77
# File 'lib/pact_broker/webhooks/repository.rb', line 75

def find_by_consumer_and_provider consumer, provider
  scope_for(Webhook).find_by_consumer_and_provider(consumer, provider).collect(&:to_domain)
end

#find_by_uuid(uuid) ⇒ Object

policy applied at resource level



32
33
34
# File 'lib/pact_broker/webhooks/repository.rb', line 32

def find_by_uuid uuid
  deliberately_unscoped(Webhook).where(uuid: uuid).limit(1).collect(&:to_domain)[0]
end

#find_latest_triggered_webhooks(consumer, provider) ⇒ Object



160
161
162
163
164
165
166
# File 'lib/pact_broker/webhooks/repository.rb', line 160

def find_latest_triggered_webhooks consumer, provider
  # policy already applied to pact
  deliberately_unscoped(LatestTriggeredWebhook)
    .where(consumer: consumer, provider: provider)
    .order(:id)
    .all
end

#find_latest_triggered_webhooks_for_pact(pact) ⇒ Object



152
153
154
155
156
157
158
# File 'lib/pact_broker/webhooks/repository.rb', line 152

def find_latest_triggered_webhooks_for_pact pact
  if pact
    find_latest_triggered_webhooks(pact.consumer, pact.provider)
  else
    []
  end
end

#find_triggered_webhooks_for_pact(pact) ⇒ Object



168
169
170
171
172
173
174
# File 'lib/pact_broker/webhooks/repository.rb', line 168

def find_triggered_webhooks_for_pact pact
  scope_for(PactBroker::Webhooks::TriggeredWebhook)
    .where(pact_publication_id: pact.pact_publication_id)
    .eager(:webhook)
    .eager(:webhook_executions)
    .reverse(:created_at, :id)
end

#find_triggered_webhooks_for_verification(verification) ⇒ Object



176
177
178
179
180
181
182
# File 'lib/pact_broker/webhooks/repository.rb', line 176

def find_triggered_webhooks_for_verification verification
  scope_for(PactBroker::Webhooks::TriggeredWebhook)
    .where(verification_id: verification.id)
    .eager(:webhook)
    .eager(:webhook_executions)
    .reverse(:created_at, :id)
end

#find_webhooks_to_trigger(consumer:, provider:, event_name:) ⇒ Object



90
91
92
93
94
95
96
97
# File 'lib/pact_broker/webhooks/repository.rb', line 90

def find_webhooks_to_trigger consumer: , provider: , event_name:
  deliberately_unscoped(Webhook)
    .select_all_qualified
    .enabled
    .for_event_name(event_name)
    .find_by_consumer_and_or_provider(consumer, provider)
    .collect(&:to_domain)
end

#update_by_uuid(uuid, webhook) ⇒ Object

policy applied at resource level



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/pact_broker/webhooks/repository.rb', line 37

def update_by_uuid uuid, webhook
  existing_webhook = deliberately_unscoped(Webhook).find(uuid: uuid)
  existing_webhook.consumer_id = find_pacticipant_by_name(webhook.consumer)&.id
  existing_webhook.provider_id = find_pacticipant_by_name(webhook.provider)&.id
  existing_webhook.update_from_domain(webhook).save
  existing_webhook.events.collect(&:delete)
  (webhook.events || []).each do | webhook_event |
    existing_webhook.add_event(webhook_event)
  end
  find_by_uuid uuid
end

#update_triggered_webhook_status(triggered_webhook, status) ⇒ Object

rubocop: enable Metrics/ParameterLists



122
123
124
# File 'lib/pact_broker/webhooks/repository.rb', line 122

def update_triggered_webhook_status triggered_webhook, status
  triggered_webhook.update(status: status)
end