module SharepointApi::Items

Public Instance Methods

fetch_content_types() click to toggle source
# File lib/sharepoint_api/items.rb, line 25
def fetch_content_types
  encoded_name = encode_path(library_name)
  response = site.query(
    :get,
    "Lists/GetByTitle('#{encoded_name}')/ContentTypes?" \
    '$select=Name,StringId'
  )
  response.map { |content_type| reject_metadata(content_type.data) }
rescue Sharepoint::SharepointError => e
  log_as(__method__, e)

  nil
end
validate_update_list_item(path, field_name_field_value_pairs) click to toggle source
# File lib/sharepoint_api/items.rb, line 7
def validate_update_list_item(path, field_name_field_value_pairs)
  server_path = server_relative_path(path)
  uri = "GetFolderByServerRelativeUrl('#{server_path}')/ListItemAllFields/" \
    'ValidateUpdateListItem'

  form_values = field_name_field_value_pairs.map do |key, value|
    { 'FieldName' => key, 'FieldValue' => value }
  end
  body = { 'formValues' => form_values, 'bNewDocumentUpdate' => false }

  response = site.query(:post, uri, body.to_json, true)
  hoist_complex_errors!(response, uri, body)

  true
rescue Sharepoint::SharepointError => e
  raise SharepointApi::SharepointError, e.message
end

Private Instance Methods

hoist_complex_errors!(response, uri, body) click to toggle source
# File lib/sharepoint_api/items.rb, line 43
def hoist_complex_errors!(response, uri, body)
  data = JSON.parse(response)

  if data['error']
    error = Sharepoint::SPException.new(data, uri, body)
    reraise_if_lock_error(error)

    log_as(__method__, error)
    raise ItemUpdateError, error.message
  end

  errors = data.dig('d', 'ValidateUpdateListItem', 'results')&.
    select { |result| result['HasException'] }&.
    map { |result| result.slice('FieldName', 'FieldValue', 'ErrorMessage') }

  return if errors.nil? || errors.count.zero?

  log_as(__method__, errors)
  raise ItemUpdateError, errors
end
reject_metadata(data) click to toggle source
# File lib/sharepoint_api/items.rb, line 71
def reject_metadata(data)
  data.reject { |key| key == '__metadata' }
end
reraise_if_lock_error(error) click to toggle source
# File lib/sharepoint_api/items.rb, line 64
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