summaryrefslogtreecommitdiff
path: root/lib/api/lsif_data.rb
blob: a673ccb4af040a0aeed9ea623c4f7793de36c159 (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
# frozen_string_literal: true

module API
  class LsifData < Grape::API
    MAX_FILE_SIZE = 10.megabytes

    before do
      not_found! if Feature.disabled?(:code_navigation, user_project)
    end

    params do
      requires :id, type: String, desc: 'The ID of a project'
      requires :commit_id, type: String, desc: 'The ID of a commit'
    end
    resource :projects, requirements: API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
      segment ':id/commits/:commit_id' do
        params do
          requires :paths, type: Array, desc: 'The paths of the files'
        end
        get 'lsif/info' do
          authorize! :download_code, user_project

          artifact =
            Ci::JobArtifact
              .with_file_types(['lsif'])
              .for_sha(params[:commit_id], @project.id)
              .last

          not_found! unless artifact
          authorize! :read_pipeline, artifact.job.pipeline
          file_too_large! if artifact.file.cached_size > MAX_FILE_SIZE

          service = ::Projects::LsifDataService.new(artifact.file, @project, params[:commit_id])

          params[:paths].to_h { |path| [path, service.execute(path)] }
        end
      end
    end
  end
end