entities.rb 15.2 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
      expose :avatar_url
R
Rémy Coutable 已提交
91
      expose :web_url
92
    end
A
Andrew8xx8 已提交
93

94
    class GroupDetail < Group
95 96 97
      expose :projects, using: Entities::Project
    end

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

N
Nihad Abbasov 已提交
104
    class RepoObject < Grape::Entity
105 106 107 108 109 110 111 112 113 114
      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

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

122 123 124 125 126 127 128 129 130 131
    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

132 133
    class RepoCommit < Grape::Entity
      expose :id, :short_id, :title, :author_name, :author_email, :created_at
134
      expose :safe_message, as: :message
135 136
    end

137 138
    class RepoCommitDetail < RepoCommit
      expose :parent_ids, :committed_date, :authored_date
K
Kamil Trzcinski 已提交
139
      expose :status
140 141
    end

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

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

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

158 159 160 161 162
    class RepoDiff < Grape::Entity
      expose :old_path, :new_path, :a_mode, :b_mode, :diff
      expose :new_file, :renamed_file, :deleted_file
    end

163
    class Milestone < ProjectEntity
164
      expose :due_date
N
Nihad Abbasov 已提交
165 166
    end

167
    class Issue < ProjectEntity
168
      expose :label_names, as: :labels
169 170
      expose :milestone, using: Entities::Milestone
      expose :assignee, :author, using: Entities::UserBasic
171 172 173 174

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

179 180 181 182 183
    class ExternalIssue < Grape::Entity
      expose :title
      expose :id
    end

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

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

207 208
    class SSHKey < Grape::Entity
      expose :id, :title, :key, :created_at
V
Valeriy Sizov 已提交
209
    end
210

211 212 213 214
    class SSHKeyWithUser < SSHKey
      expose :user, using: Entities::UserFull
    end

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

Z
Z.J. van de Weg 已提交
228 229 230 231 232 233 234 235
    class AwardEmoji < Grape::Entity
      expose :id
      expose :name
      expose :user, using: Entities::UserBasic
      expose :created_at, :updated_at
      expose :awardable_id, :awardable_type
    end

236 237 238 239
    class MRNote < Grape::Entity
      expose :note
      expose :author, using: Entities::UserBasic
    end
D
Dmitriy Zaporozhets 已提交
240

241 242
    class CommitNote < Grape::Entity
      expose :note
D
Douwe Maan 已提交
243
      expose(:path) { |note| note.diff_file_path if note.legacy_diff_note? }
D
Douwe Maan 已提交
244 245
      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? }
246
      expose :author, using: Entities::UserBasic
247
      expose :created_at
248 249
    end

K
Kamil Trzcinski 已提交
250 251
    class CommitStatus < Grape::Entity
      expose :id, :sha, :ref, :status, :name, :target_url, :description,
252
             :created_at, :started_at, :finished_at, :allow_failure
K
Kamil Trzcinski 已提交
253
      expose :author, using: Entities::UserBasic
K
Kamil Trzcinski 已提交
254 255
    end

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

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

271 272 273 274
    class ProjectGroupLink < Grape::Entity
      expose :id, :project_id, :group_id, :group_access
    end

D
Douglas Barbosa Alexandre 已提交
275 276 277 278
    class Todo < Grape::Entity
      expose :id
      expose :project, using: Entities::BasicProjectDetails
      expose :author, using: Entities::UserBasic
R
Robert Schilling 已提交
279
      expose :action_name
D
Douglas Barbosa Alexandre 已提交
280
      expose :target_type
281 282 283

      expose :target do |todo, options|
        Entities.const_get(todo.target_type).represent(todo.target, options)
D
Douglas Barbosa Alexandre 已提交
284 285 286 287 288
      end

      expose :target_url do |todo, options|
        target_type   = todo.target_type.underscore
        target_url    = "namespace_project_#{target_type}_url"
289
        target_anchor = "note_#{todo.note_id}" if todo.note_id?
D
Douglas Barbosa Alexandre 已提交
290 291 292 293 294 295 296 297 298 299

        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

300 301 302
    class Namespace < Grape::Entity
      expose :id, :path, :kind
    end
303

304
    class Member < Grape::Entity
D
Dmitriy Zaporozhets 已提交
305
      expose :access_level
306 307 308 309 310
      expose :notification_level do |member, options|
        if member.notification_setting
          NotificationSetting.levels[member.notification_setting.level]
        end
      end
