debian-mirror-gitlab/app/models/badge.rb

62 lines
1.9 KiB
Ruby
Raw Normal View History

2018-11-18 11:00:15 +05:30
# frozen_string_literal: true
2019-07-07 11:18:12 +05:30
class Badge < ApplicationRecord
2018-12-05 23:21:45 +05:30
include FromUnion
2018-03-27 19:54:05 +05:30
# This structure sets the placeholders that the urls
# can have. This hash also sets which action to ask when
# the placeholder is found.
PLACEHOLDERS = {
'project_path' => :full_path,
2023-03-04 22:38:38 +05:30
'project_title' => :title,
'project_name' => :path,
2018-03-27 19:54:05 +05:30
'project_id' => :id,
'default_branch' => :default_branch,
'commit_sha' => ->(project) { project.commit&.sha }
}.freeze
# This regex is built dynamically using the keys from the PLACEHOLDER struct.
# So, we can easily add new placeholder just by modifying the PLACEHOLDER hash.
# This regex will build the new PLACEHOLDER_REGEX with the new information
PLACEHOLDERS_REGEX = /(#{PLACEHOLDERS.keys.join('|')})/.freeze
2020-06-23 00:09:42 +05:30
default_scope { order_created_at_asc } # rubocop:disable Cop/DefaultScope
2018-03-27 19:54:05 +05:30
scope :order_created_at_asc, -> { reorder(created_at: :asc) }
2020-01-01 13:55:28 +05:30
scope :with_name, ->(name) { where(name: name) }
2019-07-31 22:56:46 +05:30
validates :link_url, :image_url, addressable_url: true
2018-03-27 19:54:05 +05:30
validates :type, presence: true
def rendered_link_url(project = nil)
build_rendered_url(link_url, project)
end
def rendered_image_url(project = nil)
2020-03-07 23:17:34 +05:30
Gitlab::AssetProxy.proxy_url(
build_rendered_url(image_url, project)
)
2018-03-27 19:54:05 +05:30
end
private
def build_rendered_url(url, project = nil)
2023-05-27 22:25:52 +05:30
return url unless project
2018-03-27 19:54:05 +05:30
Gitlab::StringPlaceholderReplacer.replace_string_placeholders(url, PLACEHOLDERS_REGEX) do |arg|
replace_placeholder_action(PLACEHOLDERS[arg], project)
end
end
# The action param represents the :symbol or Proc to call in order
# to retrieve the return value from the project.
# This method checks if it is a Proc and use the call method, and if it is
# a symbol just send the action
def replace_placeholder_action(action, project)
return unless project
action.is_a?(Proc) ? action.call(project) : project.public_send(action) # rubocop:disable GitlabSecurity/PublicSend
end
end