Files
openfoodnetwork/app/serializers/api/enterprise_shopfront_serializer.rb
Maikel Linke 4a0ed99919 Replace Paperclip on Enterprise model
We configured Paperclip to convert images to JPG in some cases but I
omitted that here because we don't need it. If an image is better
represented as PNG or another format then the user should be able to
choose that.

Some specs were also testing the generated URL but the Active Storage
URL doesn't contain a style name anymore and it's not helpful to test
the URL.
2022-06-01 17:16:55 +10:00

148 lines
4.1 KiB
Ruby

# frozen_string_literal: true
# Represents the properties of an Enterprise when viewing the details of listed shopfronts
module Api
class EnterpriseShopfrontSerializer < ActiveModel::Serializer
include SerializerHelper
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, :category,
:active, :producers, :orders_close_at, :hubs, :taxons, :supplied_taxons, :pickup,
:delivery, :preferred_product_low_stock_display
has_one :address, serializer: Api::AddressSerializer
has_many :supplied_properties, serializer: Api::PropertySerializer
has_many :distributed_properties, serializer: Api::PropertySerializer
def orders_close_at
OrderCycle.with_distributor(enterprise).soonest_closing.first&.orders_close_at
end
def active
@active ||=
enterprise.ready_for_checkout? && OrderCycle.active.with_distributor(enterprise).exists?
end
def pickup
shipping_types? :pickup
end
def delivery
shipping_types? :delivery
end
def email_address
enterprise.email_address.to_s.reverse
end
def hash
enterprise.to_param
end
def logo
enterprise.logo_url(:medium)
end
def promo_image
enterprise.promo_image_url(:large)
end
def path
enterprise_shop_path(enterprise)
end
def producers
ActiveModel::ArraySerializer.new(
enterprise.plus_relatives_and_oc_producers(
OrderCycle.not_closed.with_distributor(enterprise)
),
each_serializer: Api::EnterpriseThinSerializer
)
end
def hubs
ActiveModel::ArraySerializer.new(
enterprise.distributors, each_serializer: Api::EnterpriseThinSerializer
)
end
def taxons
taxons = active ? enterprise.current_distributed_taxons : enterprise.distributed_taxons
ActiveModel::ArraySerializer.new(
taxons, each_serializer: Api::TaxonSerializer
)
end
def supplied_taxons
return [] unless enterprise.is_primary_producer
ActiveModel::ArraySerializer.new(
enterprise.supplied_taxons, each_serializer: Api::TaxonSerializer
)
end
def supplied_properties
return [] unless enterprise.is_primary_producer
(product_properties + producer_properties).uniq do |property_object|
property_object.property.presentation
end
end
def distributed_properties
(distributed_product_properties + distributed_producer_properties).uniq do |property_object|
property_object.property.presentation
end
end
def distributed_product_properties
properties = Spree::Property.joins(products: { variants: { exchanges: :order_cycle } })
.merge(Exchange.outgoing)
.merge(Exchange.to_enterprise(enterprise))
.select('DISTINCT spree_properties.*')
return properties.merge(OrderCycle.active) if active
properties
end
def distributed_producer_properties
properties = Spree::Property.joins(
producer_properties: {
producer: { supplied_products: { variants: { exchanges: :order_cycle } } }
}
)
.merge(Exchange.outgoing).merge(Exchange.to_enterprise(enterprise))
.select('DISTINCT spree_properties.*')
return properties.merge(OrderCycle.active) if active
properties
end
private
def product_properties
enterprise.supplied_products.includes(:properties).flat_map(&:properties)
end
def producer_properties
enterprise.properties
end
def enterprise
object
end
def shipping_types?(type)
require_shipping = type == :delivery ? 't' : 'f'
Spree::ShippingMethod.
joins(:distributor_shipping_methods).
where('distributors_shipping_methods.distributor_id = ?', enterprise.id).
where("spree_shipping_methods.require_ship_address = '#{require_shipping}'").exists?
end
end
end