BigW Consortium Gitlab

templates.rb 4.57 KB
Newer Older
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
module API
  module V3
    class Templates < Grape::API
      GLOBAL_TEMPLATE_TYPES = {
        gitignores: {
          klass: Gitlab::Template::GitignoreTemplate,
          gitlab_version: 8.8
        },
        gitlab_ci_ymls: {
          klass: Gitlab::Template::GitlabCiYmlTemplate,
          gitlab_version: 8.9
        },
        dockerfiles: {
          klass: Gitlab::Template::DockerfileTemplate,
          gitlab_version: 8.15
        }
      }.freeze
      PROJECT_TEMPLATE_REGEX =
        /[\<\{\[]
          (project|description|
          one\sline\s.+\swhat\sit\sdoes\.) # matching the start and end is enough here
        [\>\}\]]/xi.freeze
      YEAR_TEMPLATE_REGEX = /[<{\[](year|yyyy)[>}\]]/i.freeze
      FULLNAME_TEMPLATE_REGEX =
        /[\<\{\[]
          (fullname|name\sof\s(author|copyright\sowner))
        [\>\}\]]/xi.freeze
      DEPRECATION_MESSAGE = ' This endpoint is deprecated and has been removed in V4.'.freeze

      helpers do
        def parsed_license_template
          # We create a fresh Licensee::License object since we'll modify its
          # content in place below.
          template = Licensee::License.new(params[:name])

          template.content.gsub!(YEAR_TEMPLATE_REGEX, Time.now.year.to_s)
          template.content.gsub!(PROJECT_TEMPLATE_REGEX, params[:project]) if params[:project].present?

          fullname = params[:fullname].presence || current_user.try(:name)
          template.content.gsub!(FULLNAME_TEMPLATE_REGEX, fullname) if fullname
          template
        end

        def render_response(template_type, template)
          not_found!(template_type.to_s.singularize) unless template
          present template, with: ::API::Entities::Template
        end
      end

      { "licenses" => :deprecated, "templates/licenses" => :ok }.each do |route, status|
        desc 'Get the list of the available license template' do
          detailed_desc = 'This feature was introduced in GitLab 8.7.'
          detailed_desc << DEPRECATION_MESSAGE unless status == :ok
          detail detailed_desc
55
          success ::API::Entities::License
56 57 58 59 60 61
        end
        params do
          optional :popular, type: Boolean, desc: 'If passed, returns only popular licenses'
        end
        get route do
          options = {
62
            featured: declared(params)[:popular].present? ? true : nil
63
          }
64
          present Licensee::License.all(options), with: ::API::Entities::License
65 66 67 68 69 70 71 72
        end
      end

      { "licenses/:name" => :deprecated, "templates/licenses/:name" => :ok }.each do |route, status|
        desc 'Get the text for a specific license' do
          detailed_desc = 'This feature was introduced in GitLab 8.7.'
          detailed_desc << DEPRECATION_MESSAGE unless status == :ok
          detail detailed_desc
73
          success ::API::Entities::License
74 75 76 77 78
        end
        params do
          requires :name, type: String, desc: 'The name of the template'
        end
        get route, requirements: { name: /[\w\.-]+/ } do
79
          not_found!('License') unless Licensee::License.find(declared(params)[:name])
80 81 82

          template = parsed_license_template

83
          present template, with: ::API::Entities::License
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
        end
      end

      GLOBAL_TEMPLATE_TYPES.each do |template_type, properties|
        klass = properties[:klass]
        gitlab_version = properties[:gitlab_version]

        { template_type => :deprecated, "templates/#{template_type}" => :ok }.each do |route, status|
          desc 'Get the list of the available template' do
            detailed_desc = "This feature was introduced in GitLab #{gitlab_version}."
            detailed_desc << DEPRECATION_MESSAGE unless status == :ok
            detail detailed_desc
            success ::API::Entities::TemplatesList
          end
          get route do
            present klass.all, with: ::API::Entities::TemplatesList
          end
        end

        { "#{template_type}/:name" => :deprecated, "templates/#{template_type}/:name" => :ok }.each do |route, status|
          desc 'Get the text for a specific template present in local filesystem' do
            detailed_desc = "This feature was introduced in GitLab #{gitlab_version}."
            detailed_desc << DEPRECATION_MESSAGE unless status == :ok
            detail detailed_desc
            success ::API::Entities::Template
          end
          params do
            requires :name, type: String, desc: 'The name of the template'
          end
          get route do
114
            new_template = klass.find(declared(params)[:name])
115 116 117 118 119 120 121 122

            render_response(template_type, new_template)
          end
        end
      end
    end
  end
end