Commit 4afb7b7cb7b42688bea70298c80b4735f59dab22

Authored by Dmitriy Zaporozhets
2 parents 13155362 bbdb2c3f

Merge pull request #1522 from NARKOZ/api

API clean up
app/views/help/api.html.haml
@@ -12,6 +12,8 @@ @@ -12,6 +12,8 @@
12 %li 12 %li
13 = link_to "Snippets", "#snippets", 'data-toggle' => 'tab' 13 = link_to "Snippets", "#snippets", 'data-toggle' => 'tab'
14 %li 14 %li
  15 + = link_to "Repositories", "#repositories", 'data-toggle' => 'tab'
  16 + %li
15 = link_to "Users", "#users", 'data-toggle' => 'tab' 17 = link_to "Users", "#users", 'data-toggle' => 'tab'
16 %li 18 %li
17 = link_to "Session", "#session", 'data-toggle' => 'tab' 19 = link_to "Session", "#session", 'data-toggle' => 'tab'
@@ -19,8 +21,6 @@ @@ -19,8 +21,6 @@
19 = link_to "Issues", "#issues", 'data-toggle' => 'tab' 21 = link_to "Issues", "#issues", 'data-toggle' => 'tab'
20 %li 22 %li
21 = link_to "Milestones", "#milestones", 'data-toggle' => 'tab' 23 = link_to "Milestones", "#milestones", 'data-toggle' => 'tab'
22 - %li  
23 - = link_to "Commits", "#commits", 'data-toggle' => 'tab'  
24 24
25 .tab-content 25 .tab-content
26 .tab-pane.active#README 26 .tab-pane.active#README
@@ -50,6 +50,15 @@ @@ -50,6 +50,15 @@
50 = preserve do 50 = preserve do
51 = markdown File.read(Rails.root.join("doc", "api", "snippets.md")) 51 = markdown File.read(Rails.root.join("doc", "api", "snippets.md"))
52 52
  53 + .tab-pane#repositories
  54 + .file_holder
  55 + .file_title
  56 + %i.icon-file
  57 + Projects
  58 + .file_content.wiki
  59 + = preserve do
  60 + = markdown File.read(Rails.root.join("doc", "api", "repositories.md"))
  61 +
53 .tab-pane#users 62 .tab-pane#users
54 .file_holder 63 .file_holder
55 .file_title 64 .file_title
@@ -85,12 +94,3 @@ @@ -85,12 +94,3 @@
85 .file_content.wiki 94 .file_content.wiki
86 = preserve do 95 = preserve do
87 = markdown File.read(Rails.root.join("doc", "api", "milestones.md")) 96 = markdown File.read(Rails.root.join("doc", "api", "milestones.md"))
88 -  
89 - .tab-pane#commits  
90 - .file_holder  
91 - .file_title  
92 - %i.icon-file  
93 - Commits  
94 - .file_content.wiki  
95 - = preserve do  
96 - = markdown File.read(Rails.root.join("doc", "api", "commits.md"))  
doc/api/README.md
@@ -33,6 +33,6 @@ When listing resources you can pass the following parameters: @@ -33,6 +33,6 @@ When listing resources you can pass the following parameters:
33 + [Session](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/session.md) 33 + [Session](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/session.md)
34 + [Projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md) 34 + [Projects](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/projects.md)
35 + [Snippets](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/snippets.md) 35 + [Snippets](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/snippets.md)
  36 ++ [Repositories](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/repositories.md)
