module API
  class Commits < Grape::API
    resource :commits do
      # Get list of commits per project
      #
      # Parameters:
      #   project_id (required) - The ID of a project
      #   project_token (requires) - Project token
      #   page (optional)
      #   per_page (optional) - items per request (default is 20)
      #
      get do
        required_attributes! [:project_id, :project_token]
        project = Project.find(params[:project_id])
        authenticate_project_token!(project)

        commits = project.commits.page(params[:page]).per(params[:per_page] || 20)
        present commits, with: Entities::CommitWithBuilds
      end

      # Create a commit
      #
      # Parameters:
      #   project_id (required) - The ID of a project
      #   project_token (requires) - Project token
      #   data (required) - GitLab push data
      #
      #   Sample GitLab push data:
      #   {
      #     "before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
      #     "after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
      #     "ref": "refs/heads/master",
      #     "commits": [
      #       {
      #         "id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
      #         "message": "Update Catalan translation to e38cb41.",
      #         "timestamp": "2011-12-12T14:27:31+02:00",
      #         "url": "http://localhost/diaspora/commits/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
      #         "author": {
      #           "name": "Jordi Mallach",
      #           "email": "jordi@softcatala.org",
      #         }
      #       }, .... more commits
      #     ]
      #   }
      #
      # Example Request:
      #   POST /commits
      post do
        required_attributes! [:project_id, :data, :project_token]
        project = Project.find(params[:project_id])
        authenticate_project_token!(project)
        commit = CreateCommitService.new.execute(project, params[:data])

        if commit.persisted?
          present commit, with: Entities::CommitWithBuilds
        else
          errors = commit.errors.full_messages.join(", ")
          render_api_error!(errors, 400)
        end
      end
    end
  end
end
