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) |