Class: PactBroker::Index::Service

Inherits:
Object
  • Object
show all
Extended by:
Logging, Repositories, Services
Defined in:
lib/pact_broker/index/service.rb

Class Method Summary collapse

Methods included from Repositories

label_repository, matrix_repository, pact_repository, pacticipant_repository, tag_repository, verification_repository, version_repository, webhook_repository

Methods included from Services

badge_service, certificate_service, group_service, index_service, integration_service, label_service, matrix_service, metrics_service, pact_service, pacticipant_service, tag_service, verification_service, version_service, webhook_service, webhook_trigger_service

Methods included from Logging

included, log_error

Class Method Details

.find_index_items(options = {}) ⇒ Object

This method provides data for both the OSS server side rendered index (with and without tags) and the Pactflow UI. It really needs to be broken into to separate methods, as it’s getting too messy supporting both



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
# File 'lib/pact_broker/index/service.rb', line 20

def self.find_index_items options = {}
  rows = PactBroker::Matrix::HeadRow
    .select_all_qualified
    .eager(:latest_triggered_webhooks)
    .eager(:webhooks)

  if !options[:tags]
    # server side rendered index page without tags
    rows = rows.where(consumer_version_tag_name: nil)
  else
    # server side rendered index page with tags=true or tags[]=a&tags=[]b
    if options[:tags].is_a?(Array)
      rows = rows.where(consumer_version_tag_name: options[:tags]).or(consumer_version_tag_name: nil)
    end
    rows = rows.eager(:consumer_version_tags)
                .eager(:provider_version_tags)
                .eager(:latest_verification_for_consumer_version_tag)
                .eager(:latest_verification_for_consumer_and_provider)
  end
  rows = rows.all.group_by(&:pact_publication_id).values.collect{ | rows| Matrix::AggregatedRow.new(rows) }



  rows.sort.collect do | row |
    # TODO simplify. Do we really need 3 layers of abstraction?
    PactBroker::Domain::IndexItem.create(
      row.consumer,
      row.provider,
      row.pact,
      row.overall_latest?,
      row.latest_verification_for_pseudo_branch,
      row.webhooks,
      row.latest_triggered_webhooks,
      options[:tags] ? row.consumer_head_tag_names : [],
      options[:tags] ? row.provider_version_tags.select(&:latest?) : []
    )
  end
end

.find_index_items_for_api(consumer_name: nil, provider_name: nil, **ignored) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'lib/pact_broker/index/service.rb', line 59

def self.find_index_items_for_api(consumer_name: nil, provider_name: nil, **ignored)
  rows = PactBroker::Matrix::HeadRow
    .eager(:consumer_version_tags)
    .eager(:provider_version_tags)
    .select_all_qualified

  rows = rows.consumer(consumer_name) if consumer_name
  rows = rows.provider(provider_name) if provider_name

  rows = rows.all.group_by(&:pact_publication_id).values.collect{ | rows| Matrix::AggregatedRow.new(rows) }

  rows.sort.collect do | row |
    # TODO separate this model from IndexItem
    # webhook status not currently displayed in Pactflow UI, so don't query for it.
    PactBroker::Domain::IndexItem.create(
      row.consumer,
      row.provider,
      row.pact,
      row.overall_latest?,
      row.latest_verification_for_pact_version,
      [],
      [],
      row.consumer_head_tag_names,
      row.provider_version_tags.select(&:latest?)
    )
  end
end