diaspora/app/presenters/person_presenter.rb
2021-11-23 00:56:41 +01:00

175 lines
4.4 KiB
Ruby

# frozen_string_literal: true
class PersonPresenter < BasePresenter
def base_hash
{
id: id,
guid: guid,
name: name,
diaspora_id: diaspora_handle
}
end
def as_api_json
{
guid: guid,
diaspora_id: diaspora_handle,
name: name,
avatar: AvatarPresenter.new(@presentable).medium
}.compact
end
def full_hash
base_hash_with_contact.merge(
relationship: relationship,
block: is_blocked? ? BlockPresenter.new(current_user_person_block).base_hash : false,
is_own_profile: own_profile?,
show_profile_info: public_details? || own_profile? || person_is_following_current_user
)
end
def profile_hash_as_api_json
if own_profile?
ProfilePresenter.new(profile).as_self_api_json.merge(guid: guid)
else
show_detailed = @presentable.public_details? || person_is_following_current_user
ProfilePresenter.new(profile).as_other_api_json(show_detailed).merge(
guid: guid,
blocked: is_blocked?,
relationship: relationship_detailed,
aspects: aspects_detailed
)
end
end
def as_json(_options={})
full_hash_with_profile
end
def hovercard
full_hash.merge(profile: ProfilePresenter.new(profile).for_hovercard)
end
def metas_attributes
{
keywords: {name: "keywords", content: comma_separated_tags},
description: {name: "description", content: description},
og_title: {property: "og:title", content: title},
og_description: {property: "og:title", content: description},
og_url: {property: "og:url", content: url},
og_image: {property: "og:image", content: image_url},
og_type: {property: "og:type", content: "profile"},
og_profile_username: {property: "og:profile:username", content: name},
og_profile_firstname: {property: "og:profile:first_name", content: first_name},
og_profile_lastname: {property: "og:profile:last_name", content: last_name}
}
end
def self.people_names(people)
people.map(&:name).join(", ")
end
protected
def own_profile?
current_user.try(:person) == @presentable
end
def relationship
return false unless current_user
contact = current_user_person_contact
return :not_sharing unless contact
%i(mutual sharing receiving).find do |status|
contact.public_send("#{status}?")
end || :not_sharing
end
def relationship_detailed
status = {receiving: false, sharing: false}
return status unless current_user
contact = current_user_person_contact
return status unless contact
status.keys.each do |key|
status[key] = contact.public_send("#{key}?")
end
status
end
def aspects_detailed
return [] unless current_user_person_contact
aspects_for_person = current_user.aspects_with_person(@presentable)
aspects_for_person.map {|a| AspectPresenter.new(a).as_api_json(false, with_order: false) }
end
def person_is_following_current_user
return false unless current_user
contact = current_user_person_contact
contact && contact.sharing?
end
def base_hash_with_contact
base_hash.merge(
contact: (!own_profile? && has_contact?) ? contact_hash : false
)
end
def full_hash_with_profile
attrs = full_hash
if attrs[:show_profile_info]
attrs.merge!(profile: ProfilePresenter.new(profile).private_hash)
else
attrs.merge!(profile: ProfilePresenter.new(profile).public_hash)
end
attrs
end
def contact_hash
ContactPresenter.new(current_user_person_contact).full_hash
end
private
def current_user_person_block
@block ||= (current_user ? current_user.block_for(@presentable) : Block.none)
end
def current_user_person_contact
@contact ||= (current_user ? current_user.contact_for(@presentable) : Contact.none)
end
def has_contact?
current_user_person_contact.present?
end
def is_blocked?
current_user_person_block.present?
end
def title
name
end
def comma_separated_tags
profile.tags.map(&:name).join(", ") if profile.tags
end
def url
url_for(@presentable)
end
def description
public_details? ? bio : ""
end
def image_url
return AppConfig.url_to @presentable.image_url if @presentable.image_url[0] == "/"
@presentable.image_url
end
end