lib/scrivito/revision.rb in scrivito_sdk-0.60.0 vs lib/scrivito/revision.rb in scrivito_sdk-0.65.0.rc1
- old
+ new
@@ -1,13 +1,73 @@
module Scrivito
-class Revision < Struct.new(:id, :content_state, :workspace, :base)
+class Revision < Struct.new(:id, :workspace, :base)
def initialize(options)
- super(*options.values_at(:id, :content_state, :workspace, :base))
+ super(*options.values_at(:id, :workspace, :base))
end
+ def content_state
+ base ? workspace.base_content_state : workspace.content_state
+ end
+
+ def content_state_id
+ base ? workspace.base_content_state_id : workspace.content_state_id
+ end
+
+ def content_state_node
+ @node ||= Backend::ContentStateNode.new(content_state_id)
+ end
+
+ # returns a list of raw rest-api hashes, one for each given id
+ def obj_mget_request(ids)
+ internal_obj_mget(ids, [])
+ end
+
+ # performs given search-query, returns the search-hits as a list of obj-ids
+ def obj_search_request(query)
+ if base
+ raise Scrivito::InternalError, "search not possible for base revision"
+ end
+
+ internal_obj_search(query, [])
+ end
+
+ def api_request(verb, path, payload = nil)
+ CmsRestApi.public_send(verb, "revisions/#{id}#{path}", payload)
+ end
+
def base?
!!base
+ end
+
+ private
+
+ def internal_obj_search(query, result)
+ response = workspace.api_request(:get, "/objs/search", {
+ query: query, include_deleted: true, size: 100, offset: result.size
+ })
+
+ cur_result = response['results'].map { |obj_data| obj_data['id'] }
+ result += cur_result
+
+ if result.size >= response['total'].to_i
+ result
+ else
+ internal_obj_search(query, result)
+ end
+ end
+
+ def internal_obj_mget(ids, result)
+ response = api_request(
+ :get, "/objs/mget", ids: ids, include_deleted: true)
+
+ current_result = result + response["results"]
+
+ if response["results"].size < ids.size
+ internal_obj_mget(ids.drop(response["results"].size), current_result)
+ else
+ current_result
+ end
end
end
end