diff --git a/app/serializers/api/cached_enterprise_serializer.rb b/app/serializers/api/cached_enterprise_serializer.rb index b13b7a27b3..4070cfa7d5 100644 --- a/app/serializers/api/cached_enterprise_serializer.rb +++ b/app/serializers/api/cached_enterprise_serializer.rb @@ -1,155 +1,161 @@ require 'open_food_network/property_merge' -class Api::CachedEnterpriseSerializer < ActiveModel::Serializer - include SerializerHelper +module Api + class CachedEnterpriseSerializer < ActiveModel::Serializer + include SerializerHelper - cached + cached - def cache_key - object.andand.cache_key - end - - attributes :name, :id, :description, :latitude, :longitude, - :long_description, :website, :instagram, :linkedin, :twitter, - :facebook, :is_primary_producer, :is_distributor, :phone, :visible, - :email_address, :hash, :logo, :promo_image, :path, :pickup, :delivery, - :icon, :icon_font, :producer_icon_font, :category, :producers, :hubs - - attributes :taxons, :supplied_taxons - - has_one :address, serializer: Api::AddressSerializer - - has_many :supplied_properties, serializer: Api::PropertySerializer - has_many :distributed_properties, serializer: Api::PropertySerializer - - def pickup - services = options[:data].shipping_method_services[object.id] - services ? services[:pickup] : false - end - - def delivery - services = options[:data].shipping_method_services[object.id] - services ? services[:delivery] : false - end - - def email_address - object.email_address.to_s.reverse - end - - def hash - object.to_param - end - - def logo - object.logo(:medium) if object.logo? - end - - def promo_image - object.promo_image(:large) if object.promo_image? - end - - def path - enterprise_shop_path(object) - end - - def producers - relatives = options[:data].relatives[object.id] - ids_to_objs(relatives.andand[:producers]) - end - - def hubs - relatives = options[:data].relatives[object.id] - ids_to_objs(relatives.andand[:distributors]) - end - - def taxons - if active - ids_to_objs options[:data].current_distributed_taxons[object.id] - else - ids_to_objs options[:data].all_distributed_taxons[object.id] - end - end - - def supplied_taxons - ids_to_objs options[:data].supplied_taxons[object.id] - end - - def supplied_properties - (product_properties + producer_properties).uniq do |property_object| - property_object.property.presentation - end - end - - def distributed_properties - # This results in 3 queries per enterprise - - if active - product_properties = Spree::Property.currently_sold_by(object) - producer_property_ids = ProducerProperty.currently_sold_by(object).pluck(:property_id) - - else - product_properties = Spree::Property.ever_sold_by(object) - producer_property_ids = ProducerProperty.ever_sold_by(object).pluck(:property_id) + def cache_key + object.andand.cache_key end - producer_properties = Spree::Property.where(id: producer_property_ids) + attributes :name, :id, :description, :latitude, :longitude, + :long_description, :website, :instagram, :linkedin, :twitter, + :facebook, :is_primary_producer, :is_distributor, :phone, :visible, + :email_address, :hash, :logo, :promo_image, :path, :pickup, :delivery, + :icon, :icon_font, :producer_icon_font, :category, :producers, :hubs - OpenFoodNetwork::PropertyMerge.merge product_properties, producer_properties - end + attributes :taxons, :supplied_taxons - def active - options[:data].active_distributors.andand.include? object - end + has_one :address, serializer: AddressSerializer - # Map svg icons. - def icon - icons = { - hub: "/assets/map_005-hub.svg", - hub_profile: "/assets/map_006-hub-profile.svg", - producer_hub: "/assets/map_005-hub.svg", - producer_shop: "/assets/map_003-producer-shop.svg", - producer: "/assets/map_001-producer-only.svg", - } - icons[object.category] - end + has_many :supplied_properties, serializer: PropertySerializer + has_many :distributed_properties, serializer: PropertySerializer - # Choose regular icon font for enterprises. - def icon_font - icon_fonts = { - hub: "ofn-i_063-hub", - hub_profile: "ofn-i_064-hub-reversed", - producer_hub: "ofn-i_063-hub", - producer_shop: "ofn-i_059-producer", - producer: "ofn-i_059-producer", - } - icon_fonts[object.category] - end + def pickup + services = data.shipping_method_services[object.id] + services ? services[:pickup] : false + end - # Choose producer page icon font - yes, sadly its got to be different. - # This duplicates some code but covers the producer page edge case where - # producer-hub has a producer icon without needing to duplicate the category logic in angular. - def producer_icon_font - icon_fonts = { - hub: "", - hub_profile: "", - producer_hub: "ofn-i_059-producer", - producer_shop: "ofn-i_059-producer", - producer: "ofn-i_059-producer", - } - icon_fonts[object.category] - end + def delivery + services = data.shipping_method_services[object.id] + services ? services[:delivery] : false + end - private + def email_address + object.email_address.to_s.reverse + end - def product_properties - enterprise.supplied_products.flat_map(&:properties) - end + def hash + object.to_param + end - def producer_properties - enterprise.properties - end + def logo + object.logo(:medium) if object.logo? + end - def enterprise - object + def promo_image + object.promo_image(:large) if object.promo_image? + end + + def path + enterprise_shop_path(object) + end + + def producers + relatives = data.relatives[object.id] + ids_to_objs(relatives.andand[:producers]) + end + + def hubs + relatives = data.relatives[object.id] + ids_to_objs(relatives.andand[:distributors]) + end + + def taxons + if active + ids_to_objs data.current_distributed_taxons[object.id] + else + ids_to_objs data.all_distributed_taxons[object.id] + end + end + + def supplied_taxons + ids_to_objs data.supplied_taxons[object.id] + end + + def supplied_properties + (product_properties + producer_properties).uniq do |property_object| + property_object.property.presentation + end + end + + def distributed_properties + # This results in 3 queries per enterprise + + if active + product_properties = Spree::Property.currently_sold_by(object) + producer_property_ids = ProducerProperty.currently_sold_by(object).pluck(:property_id) + + else + product_properties = Spree::Property.ever_sold_by(object) + producer_property_ids = ProducerProperty.ever_sold_by(object).pluck(:property_id) + end + + producer_properties = Spree::Property.where(id: producer_property_ids) + + OpenFoodNetwork::PropertyMerge.merge product_properties, producer_properties + end + + def active + data.active_distributors.andand.include? object + end + + # Map svg icons. + def icon + icons = { + hub: "/assets/map_005-hub.svg", + hub_profile: "/assets/map_006-hub-profile.svg", + producer_hub: "/assets/map_005-hub.svg", + producer_shop: "/assets/map_003-producer-shop.svg", + producer: "/assets/map_001-producer-only.svg", + } + icons[object.category] + end + + # Choose regular icon font for enterprises. + def icon_font + icon_fonts = { + hub: "ofn-i_063-hub", + hub_profile: "ofn-i_064-hub-reversed", + producer_hub: "ofn-i_063-hub", + producer_shop: "ofn-i_059-producer", + producer: "ofn-i_059-producer", + } + icon_fonts[object.category] + end + + # Choose producer page icon font - yes, sadly its got to be different. + # This duplicates some code but covers the producer page edge case where + # producer-hub has a producer icon without needing to duplicate the category logic in angular. + def producer_icon_font + icon_fonts = { + hub: "", + hub_profile: "", + producer_hub: "ofn-i_059-producer", + producer_shop: "ofn-i_059-producer", + producer: "ofn-i_059-producer", + } + icon_fonts[object.category] + end + + private + + def product_properties + enterprise.supplied_products.flat_map(&:properties) + end + + def producer_properties + enterprise.properties + end + + def enterprise + object + end + + def data + options[:data] + end end end diff --git a/app/serializers/api/uncached_enterprise_serializer.rb b/app/serializers/api/uncached_enterprise_serializer.rb index 010348da87..bad8808533 100644 --- a/app/serializers/api/uncached_enterprise_serializer.rb +++ b/app/serializers/api/uncached_enterprise_serializer.rb @@ -1,13 +1,15 @@ -class Api::UncachedEnterpriseSerializer < ActiveModel::Serializer - include SerializerHelper +module Api + class UncachedEnterpriseSerializer < ActiveModel::Serializer + include SerializerHelper - attributes :orders_close_at, :active + attributes :orders_close_at, :active - def orders_close_at - options[:data].earliest_closing_times[object.id] - end + def orders_close_at + options[:data].earliest_closing_times[object.id] + end - def active - options[:data].active_distributors.andand.include? object + def active + options[:data].active_distributors.andand.include? object + end end end