lib/moysklad/resources/base.rb in moysklad-0.2.1 vs lib/moysklad/resources/base.rb in moysklad-0.3.0
- old
+ new
@@ -1,9 +1,10 @@
+require 'json'
class Moysklad::Resources::Base
- PREFIX_PATH = 'exchange/rest/ms/xml/'
+ PREFIX_PATH = 'entity/'
- def self.inherited superclass
+ def self.inherited superclass
super
Moysklad::Resources.register_resource superclass
end
# Возвращает этот-же ресурс только индексированный
@@ -12,34 +13,32 @@
def self.indexed *args
Moysklad::Resources::Indexed.new new(*args)
end
# https://support.moysklad.ru/hc/ru/articles/203404253-REST-сервис-синхронизации-данных
- def initialize client: nil
+ def initialize client: nil, list_path: nil
+ @list_path = list_path
raise "Должен быть Moysklad::Client" unless client.is_a? Moysklad::Client
@client = client
end
+ def metadata
+ Moysklad::Entities::ResourceMetadata.build client.get(metadata_path), self
+ end
+
# Возвращает список элементов как есть
#
# @return [Array of Moysklad::Entities::Base]
def list params={}
- parse client.get list_path, params
+ load_collection client.get list_path, params
end
- # Возвращает страницу со списком элементов
- #
- # @return [Moysklad::Entities::Page]
- def page params={}
- parse_page client.get list_path, params
- end
-
# Забираем элемент по uuid
#
# @return [Moysklad::Entities::Base]
- def get uuid
- parse client.get item_path uuid
+ def get uuid, params = {}
+ parse_get client.get item_path(uuid), params
end
# Модифицируем элемент по uuid
#
# @return [Moysklad::Entities::Base]
@@ -54,74 +53,63 @@
# Возвращается созданная на сервере сущность
#
# @return [Moysklad::Entities::Base]
def create model
raise "Должна быть модель типа Moysklad::Entities::Base" unless model.is_a? Moysklad::Entities::Base
- parse client.put create_path, prepare_resource(model)
+ parse_get client.post create_path, model.to_json
end
# Удаляем запись по uuid
#
# @param uuid
def delete uuid
- client.delete item_path uuid
+ client.delete item_path uuid
end
def self.type
ActiveSupport::Inflector.singularize name.split('::').last.to_sym
end
def self.pluralized_type
ActiveSupport::Inflector.underscore ActiveSupport::Inflector.pluralize type
end
- def self.entity_class
- ActiveSupport::Inflector.constantize "Moysklad::Entities::#{type.to_s}"
- end
-
private
attr_reader :client
- def prepare_resource resource
- if resource.is_a? Moysklad::Entities::Base
- resource.to_xml.to_s
- else
- resource.to_s
- end
+ def parse_get data
+ entity_class.build data, self
end
- def parse content
- self.class.entity_class.parse parse_content content
+ def load_collection data
+ collection_class.build data, self
end
- def parse_content content
- Nokogiri::XML content
- end
-
- def parse_page content
- col = Moysklad::Entities::Collection.parse parse_content content
-
- # TODO Парсится два раза. Оптимизировать. Например сделать динамические CollectionFeature
- # и парсить через них
-
- items = parse content
- Moysklad::Entities::Page.new items, col.total, col.start, col.count
- end
-
def item_path uuid
prefix_path + '/' + uuid
end
def create_path
prefix_path
end
def list_path
- prefix_path + '/list'
+ @list_path ||= prefix_path
end
- def prefix_path
- PREFIX_PATH + self.class.type
+ def metadata_path
+ prefix_path + '/metadata'
end
+ def collection_class
+ Moysklad::Entities::Collection
+ end
+
+ def entity_class
+ ActiveSupport::Inflector.constantize "Moysklad::Entities::#{self.class.type.to_s}"
+ end
+
+ def prefix_path
+ PREFIX_PATH + self.class.type.downcase
+ end
end