POC of an sql rendered project representer

pull/10136/head
ulferts 3 years ago
parent 95fc2ba7c4
commit e178e15555
No known key found for this signature in database
GPG Key ID: A205708DE1284017
  1. 37
      lib/api/v3/projects/project_sql_collection_representer.rb
  2. 44
      lib/api/v3/projects/project_sql_representer.rb
  3. 12
      lib/api/v3/projects/projects_api.rb
  4. 71
      lib/api/v3/utilities/endpoints/sql_fallbacked_index.rb
  5. 29
      spec/requests/api/v3/projects/index_resource_spec.rb

@ -0,0 +1,37 @@
# OpenProject is an open source project management software.
# Copyright (C) 2010-2022 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
module API
module V3
module Projects
class ProjectSqlCollectionRepresenter < API::Decorators::SqlCollectionRepresenter
self.embed_map = {
elements: ProjectSqlRepresenter
}.with_indifferent_access
end
end
end
end

@ -0,0 +1,44 @@
#-- copyright
# OpenProject is an open source project management software.
# Copyright (C) 2012-2020 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2017 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
#++
module API
module V3
module Projects
class ProjectSqlRepresenter
include API::Decorators::Sql::Hal
property :_type,
representation: ->(*) { "'Project'" }
property :id
property :name
end
end
end
end

@ -41,12 +41,12 @@ module API
end
resources :projects do
get &::API::V3::Utilities::Endpoints::Index.new(model: Project,
scope: -> {
visible_project_scope
.includes(ProjectRepresenter.to_eager_load)
})
.mount
get &::API::V3::Utilities::Endpoints::SqlFallbackedIndex.new(model: Project,
scope: -> {
visible_project_scope
.includes(ProjectRepresenter.to_eager_load)
})
.mount
post &::API::V3::Utilities::Endpoints::Create.new(model: Project)
.mount

@ -0,0 +1,71 @@
# OpenProject is an open source project management software.
# Copyright (C) 2010-2022 the OpenProject GmbH
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License version 3.
#
# OpenProject is a fork of ChiliProject, which is a fork of Redmine. The copyright follows:
# Copyright (C) 2006-2013 Jean-Philippe Lang
# Copyright (C) 2010-2013 the ChiliProject Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# See COPYRIGHT and LICENSE files for more details.
module API
module V3
module Utilities
module Endpoints
class SqlFallbackedIndex < SqlIndex
private
def render_paginated_success(results, query, params, self_path)
resulting_params = calculate_resulting_params(query, params)
if resulting_params[:select]
::API::V3::Utilities::SqlRepresenterWalker
.new(results,
embed: { 'elements' => {} },
select: resulting_params[:select],
current_user: User.current,
self_path: self_path,
url_query: resulting_params)
.walk(deduce_render_representer)
else
deduce_fallback_render_representer
.new(results,
self_link: self_path,
query: resulting_params,
page: resulting_params[:offset],
per_page: resulting_params[:pageSize],
groups: calculate_groups(query),
current_user: User.current)
end
end
def deduce_fallback_render_representer
"::API::V3::#{deduce_api_namespace}::#{api_name}CollectionRepresenter".constantize
end
def calculate_resulting_params(query, provided_params)
super.tap do |params|
params.delete(:select) unless provided_params.has_key?(:select)
end
end
end
end
end
end
end

@ -58,11 +58,6 @@ describe 'API v3 Project resource index', type: :request, content_type: :json do
get get_path
end
it 'succeeds' do
expect(response.status)
.to be(200)
end
it_behaves_like 'API V3 collection response', 1, 1, 'Project'
context 'with a pageSize and offset' do
@ -231,4 +226,28 @@ describe 'API v3 Project resource index', type: :request, content_type: :json do
end
end
end
context 'when signaling the properties to include' do
let(:projects) { [project] }
let(:select) { 'elements/id,elements/name' }
let(:get_path) do
api_v3_paths.path_for :projects, select: select
end
it 'is the reduced set of properties of the embedded elements' do
expected = {
_embedded: {
elements: [
{
id: project.id,
name: project.name
}
]
}
}
expect(last_response.body)
.to be_json_eql(expected.to_json)
end
end
end

Loading…
Cancel
Save