REST API and pagination on collection resources #850

This commit is contained in:
Karel Pičman 2018-05-11 10:35:45 +02:00
parent 5bcdf6288a
commit 3791875c08
3 changed files with 81 additions and 18 deletions

View File

@ -662,20 +662,35 @@ class DmsfController < ApplicationController
@url_links = []
else
if @folder
@subfolders = @folder.dmsf_folders.visible.to_a
@subfolders = @folder.dmsf_folders.visible
@files = @folder.dmsf_files.visible
@dir_links = @folder.folder_links.visible
@file_links = @folder.file_links.visible
@url_links = @folder.url_links.visible
@locked_for_user = @folder.locked_for_user?
else
@subfolders = @project.dmsf_folders.visible.to_a
@subfolders = @project.dmsf_folders.visible
@files = @project.dmsf_files.visible
@dir_links = @project.folder_links.visible
@file_links = @project.file_links.visible
@url_links = @project.url_links.visible
@locked_for_user = false
end
# Limit and offset for REST API calls
if params[:limit].present?
@subfolders = @subfolders.limit(params[:limit])
@files = @files.limit(params[:limit])
@dir_links = @dir_links.limit(params[:limit])
@file_links = @file_links.limit(params[:limit])
@url_links = @url_links.limit(params[:limit])
end
if params[:offset].present?
@subfolders = @subfolders.offset(params[:offset])
@files = @files.offset(params[:offset])
@dir_links = @dir_links.offset(params[:offset])
@file_links = @file_links.offset(params[:offset])
@url_links = @url_links.offset(params[:offset])
end
end
# Remove system folders you are not allowed to see because you are not allowed to see the issue or you are not
# permitted to see system folders

View File

@ -32,6 +32,7 @@
# 1. List of documents in a given folder or the root folder
#curl -v -H "Content-Type: application/xml" -X GET -u ${1}:${2} http://localhost:3000/projects/12/dmsf.xml
#curl -v -H "Content-Type: application/xml" -X GET -u ${1}:${2} http://localhost:3000/projects/12/dmsf.xml?folder_id=5155
#curl -v -H "Content-Type: application/xml" -X GET -u ${1}:${2} "http://localhost:3000/projects/12/dmsf.xml?limit=2&offset=1"
# 2. Get a document
#curl -v -H "Content-Type: application/xml" -X GET -u ${1}:${2} http://localhost:3000/dmsf/files/17216.xml

View File

@ -32,6 +32,7 @@ class DmsfFolderApiTest < RedmineDmsf::Test::IntegrationTest
@jsmith = User.find_by_id 2
@file1 = DmsfFile.find_by_id 1
@folder1 = DmsfFolder.find_by_id 1
@folder6 = DmsfFolder.find_by_id 6
Setting.rest_api_enabled = '1'
@role = Role.find_by_id 1
@project1 = Project.find_by_id 1
@ -42,6 +43,7 @@ class DmsfFolderApiTest < RedmineDmsf::Test::IntegrationTest
assert_kind_of User, @admin
assert_kind_of User, @jsmith
assert_kind_of DmsfFolder, @folder1
assert_kind_of DmsfFolder, @folder6
assert_kind_of DmsfFile, @file1
assert_kind_of Role, @role
assert_kind_of Project, @project1
@ -55,31 +57,76 @@ class DmsfFolderApiTest < RedmineDmsf::Test::IntegrationTest
assert_response :success
assert_equal 'application/xml', @response.content_type
# <?xml version="1.0" encoding="UTF-8"?>
# <dmsf>
# <dmsf_folders total_count="2" type="array">
# <folder>
# <dmsf>
# <dmsf_folders total_count="3" type="array">
# <folder>
# <id>1</id>
# <title>folder1</title>
# </folder>
# <folder>
# <id>6</id>
# <title>folder1</title>
# </folder>
# <folder>
# <id>6</id>
# <title>folder6</title>
# </folder>
# </dmsf_folders>
# <dmsf_files total_count="1" type="array">
# <file>
# </folder>
# <folder>
# <id>7</id>
# <title>folder7</title>
# </folder>
# </dmsf_folders>
# <dmsf_files total_count="4" type="array">
# <file>
# <id>9</id>
# <name>myfile.txt</name>
# </file>
# <file>
# <id>8</id>
# <name>test.pdf</name>
# </file>
# <file>
# <id>1</id>
# <name>test.txt</name>
# </file>
# </dmsf_files>
# <dmsf_links total_count="0" type="array">
# </dmsf_links>
# <name>test.txt</name>
# </file>
# <file>
# <id>10</id>
# <name>zero.txt</name>
# </file>
# </dmsf_files>
# <dmsf_links total_count="0" type="array">
# </dmsf_links>
# </dmsf>
assert_select 'dmsf > dmsf_folders > folder > id', :text => @folder1.id.to_s
assert_select 'dmsf > dmsf_folders > folder > title', :text => @folder1.title.to_s
assert_select 'dmsf > dmsf_files > file > id', :text => @file1.id.to_s
assert_select 'dmsf > dmsf_files > file > name', :text => @file1.name.to_s
end
def test_list_folder_limit_and_offset
@role.add_permission! :view_dmsf_folders
token = Token.create!(:user => @jsmith, :action => 'api')
#curl -v -H "Content-Type: application/xml" -X GET -u ${1}:${2} "http://localhost:3000/dmsf/files/17216.xml?limit=1&offset=1"
get "/projects/#{@project1.id}/dmsf.xml?key=#{token.value}&limit=1&offset=2"
assert_response :success
assert_equal 'application/xml', @response.content_type
# <?xml version="1.0" encoding="UTF-8"?>
# <dmsf>
# <dmsf_folders total_count="1" type="array">
# <folder>
# <id>6</id>
# <title>folder6</title>
# </folder>
# </dmsf_folders>
# <dmsf_files total_count="1" type="array">
# <file>
# <id>1</id>
# <name>test.txt</name>
# </file>
# </dmsf_files>
# <dmsf_links total_count="0" type="array">
# </dmsf_links>
# </dmsf>
assert_select 'dmsf > dmsf_folders', :count => 1
assert_select 'dmsf > dmsf_folders > folder > id', :text => @folder6.id.to_s
assert_select 'dmsf > dmsf_folders > folder > title', :text => @folder6.title.to_s
assert_select 'dmsf > dmsf_files', :count => 1
end
def test_create_folder