summaryrefslogtreecommitdiff
path: root/app/services/wiki_pages/base_service.rb
blob: 4ec884469eb7ce547520133ff456eb845cefbdcb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
58
59
60
61
62
63
64
# frozen_string_literal: true

module WikiPages
  # There are 3 notions of 'action' that inheriting classes must implement:
  #
  # - external_action: the action we report to external clients with webhooks
  # - usage_counter_action: the action that we count in out internal counters
  # - event_action: what we record as the value of `Event#action`
  class BaseService < ::BaseContainerService
    private

    def execute_hooks(page)
      page_data = payload(page)
      container.execute_hooks(page_data, :wiki_page_hooks)
      container.execute_services(page_data, :wiki_page_hooks)
      increment_usage
      create_wiki_event(page)
    end

    # Passed to web-hooks, and send to external consumers.
    def external_action
      raise NotImplementedError
    end

    # Passed to the WikiPageCounter to count events.
    # Must be one of WikiPageCounter::KNOWN_EVENTS
    def usage_counter_action
      raise NotImplementedError
    end

    # Used to create `Event` records.
    # Must be a valid value for `Event#action`
    def event_action
      raise NotImplementedError
    end

    def payload(page)
      Gitlab::DataBuilder::WikiPage.build(page, current_user, external_action)
    end

    # This method throws an error if the action is an unanticipated value.
    def increment_usage
      Gitlab::UsageDataCounters::WikiPageCounter.count(usage_counter_action)
    end

    def create_wiki_event(page)
      response = WikiPages::EventCreateService
        .new(current_user)
        .execute(slug_for_page(page), page, event_action, fingerprint(page))

      log_error(response.message) if response.error?
    end

    def slug_for_page(page)
      page.slug
    end

    def fingerprint(page)
      page.sha
    end
  end
end

WikiPages::BaseService.prepend_mod_with('WikiPages::BaseService')