entities.rb 6.72 KB
Newer Older
1
module API
Nihad Abbasov's avatar
Nihad Abbasov committed
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
Nihad Abbasov's avatar
Nihad Abbasov committed
9
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
10

11 12 13 14
    class User < UserBasic
      expose :created_at
      expose :is_admin?, as: :is_admin
      expose :bio, :skype, :linkedin, :twitter, :website_url
15 16
    end

17 18 19 20 21
    class UserFull < User
      expose :email
      expose :theme_id, :color_scheme_id, :extern_uid, :provider
      expose :can_create_group?, as: :can_create_group
      expose :can_create_project?, as: :can_create_project
22 23
    end

24
    class UserLogin < UserFull
25
      expose :private_token
26 27
    end

miks's avatar
miks committed
28
    class Hook < Grape::Entity
29
      expose :id, :url, :created_at
miks's avatar
miks committed
30 31
    end

32
    class ProjectHook < Hook
33 34
      expose :project_id, :push_events
      expose :issues_events, :merge_requests_events, :tag_push_events
35 36
    end

37 38 39 40 41 42
    class ForkedFromProject < Grape::Entity
      expose :id
      expose :name, :name_with_namespace
      expose :path, :path_with_namespace
    end

Nihad Abbasov's avatar
Nihad Abbasov committed
43
    class Project < Grape::Entity
44 45
      expose :id, :description, :default_branch
      expose :public?, as: :public
46
      expose :archived?, as: :archived
47
      expose :visibility_level, :ssh_url_to_repo, :http_url_to_repo, :web_url
48
      expose :owner, using: Entities::UserBasic, unless: ->(project, options) { project.group }
49
      expose :name, :name_with_namespace
50
      expose :path, :path_with_namespace
51
      expose :issues_enabled, :merge_requests_enabled, :wiki_enabled, :snippets_enabled, :created_at, :last_activity_at
52
      expose :namespace
53
      expose :forked_from_project, using: Entities::ForkedFromProject, :if => lambda{ | project, options | project.forked? }
Nihad Abbasov's avatar
Nihad Abbasov committed
54 55
    end

56
    class ProjectMember < UserBasic
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
57 58
      expose :access_level do |user, options|
        options[:project].project_members.find_by(user_id: user.id).access_level
59
      end
miks's avatar
miks committed
60 61
    end

62
    class Group < Grape::Entity
63
      expose :id, :name, :path, :owner_id
64
    end
Andrew8xx8's avatar
Andrew8xx8 committed
65

66
    class GroupDetail < Group
67 68 69
      expose :projects, using: Entities::Project
    end

Izaak Alpert's avatar
Izaak Alpert committed
70
    class GroupMember < UserBasic
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
71
      expose :access_level do |user, options|
72
        options[:group].group_members.find_by(user_id: user.id).access_level
Izaak Alpert's avatar
Izaak Alpert committed
73 74 75
      end
    end

76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
    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
    end

Nihad Abbasov's avatar
Nihad Abbasov committed
95
    class RepoObject < Grape::Entity
96 97 98 99 100 101 102 103 104 105
      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

106 107 108 109 110
      expose :protected do |repo, options|
        if options[:project]
          options[:project].protected_branch? repo.name
        end
      end
Nihad Abbasov's avatar
Nihad Abbasov committed
111
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
112

113 114 115 116 117 118 119 120 121 122
    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

123 124
    class RepoCommit < Grape::Entity
      expose :id, :short_id, :title, :author_name, :author_email, :created_at
125
      expose :safe_message, as: :message
126 127
    end

128 129 130 131
    class RepoCommitDetail < RepoCommit
      expose :parent_ids, :committed_date, :authored_date
    end

Nihad Abbasov's avatar
Nihad Abbasov committed
132 133
    class ProjectSnippet < Grape::Entity
      expose :id, :title, :file_name
134
      expose :author, using: Entities::UserBasic
