Commit 173dbeb9 authored by Rémy Coutable's avatar Rémy Coutable

Merge branch 'api-grape-datetime' into 'master'

Use grape validation for dates

See merge request !9375
parents bc0b438d 612e61f4
...@@ -16,16 +16,13 @@ module API ...@@ -16,16 +16,13 @@ module API
end end
params do params do
optional :ref_name, type: String, desc: 'The name of a repository branch or tag, if not given the default branch is used' optional :ref_name, type: String, desc: 'The name of a repository branch or tag, if not given the default branch is used'
optional :since, type: String, desc: 'Only commits after or in this date will be returned' optional :since, type: DateTime, desc: 'Only commits after or in this date will be returned'
optional :until, type: String, desc: 'Only commits before or in this date will be returned' optional :until, type: DateTime, desc: 'Only commits before or in this date will be returned'
optional :page, type: Integer, default: 0, desc: 'The page for pagination' optional :page, type: Integer, default: 0, desc: 'The page for pagination'
optional :per_page, type: Integer, default: 20, desc: 'The number of results per page' optional :per_page, type: Integer, default: 20, desc: 'The number of results per page'
optional :path, type: String, desc: 'The file path' optional :path, type: String, desc: 'The file path'
end end
get ":id/repository/commits" do get ":id/repository/commits" do
# TODO remove the next line for 9.0, use DateTime type in the params block
datetime_attributes! :since, :until
ref = params[:ref_name] || user_project.try(:default_branch) || 'master' ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
offset = params[:page] * params[:per_page] offset = params[:page] * params[:per_page]
......
...@@ -160,22 +160,6 @@ module API ...@@ -160,22 +160,6 @@ module API
ActionController::Parameters.new(attrs).permit! ActionController::Parameters.new(attrs).permit!
end end
# Checks the occurrences of datetime attributes, each attribute if present in the params hash must be in ISO 8601
# format (YYYY-MM-DDTHH:MM:SSZ) or a Bad Request error is invoked.
#
# Parameters:
# keys (required) - An array consisting of elements that must be parseable as dates from the params hash
def datetime_attributes!(*keys)
keys.each do |key|
begin
params[key] = Time.xmlschema(params[key]) if params[key].present?
rescue ArgumentError
message = "\"" + key.to_s + "\" must be a timestamp in ISO 8601 format: YYYY-MM-DDTHH:MM:SSZ"
render_api_error!(message, 400)
end
end
end
def filter_by_iid(items, iid) def filter_by_iid(items, iid)
items.where(iid: iid) items.where(iid: iid)
end end
......
...@@ -72,7 +72,7 @@ describe API::Commits, api: true do ...@@ -72,7 +72,7 @@ describe API::Commits, api: true do
get api("/projects/#{project.id}/repository/commits?since=invalid-date", user) get api("/projects/#{project.id}/repository/commits?since=invalid-date", user)
expect(response).to have_http_status(400) expect(response).to have_http_status(400)
expect(json_response['message']).to include "\"since\" must be a timestamp in ISO 8601 format" expect(json_response['error']).to eq('since is invalid')
end end
end end
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment