module ZuoraConnect::Controllers::Helpers
def create_new_instance
def create_new_instance ZuoraConnect::AppInstance.read_master_db do Thread.current[:appinstance] = nil ZuoraConnect.logger.with_fields = {} if ZuoraConnect.logger.is_a?(Ougai::Logger) Rails.logger.with_fields = {} if Rails.logger.is_a?(Ougai::Logger) if defined?(ElasticAPM) && ElasticAPM.running? && ElasticAPM.respond_to?(:set_label) ElasticAPM.set_label(:trace_id, request.uuid) end zuora_host = request.headers['zuora-host'] zuora_entity_id = (request.headers['zuora-entity-ids'] || '').gsub( '-', '' ).split(',').first # Validate host present if zuora_host.blank? render json: { status: 401, message: 'zuora-host header was not supplied.' }, status: :unauthorized return end # Validate entity-ids present if zuora_entity_id.blank? render json: { status: 401, message: 'zuora-entity-ids header was not supplied.' }, status: :unauthorized return end rest_domain = ZuoraAPI::Login.new(url: "https://#{zuora_host}").rest_domain app_instance_id = ZuoraConnect::AppInstance.where( 'zuora_entity_ids ?& array[:entities] AND zuora_domain = :host', entities: [zuora_entity_id], host: rest_domain ).pluck(:id).first if app_instance_id.present? render json: { status: 409, message: 'Instance already exists.', app_instance_id: app_instance_id }, status: 409 else Apartment::Tenant.switch!("public") retry_count = 3 begin @appinstance = new_instance( next_instance_id, zuora_entity_id, rest_domain, tenant_id: request.headers['zuora-tenant-id'], retry_count: retry_count ) rescue ActiveRecord::RecordNotUnique retry if (retry_count -= 1).positive? return end app_instance_id = @appinstance.id end begin Apartment::Tenant.switch!('public') Apartment::Tenant.create(app_instance_id.to_s) rescue Apartment::TenantExists ZuoraConnect.logger.debug('Tenant Already Exists') end end end