lib/scrivito/workspace.rb in scrivito_sdk-0.15.0 vs lib/scrivito/workspace.rb in scrivito_sdk-0.16.0
- old
+ new
@@ -199,14 +199,94 @@
def assert_revertable
raise ScrivitoError, 'published workspace is not modifiable' if published?
raise ScrivitoError, 'rtc workspace may contain attribute and class changes' if rtc?
end
+ # Find a {BasicObj Obj} by its id.
+ # If the parameter is an Array containing ids, return a list of corresponding Objs.
+ # @param [String, Integer, Array<String, Integer>]id_or_list
+ # @return [Obj, Array<Obj>]
+ # @api public
+ def find_obj(id_or_list)
+ find_filtering_deleted(id_or_list, false)
+ end
+
+ # Find a {BasicObj Obj} by its id.
+ # If the parameter is an Array containing ids, return a list of corresponding Objs.
+ # The results include deleted objects as well.
+ # @param [String, Integer, Array<String, Integer>]id_or_list
+ # @return [Obj, Array<Obj>]
+ # @api public
+ def find_obj_including_deleted(id_or_list)
+ find_filtering_deleted(id_or_list, true)
+ end
+
+ # Find the {BasicObj Obj} with the given path.
+ # Returns +nil+ if no matching Obj exists.
+ # @param [String] path Path of the {BasicObj Obj}.
+ # @return [Obj]
+ # @api public
+ def find_obj_by_path(path)
+ find_objs_by(:path, [path]).first.first
+ end
+
+ # Returns the {BasicObj Obj} with the given permalink, or +nil+ if no matching Obj exists.
+ # @param [String] permalink The permalink of the {BasicObj Obj}.
+ # @return [Obj]
+ # @api public
+ def find_obj_by_permalink(permalink)
+ find_objs_by(:permalink, [permalink]).first.first
+ end
+
+ def find_objs_by_parent_path(path)
+ find_objs_by(:ppath, [path]).first
+ end
+
+ def find_obj_by_id(id)
+ find_objs_by(:id, [id]).first.first
+ end
+
+ def find_objs_by_paths(paths)
+ find_objs_by(:path, paths).map(&:first)
+ end
+
def inspect
"<#{self.class} id=\"#{id}\" title=\"#{title}\">"
end
private
+
+ def find_filtering_deleted(id_or_list, include_deleted)
+ case id_or_list
+ when Array
+ find_objs_by(:id, id_or_list, include_deleted).map(&:first).compact
+ else
+ obj = find_objs_by(:id, [id_or_list.to_s], include_deleted).first.first
+ obj or raise ResourceNotFound, "Could not find Obj with id #{id_or_list}"
+ end
+ end
+
+ # accepts the name of an "obj_by" - view, a list of keys
+ # and an "include_deleted" flag
+ # returns a list of lists of Objs: a list of Objs for each given keys.
+ def find_objs_by(view, keys, include_deleted = false)
+ if include_deleted
+ finder_method_name = :find_obj_data_including_deleted_by
+ else
+ finder_method_name = :find_obj_data_by
+ end
+
+ result = CmsBackend.instance.public_send(finder_method_name, revision, view, keys)
+
+ result.map do |list|
+ list.map do |obj_data|
+ obj = BasicObj.instantiate(obj_data)
+ obj.revision = revision
+
+ obj
+ end
+ end
+ end
def backend_url
"/workspaces/#{id}"
end