class Firebase::Client

Attributes

auth[R]
request[R]

Public Class Methods

new(base_uri, auth=nil) click to toggle source
# File lib/firebase.rb, line 12
def initialize(base_uri, auth=nil)
  if base_uri !~ URI::regexp(%w(https))
    raise ArgumentError.new('base_uri must be a valid https uri')
  end
  base_uri += '/' unless base_uri.end_with?('/')
  @request = HTTPClient.new({
    :base_url => base_uri,
    :default_header => {
      'Content-Type' => 'application/json'
    }
  })
  if auth && valid_json?(auth)
    # Using Admin SDK service account
    @credentials = Google::Auth::DefaultCredentials.make_creds(
      json_key_io: StringIO.new(auth),
      scope: %w(https://www.googleapis.com/auth/firebase.database https://www.googleapis.com/auth/userinfo.email)
    )
    @credentials.apply!(@request.default_header)
    @expires_at = @credentials.issued_at + 0.95 * @credentials.expires_in
  else
    # Using deprecated Database Secret
    @secret = auth
  end
end

Public Instance Methods

delete(path, query={}) click to toggle source

Deletes the data at path and returs true

# File lib/firebase.rb, line 55
def delete(path, query={})
  process :delete, path, nil, query
end
get(path, query={}) click to toggle source

Returns the data at path

# File lib/firebase.rb, line 44
def get(path, query={})
  process :get, path, nil, query
end
push(path, data, query={}) click to toggle source

Writes the data, returns the key name of the data added

Firebase.push('users', { 'age' => 18}) => {"name":"-INOQPH-aV_psbk3ZXEX"}
# File lib/firebase.rb, line 50
def push(path, data, query={})
  process :post, path, data, query
end
set(path, data, query={}) click to toggle source

Writes and returns the data

Firebase.set('users/info', { 'name' => 'Oscar' }) => { 'name' => 'Oscar' }
# File lib/firebase.rb, line 39
def set(path, data, query={})
  process :put, path, data, query
end
update(path, data, query={}) click to toggle source

Write the data at path but does not delete ommited children. Returns the data

Firebase.update('users/info', { 'name' => 'Oscar' }) => { 'name' => 'Oscar' }
# File lib/firebase.rb, line 61
def update(path, data, query={})
  process :patch, path, data, query
end

Private Instance Methods

process(verb, path, data=nil, query={}) click to toggle source
# File lib/firebase.rb, line 67
def process(verb, path, data=nil, query={})
  if path[0] == '/'
    raise(ArgumentError.new("Invalid path: #{path}. Path must be relative"))
  end

  if @expires_at && Time.now > @expires_at
    @credentials.refresh!
    @credentials.apply! @request.default_header
    @expires_at = @credentials.issued_at + 0.95 * @credentials.expires_in
  end

  Firebase::Response.new @request.request(verb, "#{path}.json", {
    :body             => (data && data.to_json),
    :query            => (@secret ? { :auth => @secret }.merge(query) : query),
    :follow_redirect  => true
  })
end
valid_json?(json) click to toggle source
# File lib/firebase.rb, line 85
def valid_json?(json)
  begin
    JSON.parse(json)
    return true
  rescue JSON::ParserError
    return false
  end
end