Standardize use of `content` parameter in snippets API
There was some confusion over whether `code` or `content` is the right parameter for snippets. Internally, the database stores `content`. However: 1. Project snippets use `code`. `code` gets remapped in `content` in `lib/api/project_snippets.rb`. 2. Personal snippets use `content`. To unify these APIs, allow an alias of `content` to work for project snippets. Closes https://gitlab.com/gitlab-org/gitlab-ce/issues/66673
This commit is contained in:
		
							parent
							
								
									549e95b8f9
								
							
						
					
					
						commit
						fc52421b55
					
				|  | @ -0,0 +1,5 @@ | |||
| --- | ||||
| title: Standardize use of `content` parameter in snippets API | ||||
| merge_request: 32296 | ||||
| author: | ||||
| type: changed | ||||
|  | @ -51,16 +51,18 @@ module API | |||
|       params do | ||||
|         requires :title, type: String, desc: 'The title of the snippet' | ||||
|         requires :file_name, type: String, desc: 'The file name of the snippet' | ||||
|         requires :code, type: String, allow_blank: false, desc: 'The content of the snippet' | ||||
|         optional :code, type: String, allow_blank: false, desc: 'The content of the snippet (deprecated in favor of "content")' | ||||
|         optional :content, type: String, allow_blank: false, desc: 'The content of the snippet' | ||||
|         optional :description, type: String, desc: 'The description of a snippet' | ||||
|         requires :visibility, type: String, | ||||
|                               values: Gitlab::VisibilityLevel.string_values, | ||||
|                               desc: 'The visibility of the snippet' | ||||
|         mutually_exclusive :code, :content | ||||
|       end | ||||
|       post ":id/snippets" do | ||||
|         authorize! :create_project_snippet, user_project | ||||
|         snippet_params = declared_params.merge(request: request, api: true) | ||||
|         snippet_params[:content] = snippet_params.delete(:code) | ||||
|         snippet_params = declared_params(include_missing: false).merge(request: request, api: true) | ||||
|         snippet_params[:content] = snippet_params.delete(:code) if snippet_params[:code].present? | ||||
| 
 | ||||
|         snippet = CreateSnippetService.new(user_project, current_user, snippet_params).execute | ||||
| 
 | ||||
|  | @ -80,12 +82,14 @@ module API | |||
|         requires :snippet_id, type: Integer, desc: 'The ID of a project snippet' | ||||
|         optional :title, type: String, desc: 'The title of the snippet' | ||||
|         optional :file_name, type: String, desc: 'The file name of the snippet' | ||||
|         optional :code, type: String, allow_blank: false, desc: 'The content of the snippet' | ||||
|         optional :code, type: String, allow_blank: false, desc: 'The content of the snippet (deprecated in favor of "content")' | ||||
|         optional :content, type: String, allow_blank: false, desc: 'The content of the snippet' | ||||
|         optional :description, type: String, desc: 'The description of a snippet' | ||||
|         optional :visibility, type: String, | ||||
|                               values: Gitlab::VisibilityLevel.string_values, | ||||
|                               desc: 'The visibility of the snippet' | ||||
|         at_least_one_of :title, :file_name, :code, :visibility_level | ||||
|         at_least_one_of :title, :file_name, :code, :content, :visibility_level | ||||
|         mutually_exclusive :code, :content | ||||
|       end | ||||
|       # rubocop: disable CodeReuse/ActiveRecord | ||||
|       put ":id/snippets/:snippet_id" do | ||||
|  |  | |||
|  | @ -108,6 +108,29 @@ describe API::ProjectSnippets do | |||
|       expect(snippet.visibility_level).to eq(Snippet::PUBLIC) | ||||
|     end | ||||
| 
 | ||||
|     it 'creates a new snippet with content parameter' do | ||||
|       params[:content] = params.delete(:code) | ||||
| 
 | ||||
|       post api("/projects/#{project.id}/snippets/", admin), params: params | ||||
| 
 | ||||
|       expect(response).to have_gitlab_http_status(201) | ||||
|       snippet = ProjectSnippet.find(json_response['id']) | ||||
|       expect(snippet.content).to eq(params[:content]) | ||||
|       expect(snippet.description).to eq(params[:description]) | ||||
|       expect(snippet.title).to eq(params[:title]) | ||||
|       expect(snippet.file_name).to eq(params[:file_name]) | ||||
|       expect(snippet.visibility_level).to eq(Snippet::PUBLIC) | ||||
|     end | ||||
| 
 | ||||
|     it 'returns 400 when both code and content parameters specified' do | ||||
|       params[:content] = params[:code] | ||||
| 
 | ||||
|       post api("/projects/#{project.id}/snippets/", admin), params: params | ||||
| 
 | ||||
|       expect(response).to have_gitlab_http_status(400) | ||||
|       expect(json_response['error']).to eq('code, content are mutually exclusive') | ||||
|     end | ||||
| 
 | ||||
|     it 'returns 400 for missing parameters' do | ||||
|       params.delete(:title) | ||||
| 
 | ||||
|  | @ -175,6 +198,25 @@ describe API::ProjectSnippets do | |||
|       expect(snippet.description).to eq(new_description) | ||||
|     end | ||||
| 
 | ||||
|     it 'updates snippet with content parameter' do | ||||
|       new_content = 'New content' | ||||
|       new_description = 'New description' | ||||
| 
 | ||||
|       put api("/projects/#{snippet.project.id}/snippets/#{snippet.id}/", admin), params: { content: new_content, description: new_description } | ||||
| 
 | ||||
|       expect(response).to have_gitlab_http_status(200) | ||||
|       snippet.reload | ||||
|       expect(snippet.content).to eq(new_content) | ||||
|       expect(snippet.description).to eq(new_description) | ||||
|     end | ||||
| 
 | ||||
|     it 'returns 400 when both code and content parameters specified' do | ||||
|       put api("/projects/#{snippet.project.id}/snippets/1234", admin), params: { code: 'some content', content: 'other content' } | ||||
| 
 | ||||
|       expect(response).to have_gitlab_http_status(400) | ||||
|       expect(json_response['error']).to eq('code, content are mutually exclusive') | ||||
|     end | ||||
| 
 | ||||
|     it 'returns 404 for invalid snippet id' do | ||||
|       put api("/projects/#{snippet.project.id}/snippets/1234", admin), params: { title: 'foo' } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue