Commit 8df699a336af347628f83274b1eb11255f353e9e
1 parent
543506f3
Exists in
master
and in
4 other branches
API: project events
Showing
5 changed files
with
115 additions
and
1 deletions
Show diff stats
app/models/event.rb
@@ -75,7 +75,9 @@ class Event < ActiveRecord::Base | @@ -75,7 +75,9 @@ class Event < ActiveRecord::Base | ||
75 | end | 75 | end |
76 | 76 | ||
77 | def target_title | 77 | def target_title |
78 | - target.try :title | 78 | + if target && target.respond_to?(:title) |
79 | + target.title | ||
80 | + end | ||
79 | end | 81 | end |
80 | 82 | ||
81 | def push? | 83 | def push? |
doc/api/projects.md
@@ -77,6 +77,7 @@ Parameters: | @@ -77,6 +77,7 @@ Parameters: | ||
77 | { | 77 | { |
78 | "id": 5, | 78 | "id": 5, |
79 | "name": "gitlab", | 79 | "name": "gitlab", |
80 | + "name_with_namespace": "GitLab / gitlabhq", | ||
80 | "description": null, | 81 | "description": null, |
81 | "default_branch": "api", | 82 | "default_branch": "api", |
82 | "owner": { | 83 | "owner": { |
@@ -99,6 +100,74 @@ Parameters: | @@ -99,6 +100,74 @@ Parameters: | ||
99 | } | 100 | } |
100 | ``` | 101 | ``` |
101 | 102 | ||
103 | +### Get project events | ||
104 | + | ||
105 | +Get a project events for specific project. | ||
106 | +Sorted from newest to latest | ||
107 | + | ||
108 | +``` | ||
109 | +GET /projects/:id/events | ||
110 | +``` | ||
111 | + | ||
112 | +Parameters: | ||
113 | + | ||
114 | ++ `id` (required) - The ID or NAME of a project | ||
115 | + | ||
116 | +```json | ||
117 | + | ||
118 | +[{ | ||
119 | + "title": null, | ||
120 | + "project_id": 15, | ||
121 | + "action_name": "closed", | ||
122 | + "target_id": 830, | ||
123 | + "target_type": "Issue", | ||
124 | + "author_id": 1, | ||
125 | + "data": null, | ||
126 | + "target_title": "Public project search field" | ||
127 | +}, { | ||
128 | + "title": null, | ||
129 | + "project_id": 15, | ||
130 | + "action_name": "opened", | ||
131 | + "target_id": null, | ||
132 | + "target_type": null, | ||
133 | + "author_id": 1, | ||
134 | + "data": { | ||
135 | + "before": "50d4420237a9de7be1304607147aec22e4a14af7", | ||
136 | + "after": "c5feabde2d8cd023215af4d2ceeb7a64839fc428", | ||
137 | + "ref": "refs/heads/master", | ||
138 | + "user_id": 1, | ||
139 | + "user_name": "Dmitriy Zaporozhets", | ||
140 | + "repository": { | ||
141 | + "name": "gitlabhq", | ||
142 | + "url": "git@dev.gitlab.org:gitlab/gitlabhq.git", | ||
143 | + "description": "GitLab: self hosted Git management software. \r\nDistributed under the MIT License.", | ||
144 | + "homepage": "https://dev.gitlab.org/gitlab/gitlabhq" | ||
145 | + }, | ||
146 | + "commits": [{ | ||
147 | + "id": "c5feabde2d8cd023215af4d2ceeb7a64839fc428", | ||
148 | + "message": "Add simple search to projects in public area", | ||
149 | + "timestamp": "2013-05-13T18:18:08+00:00", | ||
150 | + "url": "https://dev.gitlab.org/gitlab/gitlabhq/commit/c5feabde2d8cd023215af4d2ceeb7a64839fc428", | ||
151 | + "author": { | ||
152 | + "name": "Dmitriy Zaporozhets", | ||
153 | + "email": "dmitriy.zaporozhets@gmail.com" | ||
154 | + } | ||
155 | + }], | ||
156 | + "total_commits_count": 1 | ||
157 | + }, | ||
158 | + "target_title": null | ||
159 | +}, { | ||
160 | + "title": null, | ||
161 | + "project_id": 15, | ||
162 | + "action_name": "closed", | ||
163 | + "target_id": 840, | ||
164 | + "target_type": "Issue", | ||
165 | + "author_id": 1, | ||
166 | + "data": null, | ||
167 | + "target_title": "Finish & merge Code search PR" | ||
168 | +}] | ||
169 | +``` | ||
170 | + | ||
102 | 171 | ||
103 | ### Create project | 172 | ### Create project |
104 | 173 |
lib/api/entities.rb
@@ -120,5 +120,11 @@ module API | @@ -120,5 +120,11 @@ module API | ||
120 | expose :note | 120 | expose :note |
121 | expose :author, using: Entities::UserBasic | 121 | expose :author, using: Entities::UserBasic |
122 | end | 122 | end |
123 | + | ||
124 | + class Event < Grape::Entity | ||
125 | + expose :title, :project_id, :action_name | ||
126 | + expose :target_id, :target_type, :author_id | ||
127 | + expose :data, :target_title | ||
128 | + end | ||
123 | end | 129 | end |
124 | end | 130 | end |
lib/api/projects.rb
@@ -41,6 +41,20 @@ module API | @@ -41,6 +41,20 @@ module API | ||
41 | present user_project, with: Entities::Project | 41 | present user_project, with: Entities::Project |
42 | end | 42 | end |
43 | 43 | ||
44 | + # Get a single project events | ||
45 | + # | ||
46 | + # Parameters: | ||
47 | + # id (required) - The ID of a project | ||
48 | + # Example Request: | ||
49 | + # GET /projects/:id | ||
50 | + get ":id/events" do | ||
51 | + limit = (params[:per_page] || 20).to_i | ||
52 | + offset = (params[:page] || 0).to_i * limit | ||
53 | + events = user_project.events.recent.limit(limit).offset(offset) | ||
54 | + | ||
55 | + present events, with: Entities::Event | ||
56 | + end | ||
57 | + | ||
44 | # Create new project | 58 | # Create new project |
45 | # | 59 | # |
46 | # Parameters: | 60 | # Parameters: |
spec/requests/api/projects_spec.rb
@@ -173,6 +173,29 @@ describe API::API do | @@ -173,6 +173,29 @@ describe API::API do | ||
173 | end | 173 | end |
174 | end | 174 | end |
175 | 175 | ||
176 | + describe "GET /projects/:id/events" do | ||
177 | + it "should return a project events" do | ||
178 | + get api("/projects/#{project.id}/events", user) | ||
179 | + response.status.should == 200 | ||
180 | + json_event = json_response.first | ||
181 | + | ||
182 | + json_event['action_name'].should == 'joined' | ||
183 | + json_event['project_id'].to_i.should == project.id | ||
184 | + end | ||
185 | + | ||
186 | + it "should return a 404 error if not found" do | ||
187 | + get api("/projects/42/events", user) | ||
188 | + response.status.should == 404 | ||
189 | + json_response['message'].should == '404 Not Found' | ||
190 | + end | ||
191 | + | ||
192 | + it "should return a 404 error if user is not a member" do | ||
193 | + other_user = create(:user) | ||
194 | + get api("/projects/#{project.id}/events", other_user) | ||
195 | + response.status.should == 404 | ||
196 | + end | ||
197 | + end | ||
198 | + | ||
176 | describe "GET /projects/:id/members" do | 199 | describe "GET /projects/:id/members" do |
177 | it "should return project team members" do | 200 | it "should return project team members" do |
178 | get api("/projects/#{project.id}/members", user) | 201 | get api("/projects/#{project.id}/members", user) |