lib/jsonapionify/api/resource/builders.rb in jsonapionify-0.10.2 vs lib/jsonapionify/api/resource/builders.rb in jsonapionify-0.11.0
- old
+ new
@@ -1,160 +1,49 @@
module JSONAPIonify::Api
module Resource::Builders
extend ActiveSupport::Concern
+ extend JSONAPIonify::Autoload
+
+ autoload_all
+
FALSEY_STRINGS = JSONAPIonify::FALSEY_STRINGS
TRUTHY_STRINGS = JSONAPIonify::TRUTHY_STRINGS
- Structure = JSONAPIonify::Structure
module ClassMethods
+ include JSONAPIonify::Structure
- def build_resource(
- context,
- instance,
- fields:,
- relationships: true,
- links: true,
- include_cursor: false, &block
- )
- example_id = generate_id
- include_rel_param = context.params['include-relationships']
- relationships = false if FALSEY_STRINGS.include?(include_rel_param)
- return nil unless instance
- resource_url = build_url(context, instance)
- id = build_id(instance)
- Structure::Objects::Resource.new.tap do |resource|
- resource[:id] = id
- resource[:type] = type
-
- resource[:attributes] = fields[type.to_sym].each_with_object(
- Structure::Objects::Attributes.new
- ) do |member, attributes|
- attribute = self.attributes.find { |a| a.name == member.to_sym }
- unless attribute.supports_read_for_action?(context.action_name, context)
- error_block =
- context.resource.class.error_definitions[:internal_server_error]
- context.errors.evaluate(
- name,
- error_block: error_block,
- runtime_block: proc {}
- )
- end
- attributes[member.to_sym] = attribute.resolve(
- instance, context, example_id: example_id
- )
- end
-
- resource[:links] = Structure::Objects::Links.new(
- self: resource_url
- ) if links
-
- resource[:meta] = {
- cursor: build_cursor_from_instance(context, instance)
- } if include_cursor
-
- resource[:relationships] = relationship_definitions.each_with_object(
- Structure::Maps::Relationships.new
- ) do |rel, hash|
- hash[rel.name] = build_relationship(context, instance, rel.name)
- end if relationships || context.includes.present?
-
- block.call(resource, instance) if block
- end
+ def build_resource(**options, &block)
+ ResourceBuilder.build(self, **options)
end
- def build_resource_identifier(instance)
- Structure::Objects::ResourceIdentifier.new(
- id: build_id(instance),
- type: type.to_s
- )
- end
-
- def build_collection(
- context,
- collection,
- fields:,
- include_cursors: false,
- &block
- )
- include_rel_param = context.params['include-relationships']
- relationships = TRUTHY_STRINGS.include? include_rel_param
+ def build_resource_collection(context:, collection:, include_cursors: false, &block)
collection.each_with_object(
- Structure::Collections::Resources.new
+ Collections::Resources.new
) do |instance, resources|
- resources << build_resource(
- context,
- instance,
- fields: fields,
- relationships: relationships,
- include_cursor: include_cursors,
- &block
- )
+ resources << build_resource(context: context, instance: instance, include_cursor: include_cursors, &block)
end
end
- def build_cursor_from_instance(context, instance)
- sort_string = context.params['sort']
- sort_fields = sort_fields_from_sort_string(sort_string)
- attrs_with_values = sort_fields.each_with_object({}) do |field, hash|
- hash[field.name] = instance.send(field.name)
- end
- Base64.urlsafe_encode64(JSON.dump(
- {
- t: type,
- s: sort_string,
- a: attrs_with_values
- }
- ))
+ def build_resource_identifier(instance:)
+ ResourceIdentifierBuilder.build(self, instance: instance)
end
- def build_identifier_collection(collection)
+ def build_resource_identifier_collection(collection:)
collection.each_with_object(
- JSONAPIonify::Structure::Collections::ResourceIdentifiers.new
+ Collections::ResourceIdentifiers.new
) do |instance, resource_identifiers|
- resource_identifiers << build_resource_identifier(instance)
+ resource_identifiers << build_resource_identifier(instance: instance)
end
end
- def build_relationship(context, instance, name, links: true, data: false)
- resource_url = build_url(context, instance)
- relationship = self.relationship(name)
- JSONAPIonify::Structure::Objects::Relationship.new.tap do |rel|
- rel[:links] = relationship.build_links(resource_url) if links
- if data || context.includes.present?
- rel[:data] =
- if relationship.rel.is_a? Relationship::Many
- instance.send(name).map do |child|
- relationship.build_resource_identifier(child)
- end
- elsif relationship.rel.is_a? Relationship::One
- value = instance.send(name)
- relationship.build_resource_identifier value if value
- end
- end
- end
+ def build_cursor(**options)
+ CursorBuilder.build(self, **options)
end
- def build_url(context, instance = nil)
- URI.parse(context.request.root_url).tap do |uri|
- uri.path =
- if instance
- File.join(uri.path, type, build_id(instance))
- else
- File.join(context.request.root_url, type)
- end
- sticky_params = self.sticky_params(context.params)
- uri.query = sticky_params.to_param if sticky_params.present?
- end.to_s
- end
-
- def build_id(instance)
- instance.send(id_attribute).to_s
- end
end
+ delegated_methods = ClassMethods.instance_methods - instance_methods
included do
- delegated_methods = ClassMethods.instance_methods -
- JSONAPIonify::Api::Resource::Builders.instance_methods
delegate(*delegated_methods, to: :class)
end
end
end