36 + [Issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/issues.md) 37 + [Issues](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/issues.md)
37 + [Milestones](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/milestones.md) 38 + [Milestones](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/milestones.md)
38 -+ [SSH Keys](https://github.com/gitlabhq/gitlabhq/blob/master/doc/api/keys.md)  
doc/api/commits.md
@@ -1,38 +0,0 @@ @@ -1,38 +0,0 @@
1 -## List Commits  
2 -  
3 -Get a list of project commits.  
4 -  
5 -```  
6 -GET /projects/:id/commits  
7 -```  
8 -  
9 -Parameters:  
10 -  
11 -+ `id` (required) - The ID or code name of a project  
12 -+ `ref_name` (optional) - branch/tag name  
13 -+ `page` (optional)  
14 -+ `per_page` (optional)  
15 -  
16 -  
17 -```json  
18 -  
19 -[  
20 - {  
21 - "id": "ed899a2f4b50b4370feeea94676502b42383c746",  
22 - "short_id": "ed899a2f4b5",  
23 - "title": "Replace sanitize with escape once",  
24 - "author_name": "Dmitriy Zaporozhets",  
25 - "author_email": "dzaporozhets@sphereconsultinginc.com",  
26 - "created_at": "2012-09-20T11:50:22+03:00"  
27 - },  
28 - {  
29 - "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",  
30 - "short_id": "6104942438c",  
31 - "title": "Sanitize for network graph",  
32 - "author_name": "randx",  
33 - "author_email": "dmitriy.zaporozhets@gmail.com",  
34 - "created_at": "2012-09-20T09:06:12+03:00"  
35 - }  
36 -]  
37 -  
38 -```  
doc/api/keys.md
@@ -1,79 +0,0 @@ @@ -1,79 +0,0 @@
1 -## List keys  
2 -  
3 -Get a list of currently authenticated user's keys.  
4 -  
5 -```  
6 -GET /keys  
7 -```  
8 -  
9 -```json  
10 -[  
11 - {  
12 - "id": 1,  
13 - "title" : "Public key"  
14 - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4  
15 - 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4  
16 - soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",  
17 - },  
18 - {  
19 - "id": 3,  
20 - "title" : "Another Public key"  
21 - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4  
22 - 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4  
23 - soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="  
24 - }  
25 -]  
26 -```  
27 -  
28 -## Single key  
29 -  
30 -Get a single key.  
31 -  
32 -```  
33 -GET /keys/:id  
34 -```  
35 -  
36 -Parameters:  
37 -  
38 -+ `id` (required) - The ID of a key  
39 -  
40 -```json  
41 -{  
42 - "id": 1,  
43 - "title" : "Public key"  
44 - "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4  
45 - 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4  
46 - soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="  
47 -}  
48 -```  
49 -## Add key  
50 -  
51 -Create new key owned by currently authenticated user  
52 -  
53 -```  
54 -POST /keys  
55 -```  
56 -  
57 -Parameters:  
58 -  
59 -+ `title` (required) - new SSH Key's title  
60 -+ `key` (required) - new SSH key  
61 -  
62 -Will return created key with status `201 Created` on success, or `404 Not  
63 -found` on fail.  
64 -  
65 -## Delete key  
66 -  
67 -Delete key owned by currently authenticated user  
68 -  
69 -```  
70 -DELETE /keys/:id  
71 -```  
72 -  
73 -Parameters:  
74 -  
75 -+ `id` (required) - key ID  
76 -  
77 -Will return `200 OK` on success, or `404 Not Found` on fail.  
78 -  
79 -  
doc/api/projects.md
@@ -239,135 +239,3 @@ Parameters: @@ -239,135 +239,3 @@ Parameters:
239 + `hook_id` (required) - The ID of hook to delete 239 + `hook_id` (required) - The ID of hook to delete
240 240
241 Will return status `200 OK` on success, or `404 Not found` on fail. 241 Will return status `200 OK` on success, or `404 Not found` on fail.
242 -  
243 -## Project repository branches  
244 -  
245 -Get a list of repository branches from a project, sorted by name alphabetically.  
246 -  
247 -```  
248 -GET /projects/:id/repository/branches  
249 -```  
250 -  
251 -Parameters:  
252 -  
253 -+ `id` (required) - The ID or code name of a project  
254 -  
255 -```json  
256 -[  
257 - {  
258 - "name": "master",  
259 - "commit": {  
260 - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",  
261 - "parents": [  
262 - {  
263 - "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"  
264 - }  
265 - ],  
266 - "tree": "46e82de44b1061621357f24c05515327f2795a95",  
267 - "message": "add projects API",  
268 - "author": {  
269 - "name": "John Smith",  
270 - "email": "john@example.com"  
271 - },  
272 - "committer": {  
273 - "name": "John Smith",  
274 - "email": "john@example.com"  
275 - },  
276 - "authored_date": "2012-06-27T05:51:39-07:00",  
277 - "committed_date": "2012-06-28T03:44:20-07:00"  
278 - }  
279 - }  
280 -]  
281 -```  
282 -  
283 -Get a single project repository branch.  
284 -  
285 -```  
286 -GET /projects/:id/repository/branches/:branch  
287 -```  
288 -  
289 -Parameters:  
290 -  
291 -+ `id` (required) - The ID or code name of a project  
292 -+ `branch` (required) - The name of the branch  
293 -  
294 -```json  
295 -{  
296 - "name": "master",  
297 - "commit": {  
298 - "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",  
299 - "parents": [  
300 - {  
301 - "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"  
302 - }  
303 - ],  
304 - "tree": "46e82de44b1061621357f24c05515327f2795a95",  
305 - "message": "add projects API",  
306 - "author": {  
307 - "name": "John Smith",  
308 - "email": "john@example.com"  
309 - },  
310 - "committer": {  
311 - "name": "John Smith",  
312 - "email": "john@example.com"  
313 - },  
314 - "authored_date": "2012-06-27T05:51:39-07:00",  
315 - "committed_date": "2012-06-28T03:44:20-07:00"  
316 - }  
317 -}  
318 -```  
319 -  
320 -## Project repository tags  
321 -  
322 -Get a list of repository tags from a project, sorted by name in reverse alphabetical order.  
323 -  
324 -```  
325 -GET /projects/:id/repository/tags  
326 -```  
327 -  
328 -Parameters:  
329 -  
330 -+ `id` (required) - The ID or code name of a project  
331 -  
332 -```json  
333 -[  
334 - {  
335 - "name": "v1.0.0",  
336 - "commit": {  
337 - "id": "2695effb5807a22ff3d138d593fd856244e155e7",  
338 - "parents": [  
339 -  
340 - ],  
341 - "tree": "38017f2f189336fe4497e9d230c5bb1bf873f08d",  
342 - "message": "Initial commit",  
343 - "author": {  
344 - "name": "John Smith",  
345 - "email": "john@example.com"  
346 - },  
347 - "committer": {  
348 - "name": "Jack Smith",  
349 - "email": "jack@example.com"  
350 - },  
351 - "authored_date": "2012-05-28T04:42:42-07:00",  
352 - "committed_date": "2012-05-28T04:42:42-07:00"  
353 - }  
354 - }  
355 -]  
356 -```  
357 -  
358 -## Raw blob content  
359 -  
360 -Get the raw file contents for a file.  
361 -  
362 -```  
363 -GET /projects/:id/repository/commits/:sha/blob  
364 -```  
365 -  
366 -Parameters:  
367 -  
368 -+ `id` (required) - The ID or code name of a project  
369 -+ `sha` (required) - The commit or branch name  
370 -+ `filepath` (required) - The path the file  
371 -  
372 -Will return the raw file contents.  
373 -  
doc/api/repositories.md 0 → 100644
@@ -0,0 +1,166 @@ @@ -0,0 +1,166 @@
  1 +## Project repository branches
  2 +
  3 +Get a list of repository branches from a project, sorted by name alphabetically.
  4 +
  5 +```
  6 +GET /projects/:id/repository/branches
  7 +```
  8 +
  9 +Parameters:
  10 +
  11 ++ `id` (required) - The ID or code name of a project
  12 +
  13 +```json
  14 +[
  15 + {
  16 + "name": "master",
  17 + "commit": {
  18 + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
  19 + "parents": [
  20 + {
  21 + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
  22 + }
  23 + ],
  24 + "tree": "46e82de44b1061621357f24c05515327f2795a95",
  25 + "message": "add projects API",
  26 + "author": {
  27 + "name": "John Smith",
  28 + "email": "john@example.com"
  29 + },
  30 + "committer": {
  31 + "name": "John Smith",
  32 + "email": "john@example.com"
  33 + },
  34 + "authored_date": "2012-06-27T05:51:39-07:00",
  35 + "committed_date": "2012-06-28T03:44:20-07:00"
  36 + }
  37 + }
  38 +]
  39 +```
  40 +
  41 +## Project repository branch
  42 +
  43 +Get a single project repository branch.
  44 +
  45 +```
  46 +GET /projects/:id/repository/branches/:branch
  47 +```
  48 +
  49 +Parameters:
  50 +
  51 ++ `id` (required) - The ID or code name of a project
  52 ++ `branch` (required) - The name of the branch
  53 +
  54 +```json
  55 +{
  56 + "name": "master",
  57 + "commit": {
  58 + "id": "7b5c3cc8be40ee161ae89a06bba6229da1032a0c",
  59 + "parents": [
  60 + {
  61 + "id": "4ad91d3c1144c406e50c7b33bae684bd6837faf8"
  62 + }
  63 + ],
  64 + "tree": "46e82de44b1061621357f24c05515327f2795a95",
  65 + "message": "add projects API",
  66 + "author": {
  67 + "name": "John Smith",
  68 + "email": "john@example.com"
  69 + },
  70 + "committer": {
  71 + "name": "John Smith",
  72 + "email": "john@example.com"
  73 + },
  74 + "authored_date": "2012-06-27T05:51:39-07:00",
  75 + "committed_date": "2012-06-28T03:44:20-07:00"
  76 + }
  77 +}
  78 +```
  79 +
  80 +## Project repository tags
  81 +
  82 +Get a list of repository tags from a project, sorted by name in reverse alphabetical order.
  83 +
  84 +```
  85 +GET /projects/:id/repository/tags
  86 +```
  87 +
  88 +Parameters:
  89 +
  90 ++ `id` (required) - The ID or code name of a project
  91 +
  92 +```json
  93 +[
  94 + {
  95 + "name": "v1.0.0",
  96 + "commit": {
  97 + "id": "2695effb5807a22ff3d138d593fd856244e155e7",
  98 + "parents": [
  99 +
  100 + ],
  101 + "tree": "38017f2f189336fe4497e9d230c5bb1bf873f08d",
  102 + "message": "Initial commit",
  103 + "author": {
  104 + "name": "John Smith",
  105 + "email": "john@example.com"
  106 + },
  107 + "committer": {
  108 + "name": "Jack Smith",
  109 + "email": "jack@example.com"
  110 + },
  111 + "authored_date": "2012-05-28T04:42:42-07:00",
  112 + "committed_date": "2012-05-28T04:42:42-07:00"
  113 + }
  114 + }
  115 +]
  116 +```
  117 +
  118 +## Project repository commits
  119 +
  120 +Get a list of repository commits in a project.
  121 +
  122 +```
  123 +GET /projects/:id/repository/commits
  124 +```
  125 +
  126 +Parameters:
  127 +
  128 ++ `id` (required) - The ID or code name of a project
  129 ++ `ref_name` (optional) - The name of a repository branch or tag
  130 +
  131 +```json
  132 +[
  133 + {
  134 + "id": "ed899a2f4b50b4370feeea94676502b42383c746",
  135 + "short_id": "ed899a2f4b5",
  136 + "title": "Replace sanitize with escape once",
  137 + "author_name": "Dmitriy Zaporozhets",
  138 + "author_email": "dzaporozhets@sphereconsultinginc.com",
  139 + "created_at": "2012-09-20T11:50:22+03:00"
  140 + },
  141 + {
  142 + "id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
  143 + "short_id": "6104942438c",
  144 + "title": "Sanitize for network graph",
  145 + "author_name": "randx",
  146 + "author_email": "dmitriy.zaporozhets@gmail.com",
  147 + "created_at": "2012-09-20T09:06:12+03:00"
  148 + }
  149 +]
  150 +```
  151 +
  152 +## Raw blob content
  153 +
  154 +Get the raw file contents for a file.
  155 +
  156 +```
  157 +GET /projects/:id/repository/commits/:sha/blob
  158 +```
  159 +
  160 +Parameters:
  161 +
  162 ++ `id` (required) - The ID or code name of a project
  163 ++ `sha` (required) - The commit or branch name
  164 ++ `filepath` (required) - The path the file
  165 +
  166 +Will return the raw file contents.
doc/api/users.md
@@ -88,3 +88,81 @@ GET /user @@ -88,3 +88,81 @@ GET /user
88 "theme_id": 1 88 "theme_id": 1
89 } 89 }
90 ``` 90 ```
  91 +
  92 +## List SSH keys
  93 +
  94 +Get a list of currently authenticated user's SSH keys.
  95 +
  96 +```
  97 +GET /user/keys
  98 +```
  99 +
  100 +```json
  101 +[
  102 + {
  103 + "id": 1,
  104 + "title" : "Public key"
  105 + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4
  106 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4
  107 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
  108 + },
  109 + {
  110 + "id": 3,
  111 + "title" : "Another Public key"
  112 + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4
  113 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4
  114 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="
  115 + }
  116 +]
  117 +```
  118 +
  119 +## Single SSH key
  120 +
  121 +Get a single key.
  122 +
  123 +```
  124 +GET /user/keys/:id
  125 +```
  126 +
  127 +Parameters:
  128 +
  129 ++ `id` (required) - The ID of an SSH key
  130 +
  131 +```json
  132 +{
  133 + "id": 1,
  134 + "title" : "Public key"
  135 + "key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4
  136 + 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4
  137 + soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0="
  138 +}
  139 +```
  140 +## Add SSH key
  141 +
  142 +Create new key owned by currently authenticated user
  143 +
  144 +```
  145 +POST /user/keys
  146 +```
  147 +
  148 +Parameters:
  149 +
  150 ++ `title` (required) - new SSH Key's title
  151 ++ `key` (required) - new SSH key
  152 +
  153 +Will return created key with status `201 Created` on success, or `404 Not
  154 +found` on fail.
  155 +
  156 +## Delete SSH key
  157 +
  158 +Delete key owned by currently authenticated user
  159 +
  160 +```
  161 +DELETE /user/keys/:id
  162 +```
  163 +
  164 +Parameters:
  165 +
  166 ++ `id` (required) - SSH key ID
  167 +
  168 +Will return `200 OK` on success, or `404 Not Found` on fail.
