Commit 61ffcab60fef2efcd54b8496aa09de79ee999a2c
Committed by
Angus MacArthur
1 parent
d5663e14
Exists in
master
and in
4 other branches
Additional Admin APIs
Showing
6 changed files
with
150 additions
and
0 deletions
Show diff stats
lib/api/groups.rb
... | ... | @@ -51,6 +51,24 @@ module Gitlab |
51 | 51 | not_found! |
52 | 52 | end |
53 | 53 | end |
54 | + | |
55 | + # Transfer a project to the Group namespace | |
56 | + # | |
57 | + # Parameters: | |
58 | + # id - group id | |
59 | + # project_id - project id | |
60 | + # Example Request: | |
61 | + # POST /groups/:id/projects/:project_id | |
62 | + post ":id/projects/:project_id" do | |
63 | + authenticated_as_admin! | |
64 | + @group = Group.find(params[:id]) | |
65 | + project = Project.find(params[:project_id]) | |
66 | + if project.transfer(@group) | |
67 | + present @group | |
68 | + else | |
69 | + not_found! | |
70 | + end | |
71 | + end | |
54 | 72 | end |
55 | 73 | end |
56 | 74 | end | ... | ... |
lib/api/projects.rb
... | ... | @@ -52,6 +52,38 @@ module Gitlab |
52 | 52 | end |
53 | 53 | end |
54 | 54 | |
55 | + # Create new project for a specified user. Only available to admin users. | |
56 | + # | |
57 | + # Parameters: | |
58 | + # user_id (required) - The ID of a user | |
59 | + # name (required) - name for new project | |
60 | + # description (optional) - short project description | |
61 | + # default_branch (optional) - 'master' by default | |
62 | + # issues_enabled (optional) - enabled by default | |
63 | + # wall_enabled (optional) - enabled by default | |
64 | + # merge_requests_enabled (optional) - enabled by default | |
65 | + # wiki_enabled (optional) - enabled by default | |
66 | + # Example Request | |
67 | + # POST /projects/user/:user_id | |
68 | + post "user/:user_id" do | |
69 | + authenticated_as_admin! | |
70 | + user = User.find(params[:user_id]) | |
71 | + attrs = attributes_for_keys [:name, | |
72 | + :description, | |
73 | + :default_branch, | |
74 | + :issues_enabled, | |
75 | + :wall_enabled, | |
76 | + :merge_requests_enabled, | |
77 | + :wiki_enabled] | |
78 | + @project = ::Projects::CreateContext.new(user, attrs).execute | |
79 | + if @project.saved? | |
80 | + present @project, with: Entities::Project | |
81 | + else | |
82 | + not_found! | |
83 | + end | |
84 | + end | |
85 | + | |
86 | + | |
55 | 87 | # Get a project team members |
56 | 88 | # |
57 | 89 | # Parameters: | ... | ... |
lib/api/users.rb
... | ... | @@ -77,6 +77,26 @@ module Gitlab |
77 | 77 | end |
78 | 78 | end |
79 | 79 | |
80 | + # Add ssh key to a specified user. Only available to admin users. | |
81 | + # | |
82 | + # Parameters: | |
83 | + # id (required) - The ID of a user | |
84 | + # key (required) - New SSH Key | |
85 | + # title (required) - New SSH Key's title | |
86 | + # Example Request: | |
87 | + # POST /users/:id/keys | |
88 | + post ":id/keys" do | |
89 | + authenticated_as_admin! | |
90 | + user = User.find(params[:id]) | |
91 | + attrs = attributes_for_keys [:title, :key] | |
92 | + key = user.keys.new attrs | |
93 | + if key.save | |
94 | + present key, with: Entities::SSHKey | |
95 | + else | |
96 | + not_found! | |
97 | + end | |
98 | + end | |
99 | + | |
80 | 100 | # Delete user. Available only for admin |
81 | 101 | # |
82 | 102 | # Example Request: | ... | ... |
spec/requests/api/groups_spec.rb
... | ... | @@ -90,4 +90,27 @@ describe Gitlab::API do |
90 | 90 | end |
91 | 91 | end |
92 | 92 | end |
93 | + | |
94 | + describe "POST /groups/:id/projects/:project_id" do | |
95 | + let(:project) { create(:project) } | |
96 | + before(:each) do | |
97 | + project.stub!(:transfer).and_return(true) | |
98 | + Project.stub(:find).and_return(project) | |
99 | + end | |
100 | + | |
101 | + | |
102 | + context "when authenticated as user" do | |
103 | + it "should not transfer project to group" do | |
104 | + post api("/groups/#{group1.id}/projects/#{project.id}", user2) | |
105 | + response.status.should == 403 | |
106 | + end | |
107 | + end | |
108 | + | |
109 | + context "when authenticated as admin" do | |
110 | + it "should transfer project to group" do | |
111 | + project.should_receive(:transfer) | |
112 | + post api("/groups/#{group1.id}/projects/#{project.id}", admin) | |
113 | + end | |
114 | + end | |
115 | + end | |
93 | 116 | end | ... | ... |
spec/requests/api/projects_spec.rb
... | ... | @@ -6,6 +6,7 @@ describe Gitlab::API do |
6 | 6 | let(:user) { create(:user) } |
7 | 7 | let(:user2) { create(:user) } |
8 | 8 | let(:user3) { create(:user) } |
9 | + let(:admin) { create(:admin) } | |
9 | 10 | let!(:hook) { create(:project_hook, project: project, url: "http://example.com") } |
10 | 11 | let!(:project) { create(:project, namespace: user.namespace ) } |
11 | 12 | let!(:snippet) { create(:snippet, author: user, project: project, title: 'example') } |
... | ... | @@ -90,6 +91,46 @@ describe Gitlab::API do |
90 | 91 | end |
91 | 92 | end |
92 | 93 | |
94 | + describe "POST /projects/user/:id" do | |
95 | + before { admin } | |
96 | + | |
97 | + it "should create new project without path" do | |
98 | + expect { post api("/projects/user/#{user.id}", admin), name: 'foo' }.to change {Project.count}.by(1) | |
99 | + end | |
100 | + | |
101 | + it "should not create new project without name" do | |
102 | + expect { post api("/projects/user/#{user.id}", admin) }.to_not change {Project.count} | |
103 | + end | |
104 | + | |
105 | + it "should respond with 201 on success" do | |
106 | + post api("/projects/user/#{user.id}", admin), name: 'foo' | |
107 | + response.status.should == 201 | |
108 | + end | |
109 | + | |
110 | + it "should respond with 404 on failure" do | |
111 | + post api("/projects/user/#{user.id}", admin) | |
112 | + response.status.should == 404 | |
113 | + end | |
114 | + | |
115 | + it "should assign attributes to project" do | |
116 | + project = attributes_for(:project, { | |
117 | + description: Faker::Lorem.sentence, | |
118 | + default_branch: 'stable', | |
119 | + issues_enabled: false, | |
120 | + wall_enabled: false, | |
121 | + merge_requests_enabled: false, | |
122 | + wiki_enabled: false | |
123 | + }) | |
124 | + | |
125 | + post api("/projects/user/#{user.id}", admin), project | |
126 | + | |
127 | + project.each_pair do |k,v| | |
128 | + next if k == :path | |
129 | + json_response[k.to_s].should == v | |
130 | + end | |
131 | + end | |
132 | + end | |
133 | + | |
93 | 134 | describe "GET /projects/:id" do |
94 | 135 | it "should return a project by id" do |
95 | 136 | get api("/projects/#{project.id}", user) | ... | ... |
spec/requests/api/users_spec.rb
... | ... | @@ -105,6 +105,22 @@ describe Gitlab::API do |
105 | 105 | end |
106 | 106 | end |
107 | 107 | |
108 | + describe "POST /users/:id/keys" do | |
109 | + before { admin } | |
110 | + | |
111 | + it "should not create invalid ssh key" do | |
112 | + post api("/users/#{user.id}/keys", admin), { title: "invalid key" } | |
113 | + response.status.should == 404 | |
114 | + end | |
115 | + | |
116 | + it "should create ssh key" do | |
117 | + key_attrs = attributes_for :key | |
118 | + expect { | |
119 | + post api("/users/#{user.id}/keys", admin), key_attrs | |
120 | + }.to change{ user.keys.count }.by(1) | |
121 | + end | |
122 | + end | |
123 | + | |
108 | 124 | describe "DELETE /users/:id" do |
109 | 125 | before { admin } |
110 | 126 | ... | ... |