1# frozen_string_literal: true
2
3module Resolvers
4  class BoardListsResolver < BaseResolver
5    include BoardItemFilterable
6    include Gitlab::Graphql::Authorize::AuthorizeResource
7    include LooksAhead
8
9    type Types::BoardListType, null: true
10    authorize :read_issue_board_list
11    authorizes_object!
12
13    argument :id, Types::GlobalIDType[List],
14             required: false,
15             description: 'Find a list by its global ID.'
16
17    argument :issue_filters, Types::Boards::BoardIssueInputType,
18             required: false,
19             description: 'Filters applied when getting issue metadata in the board list.'
20
21    alias_method :board, :object
22
23    def resolve_with_lookahead(id: nil, issue_filters: {})
24      lists = board_lists(id)
25      context.scoped_set!(:issue_filters, item_filters(issue_filters))
26
27      List.preload_preferences_for_user(lists, current_user) if load_preferences?
28
29      offset_pagination(lists)
30    end
31
32    private
33
34    def board_lists(id)
35      service = ::Boards::Lists::ListService.new(
36        board.resource_parent,
37        current_user,
38        list_id: extract_list_id(id)
39      )
40
41      service.execute(board, create_default_lists: false)
42    end
43
44    def load_preferences?
45      node_selection&.selects?(:collapsed)
46    end
47
48    def extract_list_id(gid)
49      return unless gid.present?
50
51      GitlabSchema.parse_gid(gid, expected_type: ::List).model_id
52    end
53  end
54end
55