@@ -17,8 +17,6 @@ module Gitlab @@ -17,8 +17,6 @@ module Gitlab
17 mount Projects 17 mount Projects
18 mount Issues 18 mount Issues
19 mount Milestones 19 mount Milestones
20 - mount Keys  
21 mount Session 20 mount Session
22 - mount Commits  
23 end 21 end
24 end 22 end
lib/api/commits.rb
@@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
1 -module Gitlab  
2 - # Commits API  
3 - class Commits < Grape::API  
4 - before { authenticate! }  
5 -  
6 - resource :projects do  
7 - # Get a list of project commits  
8 - #  
9 - # Parameters:  
10 - # id (required) - The ID or code name of a project  
11 - # ref_name (optional) - Name of branch or tag  
12 - # page (optional) - default is 0  
13 - # per_page (optional) - default is 20  
14 - # Example Request:  
15 - # GET /projects/:id/commits  
16 - get ":id/commits" do  
17 - authorize! :download_code, user_project  
18 -  
19 - page = params[:page] || 0  
20 - per_page = params[:per_page] || 20  
21 - ref = params[:ref_name] || user_project.try(:default_branch) || 'master'  
22 -  
23 - commits = user_project.commits(ref, nil, per_page, page * per_page)  
24 -  
25 - present CommitDecorator.decorate(commits), with: Entities::Commit  
26 - end  
27 - end  
28 - end  
29 -end  
lib/api/entities.rb
@@ -17,11 +17,6 @@ module Gitlab @@ -17,11 +17,6 @@ module Gitlab
17 expose :id, :url 17 expose :id, :url
18 end 18 end
19 19
20 - class Commit < Grape::Entity  
21 - expose :id, :short_id, :title,  
22 - :author_name, :author_email, :created_at  
23 - end  
24 -  
25 class Project < Grape::Entity 20 class Project < Grape::Entity
26 expose :id, :code, :name, :description, :path, :default_branch 21 expose :id, :code, :name, :description, :path, :default_branch
27 expose :owner, using: Entities::UserBasic 22 expose :owner, using: Entities::UserBasic
@@ -39,6 +34,10 @@ module Gitlab @@ -39,6 +34,10 @@ module Gitlab
39 expose :name, :commit 34 expose :name, :commit
40 end 35 end
41 36
  37 + class RepoCommit < Grape::Entity
  38 + expose :id, :short_id, :title, :author_name, :author_email, :created_at
  39 + end
  40 +
42 class ProjectSnippet < Grape::Entity 41 class ProjectSnippet < Grape::Entity
43 expose :id, :title, :file_name 42 expose :id, :title, :file_name
44 expose :author, using: Entities::UserBasic 43 expose :author, using: Entities::UserBasic
@@ -61,8 +60,8 @@ module Gitlab @@ -61,8 +60,8 @@ module Gitlab
61 expose :closed, :updated_at, :created_at 60 expose :closed, :updated_at, :created_at
62 end 61 end
63 62
64 - class Key < Grape::Entity  
65 - expose :id, :title, :key 63 + class SSHKey < Grape::Entity
  64 + expose :id, :title, :key
66 end 65 end
67 end 66 end
68 end 67 end
lib/api/keys.rb
@@ -1,50 +0,0 @@ @@ -1,50 +0,0 @@
1 -module Gitlab  
2 - # Keys API  
3 - class Keys < Grape::API  
4 - before { authenticate! }  
5 - resource :keys do  
6 - # Get currently authenticated user's keys  
7 - #  
8 - # Example Request:  
9 - # GET /keys  
10 - get do  
11 - present current_user.keys, with: Entities::Key  
12 - end  
13 - # Get single key owned by currently authenticated user  
14 - #  
15 - # Example Request:  
16 - # GET /keys/:id  
17 - get "/:id" do  
18 - key = current_user.keys.find params[:id]  
19 - present key, with: Entities::Key  
20 - end  
21 - # Add new ssh key to currently authenticated user  
22 - #  
23 - # Parameters:  
24 - # key (required) - New SSH Key  
25 - # title (required) - New SSH Key's title  
26 - # Example Request:  
27 - # POST /keys  
28 - post do  
29 - attrs = attributes_for_keys [:title, :key]  
30 - key = current_user.keys.new attrs  
31 - if key.save  
32 - present key, with: Entities::Key  
33 - else  
34 - not_found!  
35 - end  
36 - end  
37 - # Delete existed ssh key of currently authenticated user  
38 - #  
39 - # Parameters:  
40 - # id (required) - SSH Key ID  
41 - # Example Request:  
42 - # DELETE /keys/:id  
43 - delete "/:id" do  
44 - key = current_user.keys.find params[:id]  
45 - key.delete  
46 - end  
47 - end  
48 - end  
49 -end  
50 -  
lib/api/projects.rb
@@ -211,6 +211,24 @@ module Gitlab @@ -211,6 +211,24 @@ module Gitlab
211 present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject 211 present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject
212 end 212 end
213 213
  214 + # Get a project repository commits
  215 + #
  216 + # Parameters:
  217 + # id (required) - The ID or code name of a project
  218 + # ref_name (optional) - The name of a repository branch or tag
  219 + # Example Request:
  220 + # GET /projects/:id/repository/commits
  221 + get ":id/repository/commits" do
  222 + authorize! :download_code, user_project
  223 +
  224 + page = params[:page] || 0
  225 + per_page = params[:per_page] || 20
  226 + ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
  227 +
  228 + commits = user_project.commits(ref, nil, per_page, page * per_page)
  229 + present CommitDecorator.decorate(commits), with: Entities::RepoCommit
  230 + end
  231 +
214 # Get a project snippet 232 # Get a project snippet
215 # 233 #
216 # Parameters: 234 # Parameters:
lib/api/users.rb
@@ -25,12 +25,59 @@ module Gitlab @@ -25,12 +25,59 @@ module Gitlab
25 end 25 end
26 end 26 end
27 27
28 - # Get currently authenticated user  
29 - #  
30 - # Example Request:  
31 - # GET /user  
32 - get "/user" do  
33 - present @current_user, with: Entities::User 28 + resource :user do
  29 + # Get currently authenticated user
  30 + #
  31 + # Example Request:
  32 + # GET /user
  33 + get do
  34 + present @current_user, with: Entities::User
  35 + end
  36 +
  37 + # Get currently authenticated user's keys
  38 + #
  39 + # Example Request:
  40 + # GET /user/keys
  41 + get "keys" do
  42 + present current_user.keys, with: Entities::SSHKey
  43 + end
  44 +
  45 + # Get single key owned by currently authenticated user
  46 + #
  47 + # Example Request:
  48 + # GET /user/keys/:id
  49 + get "keys/:id" do
  50 + key = current_user.keys.find params[:id]
  51 + present key, with: Entities::SSHKey
  52 + end
  53 +
  54 + # Add new ssh key to currently authenticated user
  55 + #
  56 + # Parameters:
  57 + # key (required) - New SSH Key
  58 + # title (required) - New SSH Key's title
  59 + # Example Request:
  60 + # POST /user/keys
  61 + post "keys" do
  62 + attrs = attributes_for_keys [:title, :key]
  63 + key = current_user.keys.new attrs
  64 + if key.save
  65 + present key, with: Entities::SSHKey
  66 + else
  67 + not_found!
  68 + end
  69 + end
  70 +
  71 + # Delete existed ssh key of currently authenticated user
  72 + #
  73 + # Parameters:
  74 + # id (required) - SSH Key ID
  75 + # Example Request:
  76 + # DELETE /user/keys/:id
  77 + delete "keys/:id" do
  78 + key = current_user.keys.find params[:id]
  79 + key.delete
  80 + end
