entities.rb 15.3 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

82 83 84 85 86 87
    class SimpleProject < Grape::Entity
      expose :id
      expose :name, :name_with_namespace
      expose :http_url_to_repo
    end

N
Nihad Abbasov 已提交
88
    class ProjectMember < UserBasic
D
Dmitriy Zaporozhets 已提交
89 90
      expose :access_level do |user, options|
        options[:project].project_members.find_by(user_id: user.id).access_level
N
Nihad Abbasov 已提交
91
      end
M
miks 已提交
92 93
    end

94
    class Group < Grape::Entity
95
      expose :id, :name, :path, :description, :visibility_level
D
Douwe Maan 已提交
96
      expose :avatar_url
R
Rémy Coutable 已提交
97
      expose :web_url
98
    end
A
Andrew8xx8 已提交
99

100
    class GroupDetail < Group
101 102 103
      expose :projects, using: Entities::Project
    end

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

N
Nihad Abbasov 已提交
110
    class RepoObject < Grape::Entity
111 112 113 114 115 116 117 118 119 120
      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

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

128 129 130 131 132 133 134 135 136 137
    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

138 139
    class RepoCommit < Grape::Entity
      expose :id, :short_id, :title, :author_name, :author_email, :created_at
140
      expose :safe_message, as: :message
141 142
    end

143 144
    class RepoCommitDetail < RepoCommit
      expose :parent_ids, :committed_date, :authored_date
K
Kamil Trzcinski 已提交
145
      expose :status
146 147
    end

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

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

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

164 165 166 167 168
    class RepoDiff < Grape::Entity
      expose :old_path, :new_path, :a_mode, :b_mode, :diff
      expose :new_file, :renamed_file, :deleted_file
    end

169
    class Milestone < ProjectEntity
170
      expose :due_date
N
Nihad Abbasov 已提交
171 172
    end

173
    class Issue < ProjectEntity
174
      expose :label_names, as: :labels
175 176
      expose :milestone, using: Entities::Milestone
      expose :assignee, :author, using: Entities::UserBasic
177 178 179 180

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

185 186 187 188 189
    class ExternalIssue < Grape::Entity
      expose :title
      expose :id
    end

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

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

213 214
    class SSHKey < Grape::Entity
      expose :id, :title, :key, :created_at
V
Valeriy Sizov 已提交
215
    end
216

217 218 219 220
    class SSHKeyWithUser < SSHKey
      expose :user, using: Entities::UserFull
    end

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

Z
Z.J. van de Weg 已提交
234 235 236 237 238 239 240 241
    class AwardEmoji < Grape::Entity
      expose :id
      expose :name
      expose :user, using: Entities::UserBasic
      expose :created_at, :updated_at
      expose :awardable_id, :awardable_type
    end

242 243 244 245
    class MRNote < Grape::Entity
      expose :note
      expose :author, using: Entities::UserBasic
    end
D
Dmitriy Zaporozhets 已提交
246

247 248
    class CommitNote < Grape::Entity
      expose :note
D
Douwe Maan 已提交
249
      expose(:path) { |note| note.diff_file_path if note.legacy_diff_note? }
D
Douwe Maan 已提交
250 251
      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? }
252
      expose :author, using: Entities::UserBasic
253
      expose :created_at
254 255
    end

K
Kamil Trzcinski 已提交
256 257
    class CommitStatus < Grape::Entity
      expose :id, :sha, :ref, :status, :name, :target_url, :description,
258
             :created_at, :started_at, :finished_at, :allow_failure
K
Kamil Trzcinski 已提交
259
      expose :author, using: Entities::UserBasic
K
Kamil Trzcinski 已提交
260 261
    end

D
Dmitriy Zaporozhets 已提交
262 263 264 265
    class Event < Grape::Entity
      expose :title, :project_id, :action_name
      expose :target_id, :target_type, :author_id
      expose :data, :target_title
266
      expose :created_at
D
Dmitriy Zaporozhets 已提交
267 268
      expose :note, using: Entities::Note, if: ->(event, options) { event.note? }
      expose :author, using: Entities::UserBasic, if: ->(event, options) { event.author }
269 270 271 272 273 274

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

277 278 279 280
    class ProjectGroupLink < Grape::Entity
      expose :id, :project_id, :group_id, :group_access
    end

D
Douglas Barbosa Alexandre 已提交
281 282 283 284
    class Todo < Grape::Entity
      expose :id
      expose :project, using: Entities::BasicProjectDetails
      expose :author, using: Entities::UserBasic
R
Robert Schilling 已提交
285
      expose :action_name
D
Douglas Barbosa Alexandre 已提交
286
      expose :target_type
287 288 289

      expose :target do |todo, options|
        Entities.const_get(todo.target_type).represent(todo.target, options)
D
Douglas Barbosa Alexandre 已提交
290 291 292 293 294
      end

      expose :target_url do |todo, options|
        target_type   = todo.target_type.underscore
        target_url    = "namespace_project_#{target_type}_url"
295
        target_anchor = "note_#{todo.note_id}" if todo.note_id?
D
Douglas Barbosa Alexandre 已提交
296 297 298 299 300 301 302 303 304 305

        Gitlab::Application.routes.url_helpers.public_send(target_url,
          todo.project.namespace, todo.project, todo.target, anchor: target_anchor)
      end

      expose :body
      expose :state
      expose :created_at
    end

306 307 308
    class Namespace < Grape::Entity
      expose :id, :path, :kind
    end
309

310
    class Member < Grape::Entity
D
Dmitriy Zaporozhets 已提交
311
      expose :access_level
312 313 314 315 316
      expose :notification_level do |member, options|
        if member.notification_setting
          NotificationSetting.levels[member.notification_setting.level]
        end
      end
317 318
    end

