module Trophonius::Connection

Public Class Methods

connect() click to toggle source

Creates a new connection to FileMaker

@return [String] the token used to connect with the FileMaker data api

# File lib/trophonius_connection.rb, line 12
def self.connect
  if Trophonius.config.redis_connection
    Trophonius::RedisManager.set_key(key: 'token', value: setup_connection)
    Trophonius::RedisManager.set_key(key: 'last_connection', value: Time.now)
    token = Trophonius::RedisManager.get_key(key: 'token')
    token
  else
    @token = setup_connection
    @last_connection = Time.now
    @token
  end
end
disconnect() click to toggle source

Disconnects from the FileMaker server

# File lib/trophonius_connection.rb, line 85
def self.disconnect
  url =
    URI(
      URI.escape(
        "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
          Trophonius.config.database
        }/sessions/#{Trophonius.config.redis_connection ? Trophonius::RedisManager.get_key(key: 'token') : @token}"
      )
    )
  ssl_verifyhost = Trophonius.config.local_network ? 0 : 2
  ssl_verifypeer = !Trophonius.config.local_network

  request =
    Typhoeus::Request.new(
      url,
      method: :delete,
      params: {},
      ssl_verifyhost: ssl_verifyhost,
      ssl_verifypeer: ssl_verifypeer,
      headers: { 'Content-Type' => 'application/json' }
    )
  temp = request.run

  begin
    parsed = JSON.parse(temp.response_body)
  rescue Exception => e
    Error.throw_error('1631')
  end
  Error.throw_error(parsed['messages'][0]['code']) if parsed['messages'][0]['code'] != '0'
  Trophonius::RedisManager.disconnect! if Trophonius.config.redis_connection
  @token = nil
  @last_connection = nil
  return true
end
last_connection() click to toggle source

Returns the receive time of the last received token @return [Time] Returns the receive time of the last received token

# File lib/trophonius_connection.rb, line 130
def self.last_connection
  last = Trophonius.config.redis_connection ? Trophonius::RedisManager.get_key(key: 'last_connection') : nil
  last = last.nil? ? nil : Time.parse(last)
  Trophonius.config.redis_connection ? last : @last_connection
end
setup_connection() click to toggle source

Creates and runs a HTTP request to create a new data api connection This method throws an error when the request returns with a HTTP error or a FileMaker error @return [String] the token used to connect with the FileMaker data api if successful

# File lib/trophonius_connection.rb, line 30
def self.setup_connection
  if Trophonius.config.redis_connection
    Trophonius::RedisManager.set_key(key: 'token', value: '')
    Trophonius::RedisManager.set_key(key: 'last_connection', value: nil)
  else
    @token = ''
  end
  ssl_verifyhost = Trophonius.config.local_network ? 0 : 2
  ssl_verifypeer = !Trophonius.config.local_network
  url =
    URI(
      URI.escape(
        "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{Trophonius.config.database}/sessions"
      )
    )
  request =
    Typhoeus::Request.new(
      url,
      method: :post,
      body:
        if Trophonius.config.external_name.empty?
          {}
        else
          {
            fmDataSource: [
              {
                database: Trophonius.config.external_name,
                username: Trophonius.config.external_username,
                password: Trophonius.config.external_password
              }
            ]
          }.to_json
        end,
      params: {},
      ssl_verifyhost: ssl_verifyhost,
      ssl_verifypeer: ssl_verifypeer,
      headers: {
        'Content-Type' => 'application/json',
        Authorization: "Basic #{Base64.strict_encode64("#{Trophonius.config.username}:#{Trophonius.config.password}")}"
      }
    )
  temp = request.run

  begin
    parsed = JSON.parse(temp.response_body)
  rescue Exception => e
    Error.throw_error('1631')
  end
  Error.throw_error(parsed['messages'][0]['code']) if parsed['messages'][0]['code'] != '0'
  return parsed['response']['token']
end
test_connection() click to toggle source

Tests whether the FileMaker token is still valid @return [Boolean] True if the token is valid False if invalid

# File lib/trophonius_connection.rb, line 139
def self.test_connection
  url =
    URI(
      URI.escape(
        "http#{Trophonius.config.ssl == true ? 's' : ''}://#{Trophonius.config.host}/fmi/data/v1/databases/#{
          Trophonius.config.database
        }/layouts/#{Trophonius.config.layout_name}/records?_limit=1"
      )
    )
  begin
    request =
      Typhoeus::Request.new(
        url,
        method: :get, body: {}, params: {}, headers: { 'Content-Type' => 'application/json', Authorization: "Bearer #{@token}" }
      )
    temp = request.run
    JSON.parse(temp.response_body)['messages'][0]['code'] == '0'
  rescue StandardError
    return false
  end
end
token() click to toggle source

Returns the last received token @return [String] the last valid token used to connect with the FileMaker data api

# File lib/trophonius_connection.rb, line 123
def self.token
  return Trophonius.config.redis_connection ? Trophonius::RedisManager.get_key(key: 'token') : @token
end
valid_connection?() click to toggle source

Returns whether the current connection is still valid @return [Boolean] True if the connection is valid False if invalid

# File lib/trophonius_connection.rb, line 164
def self.valid_connection?
  if Trophonius.config.layout_name != '' && test_connection == false
    false
  else
    last_connection.nil? ? false : (((Time.now - last_connection) / 60).round <= 15 || test_connection)
  end
end