module Ecoportal module API class Internal # @attr account [Account, nil] the account of the person or `nil` if missing. class Person < V1::Person class_resolver :person_details_class, "Ecoportal::API::Internal::PersonDetails" class_resolver :person_account_class, "Ecoportal::API::Internal::Account" embeds_one :account, nullable: true, klass: :person_account_class def as_json super.update("account" => account&.as_json) end # Sets the Account to the person, depending on the paramter received: # - `nil`: blanks the account. # - `Account`: sets a copy of the object param as account. # - `Hash`: slices the properties of `Account`. # @note this method does not make dirty the account (meaning that `as_json` will be an empty hash `{}`) # @param value [nil, Account, Hash] value to be set. # @return [nil, Account] the resulting `Account` set to the person. def account=(value) case value when NilClass doc["account"] = nil when Internal::Account doc["account"] = JSON.parse(value.to_json) when Hash # TODO: # => missing send_invites # => better use an Internal::Account::PROPERTIES const for this kind of stuff doc["account"] = value.slice(%w[policy_group_ids landing_page_id permissions_preset permissions_custom preferences prefilter filter_tags login_provider_ids starred_ids]) else # TODO raise "Invalid set on account: Need nil, Account or Hash; got #{value.class}" end remove_instance_variable("@account") if defined?(@account) return account end # Adds an empty account to the person. # @note if the person exists, and does not have an account, an this will send an invite. # @note this will **not** change the account properties of this person. def add_account self.account = {} end end end end end