entities.rb 14.1 KB
Newer Older
1
module API
N
Nihad Abbasov 已提交
2
  module Entities
3 4 5
    class UserSafe < Grape::Entity
      expose :name, :username
    end
6

7 8
    class UserBasic < UserSafe
      expose :id, :state, :avatar_url
D
Douwe Maan 已提交
9 10

      expose :web_url do |user, options|
11
        Gitlab::Routing.url_helpers.user_url(user)
D
Douwe Maan 已提交
12
      end
N
Nihad Abbasov 已提交
13
    end
N
Nihad Abbasov 已提交
14

15 16 17
    class User < UserBasic
      expose :created_at
      expose :is_admin?, as: :is_admin
R
Robert Schilling 已提交
18
      expose :bio, :location, :skype, :linkedin, :twitter, :website_url
19 20
    end

21 22 23 24
    class Identity < Grape::Entity
      expose :provider, :extern_uid
    end

25
    class UserFull < User
26 27
      expose :last_sign_in_at
      expose :confirmed_at
28
      expose :email
29
      expose :theme_id, :color_scheme_id, :projects_limit, :current_sign_in_at
30
      expose :identities, using: Entities::Identity
31 32
      expose :can_create_group?, as: :can_create_group
      expose :can_create_project?, as: :can_create_project
33
      expose :two_factor_enabled?, as: :two_factor_enabled
34
      expose :external
35 36
    end

37
    class UserLogin < UserFull
38
      expose :private_token
39 40
    end

41 42 43 44
    class Email < Grape::Entity
      expose :id, :email
    end

M
miks 已提交
45
    class Hook < Grape::Entity
46
      expose :id, :url, :created_at
M
miks 已提交
47 48
    end

49
    class ProjectHook < Hook
50
      expose :project_id, :push_events
51 52
      expose :issues_events, :merge_requests_events, :tag_push_events, :note_events, :build_events
      expose :enable_ssl_verification
53 54
    end

55
    class BasicProjectDetails < Grape::Entity
56 57 58 59 60
      expose :id
      expose :name, :name_with_namespace
      expose :path, :path_with_namespace
    end

N
Nihad Abbasov 已提交
61
    class Project < Grape::Entity
62
      expose :id, :description, :default_branch, :tag_list
63
      expose :public?, as: :public
64
      expose :archived?, as: :archived
65
      expose :visibility_level, :ssh_url_to_repo, :http_url_to_repo, :web_url
66
      expose :owner, using: Entities::UserBasic, unless: ->(project, options) { project.group }
67
      expose :name, :name_with_namespace
68
      expose :path, :path_with_namespace
69
      expose :issues_enabled, :merge_requests_enabled, :wiki_enabled, :builds_enabled, :snippets_enabled, :container_registry_enabled
70
      expose :created_at, :last_activity_at
K
Kamil Trzcinski 已提交
71
      expose :shared_runners_enabled
72
      expose :creator_id
73
      expose :namespace
74
      expose :forked_from_project, using: Entities::BasicProjectDetails, if: lambda{ |project, options| project.forked? }
S
sue445 已提交
75
      expose :avatar_url
76
      expose :star_count, :forks_count
R
Rubén Dávila 已提交
77
      expose :open_issues_count, if: lambda { |project, options| project.issues_enabled? && project.default_issues_tracker? }
78
      expose :runners_token, if: lambda { |_project, options| options[:user_can_admin_project] }
79
      expose :public_builds
N
Nihad Abbasov 已提交
80 81
    end

N
Nihad Abbasov 已提交
82
    class ProjectMember < UserBasic
D
Dmitriy Zaporozhets 已提交
83 84
      expose :access_level do |user, options|
        options[:project].project_members.find_by(user_id: user.id).access_level
N
Nihad Abbasov 已提交
85
      end
M
miks 已提交
86 87
    end

88
    class Group < Grape::Entity
89
      expose :id, :name, :path, :description, :visibility_level
D
Douwe Maan 已提交
90 91 92
      expose :avatar_url

      expose :web_url do |group, options|
93
        Gitlab::Routing.url_helpers.group_url(group)
D
Douwe Maan 已提交
94
      end
95
    end
A
Andrew8xx8 已提交
96

97
    class GroupDetail < Group
98 99 100
      expose :projects, using: Entities::Project
    end

I
Izaak Alpert 已提交
101
    class GroupMember < UserBasic
D
Dmitriy Zaporozhets 已提交
102
      expose :access_level do |user, options|
103
        options[:group].group_members.find_by(user_id: user.id).access_level
I
Izaak Alpert 已提交
104 105 106
      end
    end

N
Nihad Abbasov 已提交
107
    class RepoObject < Grape::Entity
