Files
openfoodnetwork/app/serializers/api/enterprise_serializer.rb
Maikel Linke 4feb7c893b Introduce contact email address for enterprises
Add a new column email_address to enterprises.
Use this new field for public display of contact details.
The old field enterprise.email is still used internally.
It is still displayed on orders and emails sent to customers.
A new enterprise has the owner's email address by default now.

Fix GH #757
2016-02-24 15:14:07 +11:00

146 lines
3.6 KiB
Ruby

class Api::EnterpriseSerializer < ActiveModel::Serializer
# We reference this here because otherwise the serializer complains about its absence
Api::IdSerializer
def serializable_hash
cached_serializer_hash.merge uncached_serializer_hash
end
private
def cached_serializer_hash
Api::CachedEnterpriseSerializer.new(object, @options).serializable_hash || {}
end
def uncached_serializer_hash
Api::UncachedEnterpriseSerializer.new(object, @options).serializable_hash || {}
end
end
class Api::UncachedEnterpriseSerializer < ActiveModel::Serializer
attributes :orders_close_at, :active
def orders_close_at
options[:data].earliest_closing_times[object.id]
end
def active
options[:data].active_distributors.andand.include? object
end
end
class Api::CachedEnterpriseSerializer < ActiveModel::Serializer
cached
#delegate :cache_key, to: :object
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
def taxons
ids_to_objs options[:data].distributed_taxons[object.id]
end
def supplied_taxons
ids_to_objs options[:data].supplied_taxons[object.id]
end
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
# 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 ids_to_objs(ids)
return [] if ids.blank?
ids.map { |id| {id: id} }
end
end