# frozen_string_literal: true module Yext module Api module Concerns # Because the Account is listed in the API documentation in two locations, there are two # different but somewhat identical Account objects. # # This module includes the shared code between the two. module AccountRelations extend ActiveSupport::Concern # The module AccountChild will add these relations if they are missing, but if they are # listed explicitly it is more efficient. included do # AdministrativeApi has_many :add_requests, class_name: "Yext::Api::AdministrativeApi::AddRequest", uri: Yext::Api::Concerns::AccountChild.with_account_path("addrequests/(:id)") has_many :services, class_name: "Yext::Api::AdministrativeApi::Service" # KnowledgeApi::KnowledgeManager has_many :locations, class_name: "Yext::Api::KnowledgeApi::KnowledgeManager::Location" # KnowledgeApi::AccountSettings has_many :users, class_name: "Yext::Api::KnowledgeApi::AccountSettings::User" has_many :roles, class_name: "Yext::Api::KnowledgeApi::AccountSettings::Role" # KnowledgeApi::OptimizationTasks has_many :optimization_tasks, class_name: "Yext::Api::KnowledgeApi::OptimizationTasks::OptimizationTask", uri: Yext::Api::Concerns::AccountChild.with_account_path("optimizationtasks/(:id)") has_many :optimization_links, class_name: "Yext::Api::KnowledgeApi::OptimizationTasks::OptimizationLink", uri: Yext::Api::Concerns::AccountChild.with_account_path("optimizationlink") # KnowledgeApi::Powerlistings has_many :listings, class_name: "Yext::Api::KnowledgeApi::Powerlistings::Listing", uri: Yext::Api::Concerns::AccountChild.with_account_path("powerlistings/listings/(:id)") has_many :publishers, class_name: "Yext::Api::KnowledgeApi::Powerlistings::Publisher", uri: Yext::Api::Concerns::AccountChild.with_account_path("powerlistings/publishers/(:id)") # LiveApi has_many :live_locations, class_name: "Yext::Api::LiveApi::Location" after_save :save_account_id end # rubocop:disable Naming/MethodName # Yext field names don't match the Ruby naming standard, this is the field name they use. # Because I use `account_id` in the route, I need that attribute defined. Because # Yext uses accountId, when it is set, I need to set `account_id` so they will match. def accountId=(value) super attributes[:account_id] ||= value end # rubocop:enable Naming/MethodName private def save_account_id attributes[:account_id] = accountId end class_methods do def association?(klass) associations.key?(Yext::Api::Concerns::AccountChild.association_name(klass).to_sym) end end end end end end