108 109 110 111 112 113 114 115 116 117
      expose :name

      expose :commit do |repo_obj, options|
        if repo_obj.respond_to?(:commit)
          repo_obj.commit
        elsif options[:project]
          options[:project].repository.commit(repo_obj.target)
        end
      end

118 119 120 121 122
      expose :protected do |repo, options|
        if options[:project]
          options[:project].protected_branch? repo.name
        end
      end
N
Nihad Abbasov 已提交
123
    end
N
Nihad Abbasov 已提交
124

125 126 127 128 129 130 131 132 133 134
    class RepoTreeObject < Grape::Entity
      expose :id, :name, :type

      expose :mode do |obj, options|
        filemode = obj.mode.to_s(8)
        filemode = "0" + filemode if filemode.length < 6
        filemode
      end
    end

135 136
    class RepoCommit < Grape::Entity
      expose :id, :short_id, :title, :author_name, :author_email, :created_at
137
      expose :safe_message, as: :message
138 139
    end

140 141
    class RepoCommitDetail < RepoCommit
      expose :parent_ids, :committed_date, :authored_date
K
Kamil Trzcinski 已提交
142
      expose :status
143 144
    end

N
Nihad Abbasov 已提交
145 146
    class ProjectSnippet < Grape::Entity
      expose :id, :title, :file_name
147
      expose :author, using: Entities::UserBasic
R
Robert Speicher 已提交
148
      expose :updated_at, :created_at
149 150 151

      # TODO (rspeicher): Deprecated; remove in 9.0
      expose(:expires_at) { |snippet| nil }
N
Nihad Abbasov 已提交
152
    end
N
Nihad Abbasov 已提交
153

154 155
    class ProjectEntity < Grape::Entity
      expose :id, :iid
156
      expose(:project_id) { |entity| entity.project.id }
157 158
      expose :title, :description
      expose :state, :created_at, :updated_at
159 160
    end

161 162 163 164 165
    class RepoDiff < Grape::Entity
      expose :old_path, :new_path, :a_mode, :b_mode, :diff
      expose :new_file, :renamed_file, :deleted_file
    end

166
    class Milestone < ProjectEntity
167
      expose :due_date
N
Nihad Abbasov 已提交
168 169
    end

170
    class Issue < ProjectEntity
171
      expose :label_names, as: :labels
172 173
      expose :milestone, using: Entities::Milestone
      expose :assignee, :author, using: Entities::UserBasic
174 175 176 177

      expose :subscribed do |issue, options|
        issue.subscribed?(options[:current_user])
      end
Z
Z.J. van de Weg 已提交
178
      expose :user_notes_count
Z
Zeger-Jan van de Weg 已提交
179
      expose :upvotes, :downvotes
N
Nihad Abbasov 已提交
180
    end
A
Alex Denisov 已提交
181

182 183 184 185 186
    class ExternalIssue < Grape::Entity
      expose :title
      expose :id
    end

187
    class MergeRequest < ProjectEntity
V
Valery Sizov 已提交
188
      expose :target_branch, :source_branch
189
      expose :upvotes, :downvotes
190 191
      expose :author, :assignee, using: Entities::UserBasic
      expose :source_project_id, :target_project_id
192
      expose :label_names, as: :labels
193
      expose :description
B
Ben Boeckel 已提交
194
      expose :work_in_progress?, as: :work_in_progress
195
      expose :milestone, using: Entities::Milestone
196
      expose :merge_when_build_succeeds
197
      expose :merge_status
198 199 200
      expose :subscribed do |merge_request, options|
        merge_request.subscribed?(options[:current_user])
      end
Z
Z.J. van de Weg 已提交
201
      expose :user_notes_count
A
Alex Denisov 已提交
202
    end
V
Valeriy Sizov 已提交
203

204 205
    class MergeRequestChanges < MergeRequest
      expose :diffs, as: :changes, using: Entities::RepoDiff do |compare, _|
J
Jacob Vosmaer 已提交
206
        compare.diffs(all_diffs: true).to_a
207 208 209
      end
    end

210 211
    class SSHKey < Grape::Entity
      expose :id, :title, :key, :created_at
V
Valeriy Sizov 已提交
212
    end
213

214 215 216 217
    class SSHKeyWithUser < SSHKey
      expose :user, using: Entities::UserFull
    end

218
    class Note < Grape::Entity
219 220
      expose :id
      expose :note, as: :body
221
      expose :attachment_identifier, as: :attachment
222
      expose :author, using: Entities::UserBasic
223
      expose :created_at, :updated_at
224
      expose :system?, as: :system
D
Dmitriy Zaporozhets 已提交
225
      expose :noteable_id, :noteable_type
