mirror of
https://gitlab.com/gitlab-org/gitlab-foss.git
synced 2025-07-21 23:43:41 +00:00
42 lines
1.3 KiB
Ruby
42 lines
1.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Gitlab
|
|
module WebHooks
|
|
GITLAB_EVENT_HEADER = 'X-Gitlab-Event'
|
|
GITLAB_INSTANCE_HEADER = 'X-Gitlab-Instance'
|
|
GITLAB_UUID_HEADER = 'X-Gitlab-Webhook-UUID'
|
|
|
|
class << self
|
|
def prepare_data(data)
|
|
data = data.with_indifferent_access
|
|
|
|
return data unless data[:object_kind] == 'wiki_page'
|
|
|
|
prepare_wiki_data(data)
|
|
end
|
|
|
|
private
|
|
|
|
# Wiki webhook data does not have "content" attribute yet.
|
|
# As Wiki content is versioned in git, we can lazily retrieve the content
|
|
# from source control and it will be identical to when webhook event was triggered.
|
|
# This is an optimization to serializing wiki content data which can
|
|
# sometimes be over the Sidekiq payload limit.
|
|
def prepare_wiki_data(data)
|
|
project_id = data.dig(:project, :id)
|
|
slug = data.dig(:object_attributes, :slug)
|
|
version_id = data.dig(:object_attributes, :version_id)
|
|
return data unless [project_id, slug, version_id].all?(&:present?)
|
|
|
|
wiki = ProjectWiki.find_by_id(project_id)
|
|
return data unless wiki
|
|
|
|
page = wiki.find_page(slug, version_id)
|
|
return data unless page
|
|
|
|
data.deep_merge(object_attributes: { content: Gitlab::HookData::WikiPageBuilder.new(page).page_content })
|
|
end
|
|
end
|
|
end
|
|
end
|