34 end 81 end
35 end 82 end
36 end 83 end
spec/requests/api/commits_spec.rb
@@ -1,29 +0,0 @@ @@ -1,29 +0,0 @@
1 -require 'spec_helper'  
2 -  
3 -describe Gitlab::API do  
4 - include ApiHelpers  
5 -  
6 - let(:user) { Factory :user }  
7 - let!(:project) { Factory :project, owner: user }  
8 -  
9 - describe "GET /projects/:id/commits" do  
10 - context "authorized user" do  
11 - before { project.add_access(user, :read) }  
12 -  
13 - it "should return project commits" do  
14 - get api("/projects/#{project.code}/commits", user)  
15 - response.status.should == 200  
16 -  
17 - json_response.should be_an Array  
18 - json_response.first['id'].should == project.commit.id  
19 - end  
20 - end  
21 -  
22 - context "unauthorized user" do  
23 - it "should return project commits" do  
24 - get api("/projects/#{project.code}/commits")  
25 - response.status.should == 401  
26 - end  
27 - end  
28 - end  
29 -end  
spec/requests/api/projects_spec.rb
@@ -199,6 +199,27 @@ describe Gitlab::API do @@ -199,6 +199,27 @@ describe Gitlab::API do
199 end 199 end
200 end 200 end
201 201
  202 + describe "GET /projects/:id/repository/commits" do
  203 + context "authorized user" do
  204 + before { project.add_access(user2, :read) }
  205 +
  206 + it "should return project commits" do
  207 + get api("/projects/#{project.code}/repository/commits", user)
  208 + response.status.should == 200
  209 +
  210 + json_response.should be_an Array
  211 + json_response.first['id'].should == project.commit.id
  212 + end
  213 + end
  214 +
  215 + context "unauthorized user" do
  216 + it "should not return project commits" do
  217 + get api("/projects/#{project.code}/repository/commits")
  218 + response.status.should == 401
  219 + end
  220 + end
  221 + end
  222 +