319 320 321 322
    class ProjectAccess < Member
    end

    class GroupAccess < Member
323 324
    end

325 326
    class ProjectService < Grape::Entity
      expose :id, :title, :created_at, :updated_at, :active
327
      expose :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events, :build_events
328 329 330 331 332 333 334 335 336
      # 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

337 338 339 340 341 342 343 344
    class SimpleProjectWithAccess < SimpleProject
      expose :permissions do
        expose :project_access, using: Entities::ProjectAccess do |project, options|
          project.project_members.find_by(user_id: options[:user].id)
        end
      end
    end

345 346 347
    class ProjectWithAccess < Project
      expose :permissions do
        expose :project_access, using: Entities::ProjectAccess do |project, options|
348
          project.project_members.find_by(user_id: options[:user].id)
349 350 351
        end

        expose :group_access, using: Entities::GroupAccess do |project, options|
352
          if project.group
353
            project.group.group_members.find_by(user_id: options[:user].id)
354
          end
355 356 357
        end
      end
    end
358 359

    class Label < Grape::Entity
360
      expose :name, :color, :description
361
      expose :open_issues_count, :closed_issues_count, :open_merge_requests_count
362 363 364 365

      expose :subscribed do |label, options|
        label.subscribed?(options[:current_user])
      end
366
    end
367 368 369

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

373
      expose :commits, using: Entities::RepoCommit do |compare, options|
374
        Commit.decorate(compare.commits, nil)
375
      end
376

377
      expose :diffs, using: Entities::RepoDiff do |compare, options|
J
Jacob Vosmaer 已提交
378
        compare.diffs(all_diffs: true).to_a
379
      end
380 381

      expose :compare_timeout do |compare, options|
J
Jacob Vosmaer 已提交
382
        compare.diffs.overflow?
383 384 385
      end

      expose :same, as: :compare_same_ref
386
    end
387 388 389 390

    class Contributor < Grape::Entity
      expose :name, :email, :commits, :additions, :deletions
    end
D
Douwe Maan 已提交
391 392 393 394

    class BroadcastMessage < Grape::Entity
      expose :message, :starts_at, :ends_at, :color, :font
    end
395 396 397 398 399 400 401 402

    class ApplicationSetting < Grape::Entity
      expose :id
      expose :default_projects_limit
      expose :signup_enabled
      expose :signin_enabled
      expose :gravatar_enabled
      expose :sign_in_text
403
      expose :after_sign_up_text
404 405 406 407 408 409 410 411 412
      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
413
      expose :default_group_visibility
414 415 416
      expose :restricted_signup_domains
      expose :user_oauth_applications
      expose :after_sign_out_path
417
      expose :container_registry_token_expire_delay
418
      expose :repository_storage
419
    end
D
Dmitriy Zaporozhets 已提交
420 421

    class Release < Grape::Entity
422 423
      expose :tag, as: :tag_name
      expose :description
D
Dmitriy Zaporozhets 已提交
424
    end
425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449

    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 已提交
450 451 452 453

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

T
Tomasz Maczukin 已提交
455
    class Runner < Grape::Entity
T
Tomasz Maczukin 已提交
456 457 458 459 460 461 462
      expose :id
      expose :description
      expose :active
      expose :is_shared
      expose :name
    end

463 464
    class RunnerDetails < Runner
      expose :tag_list
465
      expose :run_untagged
466
      expose :locked
467
      expose :version, :revision, :platform, :architecture
468
      expose :contacted_at
469
      expose :token, if: lambda { |runner, options| options[:current_user].is_admin? || !runner.is_shared? }
470
      expose :projects, with: Entities::BasicProjectDetails do |runner, options|
471
        if options[:current_user].is_admin?
472 473
          runner.projects
        else
474
          options[:current_user].authorized_projects.where(id: runner.projects)
475 476
        end
      end
477 478
    end

479 480 481 482
    class BuildArtifactFile < Grape::Entity
      expose :filename, :size
    end

483
    class Build < Grape::Entity
T
Tomasz Maczukin 已提交
484
      expose :id, :status, :stage, :name, :ref, :tag, :coverage
T
Tomasz Maczukin 已提交
485
      expose :created_at, :started_at, :finished_at
T
Tomasz Maczukin 已提交
486
      expose :user, with: User
K
Kamil Trzcinski 已提交
487
      expose :artifacts_file, using: BuildArtifactFile, if: -> (build, opts) { build.artifacts? }
488
      expose :commit, with: RepoCommit
T
Tomasz Maczukin 已提交
489
      expose :runner, with: Runner
490
    end
491

T
Tomasz Maczukin 已提交
492
    class Trigger < Grape::Entity
T
Tomasz Maczukin 已提交
493
      expose :token, :created_at, :updated_at, :deleted_at, :last_used
T
Tomasz Maczukin 已提交
494
    end
495

496
    class Variable < Grape::Entity
T
Tomasz Maczukin 已提交
497
      expose :key, :value
498
    end
499

500
    class RepoLicense < Grape::Entity
501 502
      expose :key, :name, :nickname
      expose :featured, as: :popular
503 504 505
      expose :url, as: :html_url
      expose(:source_url) { |license| license.meta['source'] }
      expose(:description) { |license| license.meta['description'] }
506 507 508
      expose(:conditions) { |license| license.meta['conditions'] }
      expose(:permissions) { |license| license.meta['permissions'] }
      expose(:limitations) { |license| license.meta['limitations'] }
509 510
      expose :content
    end
511

Z
ZJ van de Weg 已提交
512
    class TemplatesList < Grape::Entity
513 514 515
      expose :name
    end

Z
ZJ van de Weg 已提交
516
    class Template < Grape::Entity
517 518
      expose :name, :content
    end
N
Nihad Abbasov 已提交
519 520
  end
end