From 612e61f4c4c374f4a47ea6d8a3b71fd40c41ac19 Mon Sep 17 00:00:00 2001
From: Robert Schilling <rschilling@student.tugraz.at>
Date: Mon, 20 Feb 2017 14:24:09 +0100
Subject: [PATCH] Use grape validation for dates

---
 lib/api/commits.rb                |  7 ++-----
 lib/api/helpers.rb                | 16 ----------------
 spec/requests/api/commits_spec.rb |  2 +-
 3 files changed, 3 insertions(+), 22 deletions(-)

diff --git a/lib/api/commits.rb b/lib/api/commits.rb
index 173083d0ade..f0ed5f34419 100644
--- a/lib/api/commits.rb
+++ b/lib/api/commits.rb
@@ -16,16 +16,13 @@ module API
       end
       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 :since,    type: String, 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 :since,    type: DateTime, desc: 'Only commits after 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 :per_page, type: Integer, default: 20, desc: 'The number of results per page'
         optional :path,     type: String, desc: 'The file path'
       end
       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'
         offset = params[:page] * params[:per_page]
 
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 13896dd91b9..7b6fae866eb 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -160,22 +160,6 @@ module API
       ActionController::Parameters.new(attrs).permit!
     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)
       items.where(iid: iid)
     end
diff --git a/spec/requests/api/commits_spec.rb b/spec/requests/api/commits_spec.rb
index 9fa007332f0..ecc6a597869 100644
--- a/spec/requests/api/commits_spec.rb
+++ b/spec/requests/api/commits_spec.rb
@@ -72,7 +72,7 @@ describe API::Commits, api: true  do
         get api("/projects/#{project.id}/repository/commits?since=invalid-date", user)
 
         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
 
-- 
GitLab