202 describe "GET /projects/:id/snippets/:snippet_id" do 223 describe "GET /projects/:id/snippets/:snippet_id" do
203 it "should return a project snippet" do 224 it "should return a project snippet" do
204 get api("/projects/#{project.code}/snippets/#{snippet.id}", user) 225 get api("/projects/#{project.code}/snippets/#{snippet.id}", user)
spec/requests/api/ssh_keys_spec.rb
@@ -1,73 +0,0 @@ @@ -1,73 +0,0 @@
1 -require 'spec_helper'  
2 -  
3 -describe Gitlab::Keys do  
4 - include ApiHelpers  
5 - let(:user) {  
6 - user = Factory.create :user  
7 - user.reset_authentication_token!  
8 - user  
9 - }  
10 - let(:key) { Factory.create :key, { user: user}}  
11 -  
12 - describe "GET /keys" do  
13 - context "when unauthenticated" do  
14 - it "should return authentication error" do  
15 - get api("/keys")  
16 - response.status.should == 401  
17 - end  
18 - end  
19 - context "when authenticated" do  
20 - it "should return array of ssh keys" do  
21 - user.keys << key  
22 - user.save  
23 - get api("/keys", user)  
24 - response.status.should == 200  
25 - json_response.should be_an Array  
26 - json_response.first["title"].should == key.title  
27 - end  
28 - end  
29 - end  
30 -  
31 - describe "GET /keys/:id" do  
32 - it "should returm single key" do  
33 - user.keys << key  
34 - user.save  
35 - get api("/keys/#{key.id}", user)  
36 - response.status.should == 200  
37 - json_response["title"].should == key.title  
38 - end  
39 - it "should return 404 Not Found within invalid ID" do  
40 - get api("/keys/42", user)  
41 - response.status.should == 404  
42 - end  
43 - end  
44 -  
45 - describe "POST /keys" do  
46 - it "should not create invalid ssh key" do  
47 - post api("/keys", user), { title: "invalid key" }  
48 - response.status.should == 404  
49 - end  
50 - it "should create ssh key" do  
51 - key_attrs = Factory.attributes :key  
52 - expect {  
53 - post api("/keys", user), key_attrs  
54 - }.to change{ user.keys.count }.by(1)  
55 - end  
56 - end  
57 -  
58 - describe "DELETE /keys/:id" do  
59 - it "should delete existed key" do  
60 - user.keys << key  
61 - user.save  
62 - expect {  
63 - delete api("/keys/#{key.id}", user)  
64 - }.to change{user.keys.count}.by(-1)  
65 - end  
66 - it "should return 404 Not Found within invalid ID" do  
67 - delete api("/keys/42", user)  
68 - response.status.should == 404  
69 - end  
70 - end  
71 -  
72 -end  
73 -  
spec/requests/api/users_spec.rb
@@ -3,7 +3,8 @@ require &#39;spec_helper&#39; @@ -3,7 +3,8 @@ require &#39;spec_helper&#39;
3 describe Gitlab::API do 3 describe Gitlab::API do
4 include ApiHelpers 4 include ApiHelpers
5 5
6 - let(:user) { Factory :user } 6 + let(:user) { Factory :user }
  7 + let(:key) { Factory :key, user: user }
7 8
8 describe "GET /users" do 9 describe "GET /users" do
9 context "when unauthenticated" do 10 context "when unauthenticated" do
@@ -38,4 +39,68 @@ describe Gitlab::API do @@ -38,4 +39,68 @@ describe Gitlab::API do
38 json_response['email'].should == user.email 39 json_response['email'].should == user.email
39 end 40 end
40 end 41 end
  42 +
  43 + describe "GET /user/keys" do
  44 + context "when unauthenticated" do
  45 + it "should return authentication error" do
  46 + get api("/user/keys")
  47 + response.status.should == 401
  48 + end
  49 + end
  50 +
  51 + context "when authenticated" do
  52 + it "should return array of ssh keys" do
  53 + user.keys << key
  54 + user.save
  55 + get api("/user/keys", user)
  56 + response.status.should == 200
  57 + json_response.should be_an Array
  58 + json_response.first["title"].should == key.title
  59 + end
  60 + end
  61 + end
  62 +
  63 + describe "GET /user/keys/:id" do
  64 + it "should returm single key" do
  65 + user.keys << key
  66 + user.save
  67 + get api("/user/keys/#{key.id}", user)
  68 + response.status.should == 200
  69 + json_response["title"].should == key.title
  70 + end
  71 +
  72 + it "should return 404 Not Found within invalid ID" do
  73 + get api("/user/keys/42", user)
  74 + response.status.should == 404
  75 + end
  76 + end
  77 +
  78 + describe "POST /user/keys" do
  79 + it "should not create invalid ssh key" do
  80 + post api("/user/keys", user), { title: "invalid key" }
  81 + response.status.should == 404
  82 + end
  83 +
  84 + it "should create ssh key" do
  85 + key_attrs = Factory.attributes :key
  86 + expect {
  87 + post api("/user/keys", user), key_attrs
  88 + }.to change{ user.keys.count }.by(1)
  89 + end
  90 + end
  91 +
  92 + describe "DELETE /user/keys/:id" do
  93 + it "should delete existed key" do
  94 + user.keys << key
  95 + user.save
  96 + expect {
  97 + delete api("/user/keys/#{key.id}", user)
  98 + }.to change{user.keys.count}.by(-1)
  99 + end
  100 +
  101 + it "should return 404 Not Found within invalid ID" do
  102 + delete api("/user/keys/42", user)
  103 + response.status.should == 404
  104 + end
  105 + end
41 end 106 end