226
      # upvote? and downvote? are deprecated, always return false
227 228
      expose(:upvote?)    { |note| false }
      expose(:downvote?)  { |note| false }
229
    end
230 231 232 233 234

    class MRNote < Grape::Entity
      expose :note
      expose :author, using: Entities::UserBasic
    end
D
Dmitriy Zaporozhets 已提交
235

236 237
    class CommitNote < Grape::Entity
      expose :note
D
Douwe Maan 已提交
238
      expose(:path) { |note| note.diff_file_path if note.legacy_diff_note? }
D
Douwe Maan 已提交
239 240
      expose(:line) { |note| note.diff_new_line if note.legacy_diff_note? }
      expose(:line_type) { |note| note.diff_line_type if note.legacy_diff_note? }
241
      expose :author, using: Entities::UserBasic
242
      expose :created_at
243 244
    end

K
Kamil Trzcinski 已提交
245 246
    class CommitStatus < Grape::Entity
      expose :id, :sha, :ref, :status, :name, :target_url, :description,
247
             :created_at, :started_at, :finished_at, :allow_failure
K
Kamil Trzcinski 已提交
248
      expose :author, using: Entities::UserBasic
K
Kamil Trzcinski 已提交
249 250
    end

D
Dmitriy Zaporozhets 已提交
251 252 253 254
    class Event < Grape::Entity
      expose :title, :project_id, :action_name
      expose :target_id, :target_type, :author_id
      expose :data, :target_title
255
      expose :created_at
D
Dmitriy Zaporozhets 已提交
256 257
      expose :note, using: Entities::Note, if: ->(event, options) { event.note? }
      expose :author, using: Entities::UserBasic, if: ->(event, options) { event.author }
258 259 260 261 262 263

      expose :author_username do |event, options|
        if event.author
          event.author.username
        end
      end
D
Dmitriy Zaporozhets 已提交
264
    end
265

266 267 268 269
    class ProjectGroupLink < Grape::Entity
      expose :id, :project_id, :group_id, :group_access
    end

270 271 272
    class Namespace < Grape::Entity
      expose :id, :path, :kind
    end
273

274
    class Member < Grape::Entity
D
Dmitriy Zaporozhets 已提交
275
      expose :access_level
276 277 278 279 280
      expose :notification_level do |member, options|
        if member.notification_setting
          NotificationSetting.levels[member.notification_setting.level]
        end
      end
281 282
    end

283 284 285 286
    class ProjectAccess < Member
    end

    class GroupAccess < Member
287 288
    end

289 290
    class ProjectService < Grape::Entity
      expose :id, :title, :created_at, :updated_at, :active
291
      expose :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events, :build_events
292 293 294 295 296 297 298 299 300
      # Expose serialized properties
      expose :properties do |service, options|
        field_names = service.fields.
          select { |field| options[:include_passwords] || field[:type] != 'password' }.
          map { |field| field[:name] }
        service.properties.slice(*field_names)
      end
    end

301 302 303
    class ProjectWithAccess < Project
      expose :permissions do
        expose :project_access, using: Entities::ProjectAccess do |project, options|
304
          project.project_members.find_by(user_id: options[:user].id)
305 306 307
        end

        expose :group_access, using: Entities::GroupAccess do |project, options|
308
          if project.group
309
            project.group.group_members.find_by(user_id: options[:user].id)
310
          end
311 312 313
        end
      end
    end
314 315

    class Label < Grape::Entity
316
      expose :name, :color, :description
317
      expose :open_issues_count, :closed_issues_count, :open_merge_requests_count
318 319 320 321

      expose :subscribed do |label, options|
        label.subscribed?(options[:current_user])
      end
322
    end
323 324 325

    class Compare < Grape::Entity
      expose :commit, using: Entities::RepoCommit do |compare, options|
326
        Commit.decorate(compare.commits, nil).last
327
      end
328

329
      expose :commits, using: Entities::RepoCommit do |compare, options|
330
        Commit.decorate(compare.commits, nil)
331
      end
332

333
      expose :diffs, using: Entities::RepoDiff do |compare, options|
J
Jacob Vosmaer 已提交
334
        compare.diffs(all_diffs: true).to_a
335
      end
336 337

      expose :compare_timeout do |compare, options|
J
Jacob Vosmaer 已提交
338
        compare.diffs.overflow?
339 340 341
      end

      expose :same, as: :compare_same_ref
342
    end
343 344 345 346

    class Contributor < Grape::Entity
      expose :name, :email, :commits, :additions, :deletions
    end
D
Douwe Maan 已提交
347 348 349 350

    class BroadcastMessage < Grape::Entity
      expose :message, :starts_at, :ends_at, :color, :font
    end
