summaryrefslogtreecommitdiff
path: root/app/graphql/resolvers/concerns/resolves_snippets.rb
blob: 483372bbf634288be43ce866ed0bf59f23c77469 (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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# frozen_string_literal: true

module ResolvesSnippets
  extend ActiveSupport::Concern

  included do
    type Types::SnippetType, null: false

    argument :ids, [GraphQL::ID_TYPE],
             required: false,
             description: 'Array of global snippet ids, e.g., "gid://gitlab/ProjectSnippet/1"'

    argument :visibility, Types::Snippets::VisibilityScopesEnum,
             required: false,
             description: 'The visibility of the snippet'
  end

  def resolve(**args)
    resolve_snippets(args)
  end

  private

  def resolve_snippets(args)
    SnippetsFinder.new(context[:current_user], snippet_finder_params(args)).execute
  end

  def snippet_finder_params(args)
    {
      ids: resolve_ids(args[:ids]),
      scope: args[:visibility]
    }.merge(options_by_type(args[:type]))
  end

  def resolve_ids(ids)
    Array.wrap(ids).map { |id| resolve_gid(id, :id) }
  end

  def resolve_gid(gid, argument)
    return unless gid.present?

    GlobalID.parse(gid)&.model_id.tap do |id|
      raise Gitlab::Graphql::Errors::ArgumentError, "Invalid global id format for param #{argument}" if id.nil?
    end
  end

  def options_by_type(type)
    case type
    when 'personal'
      { only_personal: true }
    when 'project'
      { only_project: true }
    else
      {}
    end
  end
end