64 lines
1.8 KiB
Ruby
64 lines
1.8 KiB
Ruby
# 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_if_ee('EE::WikiPages::BaseService')
|