module SharepointApi::FileSystem

Public Instance Methods

add_file(path, content) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 9
def add_file(path, content)
  folder_path = File.dirname(path)
  file_name = encode_path(File.basename(path))
  FileInfo.wrap(
    site.query(
      :post,
      "GetFolderByServerRelativeUrl('#{site_relative_path(folder_path)}')/Files" \
      "/Add(overwrite=true,url='#{file_name}')?#{FileInfo::FILE_SELECT_QUERY}",
      content
    )
  )
rescue Sharepoint::SPException => e
  reraise_if_lock_error(e)

  log_as(__method__, e)
  nil
end
add_folder(path) click to toggle source

Perhaps this should support a recursive option to create all parents as needed?

# File lib/sharepoint_api/file_system.rb, line 136
def add_folder(path)
  site.query(:post, "Folders/Add('#{server_relative_path(path)}')")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
add_library(name, description: nil) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 159
def add_library(name, description: nil)
  site.query(:post, 'lists', {
    '__metadata' => { 'type' => 'SP.List' },
    'Title' => name,
    'Description' => description || "Document library for #{name}.",
    'BaseTemplate' => Sharepoint::LIST_TEMPLATE_TYPE[:DocumentLibrary],
    'AllowContentTypes' => true,
    'ContentTypesEnabled' => true,
    'EnableVersioning' => true
  }.to_json)
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
file_exists?(path) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 27
def file_exists?(path)
  server_path = server_relative_path(path)
  site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')/Exists")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
files_in_folder(path) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 118
def files_in_folder(path)
  server_path = server_relative_path(path)
  result = site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')/Files?#{FileInfo::FILE_SELECT_QUERY_WITH_VERSIONS}", nil, true)
  result = JSON.parse(result)
  result.dig('d', 'results')&.map do |file_result|
    file_result['Versions'] = Sharepoint::Site.make_object_from_response(site, { 'd' => file_result['Versions'] })
  end
  files = Sharepoint::Site.make_object_from_response(site, result)

  files.map { |file| FileInfo.new(file) }
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
find_file(path) click to toggle source

Querying a non-existent file will raise a 500 error so we check for existence first.

# File lib/sharepoint_api/file_system.rb, line 37
def find_file(path)
  return nil unless file_exists?(path)

  server_path = server_relative_path(path)
  result = site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')?#{FileInfo::FILE_SELECT_QUERY_WITH_VERSIONS}", nil, true)
  result = JSON.parse(result)
  result['d']['Versions'] = Sharepoint::Site.make_object_from_response(site, { 'd' => result['d']['Versions'] })
  file = Sharepoint::Site.make_object_from_response(site, result)

  FileInfo.wrap(file)
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
find_file_version(path, version_id) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 52
def find_file_version(path, version_id)
  server_path = server_relative_path(path)
  site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')/versions(#{version_id})")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
find_folder(path) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 143
def find_folder(path)
  server_path = server_relative_path(path)
  site.query(:get, "GetFolderByServerRelativeUrl('#{server_path}')")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
find_library(name) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 174
def find_library(name)
  encoded_name = encode_path(name)
  site.query :get, "Lists/GetByTitle('#{encoded_name}')"
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
move_file(path, new_path) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 60
def move_file(path, new_path)
  server_path = server_relative_path(path)
  new_server_path = server_relative_path(new_path)

  site.query(
    :post,
    "GetFileByServerRelativeUrl(@v)/MoveTo?@v='#{server_path}'&newurl='#{new_server_path}'&flags=0"
  )

  true
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  false
end
remove_file(path) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 86
def remove_file(path)
  site.query(
    :post,
    "GetFileByServerRelativeUrl('#{server_relative_path(path)}')/Recycle"
  )
rescue Sharepoint::SPException => e
  reraise_if_lock_error(e)

  log_as(__method__, e)
  nil
end
remove_file_version(path, version_id) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 98
def remove_file_version(path, version_id)
  site.query(
    :post,
    "GetFileByServerRelativeUrl('#{server_relative_path(path)}')/Versions/DeleteById(vid=#{version_id})"
  )
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
remove_folder(path) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 151
def remove_folder(path)
  server_path = server_relative_path(path)
  site.query(:post, "GetFolderByServerRelativeUrl('#{server_path}')/Recycle")
rescue Sharepoint::SPException => e
  log_as(__method__, e)
  nil
end
rename_file(path, rename_to) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 75
def rename_file(path, rename_to)
  validate_update_list_item(
    path,
    {
      'FileLeafRef' => rename_to
    }
  )
rescue SharepointApi::ItemUpdateError => _e
  false
end
retrieve_file_content(path) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 108
def retrieve_file_content(path)
  server_path = server_relative_path(path)
  site.query(:get, "GetFileByServerRelativeUrl('#{server_path}')/$value", { binaryStringResponseBody: true }.to_json, true)
rescue Sharepoint::SPException => e
  reraise_if_lock_error(e)

  log_as(__method__, e)
  raise FileNotFoundError, "The file #{path} does not exist."
end

Private Instance Methods

reraise_if_lock_error(error) click to toggle source
# File lib/sharepoint_api/file_system.rb, line 186
def reraise_if_lock_error(error)
  return unless error.message =~ /is locked for shared use/

  log_as(__method__, error, level: :warn)
  raise(LockError, error.message)
end