311 312
    end

313 314 315 316
    class ProjectAccess < Member
    end

    class GroupAccess < Member
317 318
    end

319 320
    class ProjectService < Grape::Entity
      expose :id, :title, :created_at, :updated_at, :active
321
      expose :push_events, :issues_events, :merge_requests_events, :tag_push_events, :note_events, :build_events
322 323 324 325 326 327 328 329 330
      # 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

331
    class BasicProjectWithAccess < BasicProjectDetails
332 333 334 335 336 337 338
      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

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

        expose :group_access, using: Entities::GroupAccess do |project, options|
346
          if project.group
347
            project.group.group_members.find_by(user_id: options[:user].id)
348
          end
349 350 351
        end
      end
    end
352 353

    class Label < Grape::Entity
354
      expose :name, :color, :description
355
      expose :open_issues_count, :closed_issues_count, :open_merge_requests_count
356 357 358 359

      expose :subscribed do |label, options|
        label.subscribed?(options[:current_user])
      end
360
    end
361 362 363

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

367
      expose :commits, using: Entities::RepoCommit do |compare, options|
368
        Commit.decorate(compare.commits, nil)
369
      end
370

371
      expose :diffs, using: Entities::RepoDiff do |compare, options|
J
Jacob Vosmaer 已提交
372
        compare.diffs(all_diffs: true).to_a
373
      end
374 375

      expose :compare_timeout do |compare, options|
J
Jacob Vosmaer 已提交
376
        compare.diffs.overflow?
377 378 379
      end

      expose :same, as: :compare_same_ref
380
    end
381 382 383 384

    class Contributor < Grape::Entity
      expose :name, :email, :commits, :additions, :deletions
    end
D
Douwe Maan 已提交
385 386 387 388

    class BroadcastMessage < Grape::Entity
      expose :message, :starts_at, :ends_at, :color, :font
    end
389 390 391 392 393 394 395 396

    class ApplicationSetting < Grape::Entity
      expose :id
      expose :default_projects_limit
      expose :signup_enabled
      expose :signin_enabled
      expose :gravatar_enabled
      expose :sign_in_text
397
      expose :after_sign_up_text
398 399 400 401 402 403 404 405 406
      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
407
      expose :default_group_visibility
408 409 410
      expose :restricted_signup_domains
      expose :user_oauth_applications
      expose :after_sign_out_path
411
      expose :container_registry_token_expire_delay
412
      expose :repository_storage
413
    end
D
Dmitriy Zaporozhets 已提交
414 415

    class Release < Grape::Entity
416 417
      expose :tag, as: :tag_name
      expose :description
D
Dmitriy Zaporozhets 已提交
418
    end
419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443

    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 已提交
444 445 446 447

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

T
Tomasz Maczukin 已提交
449
    class Runner < Grape::Entity
T
Tomasz Maczukin 已提交
450 451 452 453 454 455 456
      expose :id
      expose :description
      expose :active
      expose :is_shared
      expose :name
    end

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

473 474 475 476
    class BuildArtifactFile < Grape::Entity
      expose :filename, :size
    end

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

T
Tomasz Maczukin 已提交
486
    class Trigger < Grape::Entity
T
Tomasz Maczukin 已提交
487
      expose :token, :created_at, :updated_at, :deleted_at, :last_used
T
Tomasz Maczukin 已提交
488
    end
489

490
    class Variable < Grape::Entity
T
Tomasz Maczukin 已提交
491
      expose :key, :value
492
    end
493

494
    class RepoLicense < Grape::Entity
495 496
      expose :key, :name, :nickname
      expose :featured, as: :popular
497 498 499
      expose :url, as: :html_url
      expose(:source_url) { |license| license.meta['source'] }
      expose(:description) { |license| license.meta['description'] }
500 501 502
      expose(:conditions) { |license| license.meta['conditions'] }
      expose(:permissions) { |license| license.meta['permissions'] }
      expose(:limitations) { |license| license.meta['limitations'] }
503 504
      expose :content
    end
505

Z
ZJ van de Weg 已提交
506
    class TemplatesList < Grape::Entity
507 508 509
      expose :name
    end

Z
ZJ van de Weg 已提交
510
    class Template < Grape::Entity
511 512
      expose :name, :content
    end
N
Nihad Abbasov 已提交
513 514
  end
end