1# frozen_string_literal: true
2
3module Types
4  class QueryType < ::Types::BaseObject
5    graphql_name 'Query'
6
7    # The design management context object needs to implement #issue
8    DesignManagementObject = Struct.new(:issue)
9
10    field :project, Types::ProjectType,
11          null: true,
12          resolver: Resolvers::ProjectResolver,
13          description: "Find a project."
14
15    field :projects, Types::ProjectType.connection_type,
16          null: true,
17          resolver: Resolvers::ProjectsResolver,
18          description: "Find projects visible to the current user."
19
20    field :group, Types::GroupType,
21          null: true,
22          resolver: Resolvers::GroupResolver,
23          description: "Find a group."
24
25    field :current_user, Types::UserType,
26          null: true,
27          description: "Get information about current user."
28
29    field :namespace, Types::NamespaceType,
30          null: true,
31          resolver: Resolvers::NamespaceResolver,
32          description: "Find a namespace."
33
34    field :metadata, Types::MetadataType,
35          null: true,
36          resolver: Resolvers::MetadataResolver,
37          description: 'Metadata about GitLab.'
38
39    field :query_complexity, Types::QueryComplexityType,
40          null: true,
41          description: 'Information about the complexity of the GraphQL query.'
42
43    field :snippets,
44          Types::SnippetType.connection_type,
45          null: true,
46          resolver: Resolvers::SnippetsResolver,
47          description: 'Find Snippets visible to the current user.'
48
49    field :design_management, Types::DesignManagementType,
50          null: false,
51          description: 'Fields related to design management.'
52
53    field :milestone, ::Types::MilestoneType,
54          null: true,
55          description: 'Find a milestone.' do
56            argument :id, ::Types::GlobalIDType[Milestone], required: true, description: 'Find a milestone by its ID.'
57          end
58
59    field :container_repository, Types::ContainerRepositoryDetailsType,
60          null: true,
61          description: 'Find a container repository.' do
62            argument :id,
63                     type: ::Types::GlobalIDType[::ContainerRepository],
64                     required: true,
65                     description: 'Global ID of the container repository.'
66          end
67
68    field :package,
69          description: 'Find a package.',
70          resolver: Resolvers::PackageDetailsResolver
71
72    field :user, Types::UserType,
73          null: true,
74          description: 'Find a user.',
75          resolver: Resolvers::UserResolver
76
77    field :users, Types::UserType.connection_type,
78          null: true,
79          description: 'Find users.',
80          resolver: Resolvers::UsersResolver
81
82    field :echo, resolver: Resolvers::EchoResolver
83
84    field :issue, Types::IssueType,
85          null: true,
86          description: 'Find an issue.' do
87            argument :id, ::Types::GlobalIDType[::Issue], required: true, description: 'Global ID of the issue.'
88          end
89
90    field :merge_request, Types::MergeRequestType,
91          null: true,
92          description: 'Find a merge request.' do
93            argument :id, ::Types::GlobalIDType[::MergeRequest], required: true, description: 'Global ID of the merge request.'
94          end
95
96    field :instance_statistics_measurements,
97          type: Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
98          null: true,
99          description: 'Get statistics on the instance.',
100          resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver,
101          deprecated: {
102            reason: :renamed,
103            replacement: 'Query.usageTrendsMeasurements',
104            milestone: '13.10'
105          }
106
107    field :usage_trends_measurements, Types::Admin::Analytics::UsageTrends::MeasurementType.connection_type,
108          null: true,
109          description: 'Get statistics on the instance.',
110          resolver: Resolvers::Admin::Analytics::UsageTrends::MeasurementsResolver
111
112    field :ci_application_settings, Types::Ci::ApplicationSettingType,
113          null: true,
114          description: 'CI related settings that apply to the entire instance.'
115
116    field :runner_platforms, resolver: Resolvers::Ci::RunnerPlatformsResolver
117    field :runner_setup, resolver: Resolvers::Ci::RunnerSetupResolver
118
119    field :runner, Types::Ci::RunnerType,
120          null: true,
121          resolver: Resolvers::Ci::RunnerResolver,
122          extras: [:lookahead],
123          description: "Find a runner."
124
125    field :runners, Types::Ci::RunnerType.connection_type,
126          null: true,
127          resolver: Resolvers::Ci::RunnersResolver,
128          description: "Find runners visible to the current user."
129
130    field :ci_config, resolver: Resolvers::Ci::ConfigResolver, complexity: 126 # AUTHENTICATED_MAX_COMPLEXITY / 2 + 1
131
132    field :timelogs, Types::TimelogType.connection_type,
133          null: true,
134          description: 'Find timelogs visible to the current user.',
135          extras: [:lookahead],
136          complexity: 5,
137          resolver: ::Resolvers::TimelogResolver
138
139    field :board_list, ::Types::BoardListType,
140          null: true,
141          resolver: Resolvers::BoardListResolver
142
143    field :topics, Types::Projects::TopicType.connection_type,
144          null: true,
145          resolver: Resolvers::TopicsResolver,
146          description: "Find project topics."
147
148    def design_management
149      DesignManagementObject.new(nil)
150    end
151
152    def issue(id:)
153      # TODO: remove this line when the compatibility layer is removed
154      # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
155      id = ::Types::GlobalIDType[::Issue].coerce_isolated_input(id)
156      GitlabSchema.find_by_gid(id)
157    end
158
159    def merge_request(id:)
160      # TODO: remove this line when the compatibility layer is removed
161      # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
162      id = ::Types::GlobalIDType[::MergeRequest].coerce_isolated_input(id)
163      GitlabSchema.find_by_gid(id)
164    end
165
166    def milestone(id:)
167      # TODO: remove this line when the compatibility layer is removed
168      # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
169      id = ::Types::GlobalIDType[Milestone].coerce_isolated_input(id)
170      GitlabSchema.find_by_gid(id)
171    end
172
173    def container_repository(id:)
174      # TODO: remove this line when the compatibility layer is removed
175      # See: https://gitlab.com/gitlab-org/gitlab/-/issues/257883
176      id = ::Types::GlobalIDType[::ContainerRepository].coerce_isolated_input(id)
177      GitlabSchema.find_by_gid(id)
178    end
179
180    def current_user
181      context[:current_user]
182    end
183
184    def ci_application_settings
185      application_settings
186    end
187
188    def application_settings
189      Gitlab::CurrentSettings.current_application_settings
190    end
191
192    def query_complexity
193      context.query
194    end
195  end
196end
197
198Types::QueryType.prepend_mod_with('Types::QueryType')
199