Nihad Abbasov's avatar
Nihad Abbasov committed
135 136
      expose :expires_at, :updated_at, :created_at
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
137

138 139 140
    class ProjectEntity < Grape::Entity
      expose :id, :iid
      expose (:project_id) { |entity| entity.project.id }
141 142
      expose :title, :description
      expose :state, :created_at, :updated_at
143 144 145
    end

    class Milestone < ProjectEntity
146
      expose :due_date
Nihad Abbasov's avatar
Nihad Abbasov committed
147 148
    end

149
    class Issue < ProjectEntity
150
      expose :label_names, as: :labels
151 152
      expose :milestone, using: Entities::Milestone
      expose :assignee, :author, using: Entities::UserBasic
Nihad Abbasov's avatar
Nihad Abbasov committed
153
    end
Alex Denisov's avatar
Alex Denisov committed
154

155
    class MergeRequest < ProjectEntity
156
      expose :target_branch, :source_branch, :upvotes, :downvotes
157 158
      expose :author, :assignee, using: Entities::UserBasic
      expose :source_project_id, :target_project_id
159
      expose :label_names, as: :labels
160 161
      expose :description
      expose :milestone, using: Entities::Milestone
Alex Denisov's avatar
Alex Denisov committed
162
    end
163

164 165
    class SSHKey < Grape::Entity
      expose :id, :title, :key, :created_at
166
    end
167 168

    class Note < Grape::Entity
169 170
      expose :id
      expose :note, as: :body
171
      expose :attachment_identifier, as: :attachment
172
      expose :author, using: Entities::UserBasic
173
      expose :created_at
174
    end
175 176 177 178 179

    class MRNote < Grape::Entity
      expose :note
      expose :author, using: Entities::UserBasic
    end
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
180 181 182 183 184

    class Event < Grape::Entity
      expose :title, :project_id, :action_name
      expose :target_id, :target_type, :author_id
      expose :data, :target_title
185
      expose :created_at
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
186
    end
187 188 189 190

    class Namespace < Grape::Entity
      expose :id, :path, :kind
    end
191 192

    class ProjectAccess < Grape::Entity
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
193
      expose :access_level
194 195 196 197
      expose :notification_level
    end

    class GroupAccess < Grape::Entity
Dmitriy Zaporozhets's avatar
Dmitriy Zaporozhets committed
198
      expose :access_level
199 200 201 202 203 204
      expose :notification_level
    end

    class ProjectWithAccess < Project
      expose :permissions do
        expose :project_access, using: Entities::ProjectAccess do |project, options|
205
          project.project_members.find_by(user_id: options[:user].id)
206 207 208
        end

        expose :group_access, using: Entities::GroupAccess do |project, options|
209
          if project.group
210
            project.group.group_members.find_by(user_id: options[:user].id)
211
          end
212 213 214
        end
      end
    end
215 216

    class Label < Grape::Entity
217
      expose :name, :color
218
    end
219 220 221 222 223 224 225 226

    class RepoDiff < Grape::Entity
      expose :old_path, :new_path, :a_mode, :b_mode, :diff
      expose :new_file, :renamed_file, :deleted_file
    end

    class Compare < Grape::Entity
      expose :commit, using: Entities::RepoCommit do |compare, options|
227
        Commit.decorate(compare.commits).last
228
      end
229

230
      expose :commits, using: Entities::RepoCommit do |compare, options|
231
        Commit.decorate(compare.commits)
232
      end
233

234 235 236
      expose :diffs, using: Entities::RepoDiff do |compare, options|
        compare.diffs
      end
237 238 239 240 241 242

      expose :compare_timeout do |compare, options|
        compare.timeout
      end

      expose :same, as: :compare_same_ref
243
    end
244 245 246 247

    class Contributor < Grape::Entity
      expose :name, :email, :commits, :additions, :deletions
    end
Nihad Abbasov's avatar
Nihad Abbasov committed
248 249
  end
end