351 352 353 354 355 356 357 358

    class ApplicationSetting < Grape::Entity
      expose :id
      expose :default_projects_limit
      expose :signup_enabled
      expose :signin_enabled
      expose :gravatar_enabled
      expose :sign_in_text
359
      expose :after_sign_up_text
360 361 362 363 364 365 366 367 368
      expose :created_at
      expose :updated_at
      expose :home_page_url
      expose :default_branch_protection
      expose :restricted_visibility_levels
      expose :max_attachment_size
      expose :session_expire_delay
      expose :default_project_visibility
      expose :default_snippet_visibility
369
      expose :default_group_visibility
370 371 372
      expose :restricted_signup_domains
      expose :user_oauth_applications
      expose :after_sign_out_path
373
      expose :container_registry_token_expire_delay
374
    end
D
Dmitriy Zaporozhets 已提交
375 376

    class Release < Grape::Entity
377 378
      expose :tag, as: :tag_name
      expose :description
D
Dmitriy Zaporozhets 已提交
379
    end
380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404

    class RepoTag < Grape::Entity
      expose :name
      expose :message do |repo_obj, _options|
        if repo_obj.respond_to?(:message)
          repo_obj.message
        else
          nil
        end
      end

      expose :commit do |repo_obj, options|
        if repo_obj.respond_to?(:commit)
          repo_obj.commit
        elsif options[:project]
          options[:project].repository.commit(repo_obj.target)
        end
      end

      expose :release, using: Entities::Release do |repo_obj, options|
        if options[:project]
          options[:project].releases.find_by(tag: repo_obj.name)
        end
      end
    end
K
Kamil Trzcinski 已提交
405 406 407 408

    class TriggerRequest < Grape::Entity
      expose :id, :variables
    end
T
Tomasz Maczukin 已提交
409

T
Tomasz Maczukin 已提交
410
    class Runner < Grape::Entity
T
Tomasz Maczukin 已提交
411 412 413 414 415 416 417
      expose :id
      expose :description
      expose :active
      expose :is_shared
      expose :name
    end

418 419
    class RunnerDetails < Runner
      expose :tag_list
420
      expose :run_untagged
421
      expose :version, :revision, :platform, :architecture
422
      expose :contacted_at
423
      expose :token, if: lambda { |runner, options| options[:current_user].is_admin? || !runner.is_shared? }
424
      expose :projects, with: Entities::BasicProjectDetails do |runner, options|
425
        if options[:current_user].is_admin?
426 427
          runner.projects
        else
428
          options[:current_user].authorized_projects.where(id: runner.projects)
429 430
        end
      end
431 432
    end

433 434 435 436
    class BuildArtifactFile < Grape::Entity
      expose :filename, :size
    end

437
    class Build < Grape::Entity
T
Tomasz Maczukin 已提交
438
      expose :id, :status, :stage, :name, :ref, :tag, :coverage
T
Tomasz Maczukin 已提交
439
      expose :created_at, :started_at, :finished_at
T
Tomasz Maczukin 已提交
440
      expose :user, with: User
K
Kamil Trzcinski 已提交
441
      expose :artifacts_file, using: BuildArtifactFile, if: -> (build, opts) { build.artifacts? }
T
Tomasz Maczukin 已提交
442 443 444 445 446 447
      expose :commit, with: RepoCommit do |repo_obj, _options|
        if repo_obj.respond_to?(:commit)
          repo_obj.commit.commit_data
        end
      end
      expose :runner, with: Runner
448
    end
449

T
Tomasz Maczukin 已提交
450
    class Trigger < Grape::Entity
T
Tomasz Maczukin 已提交
451
      expose :token, :created_at, :updated_at, :deleted_at, :last_used
T
Tomasz Maczukin 已提交
452
    end
453

454
    class Variable < Grape::Entity
T
Tomasz Maczukin 已提交
455
      expose :key, :value
456
    end
457

458
    class RepoLicense < Grape::Entity
459 460
      expose :key, :name, :nickname
      expose :featured, as: :popular
461 462 463
      expose :url, as: :html_url
      expose(:source_url) { |license| license.meta['source'] }
      expose(:description) { |license| license.meta['description'] }
464 465 466
      expose(:conditions) { |license| license.meta['conditions'] }
      expose(:permissions) { |license| license.meta['permissions'] }
      expose(:limitations) { |license| license.meta['limitations'] }
467 468
      expose :content
    end
469 470 471 472 473 474 475 476

    class GitignoresList < Grape::Entity
      expose :name
    end

    class Gitignore < Grape::Entity
      expose :name, :content
    end
N
Nihad Abbasov 已提交
477 478
  end
end