class Ponto::BaseResource

Public Class Methods

create_by_uri(uri:, resource_type:, attributes:, access_token:, meta: nil) click to toggle source
# File lib/ponto/api/base_resource.rb, line 3
def self.create_by_uri(uri:, resource_type:, attributes:, access_token:, meta: nil)
  payload = {
    data: {
      type:       resource_type,
      attributes: attributes
    }
  }
  payload[:data][:meta] = meta if meta
  raw_item = Ponto.client.post(uri: uri, payload: payload, access_token: access_token)
  new(raw_item["data"])
end
destroy_by_uri(uri:, access_token:, headers: nil) click to toggle source
# File lib/ponto/api/base_resource.rb, line 39
def self.destroy_by_uri(uri:, access_token:, headers: nil)
  raw_item = Ponto.client.delete(uri: uri, headers: headers, access_token: access_token)
  new(raw_item["data"])
end
find_by_uri(uri:, access_token:, headers: nil) click to toggle source
# File lib/ponto/api/base_resource.rb, line 30
def self.find_by_uri(uri:, access_token:, headers: nil)
  new(find_raw_by_uri(uri: uri, headers: headers, access_token: access_token))
end
find_raw_by_uri(uri:, access_token:, headers: nil) click to toggle source
# File lib/ponto/api/base_resource.rb, line 34
def self.find_raw_by_uri(uri:, access_token:, headers: nil)
  raw_item = Ponto.client.get(uri: uri, headers: headers, access_token: access_token)
  raw_item["data"]
end
list_by_uri(uri:, access_token:, query_params: {}, headers: nil) click to toggle source
# File lib/ponto/api/base_resource.rb, line 15
def self.list_by_uri(uri:, access_token:, query_params: {}, headers: nil)
  raw_response = Ponto.client.get(uri: uri, query_params: query_params, headers: headers, access_token: access_token)
  items        = raw_response["data"].map do |raw_item|
    new(raw_item)
  end
  Ponto::Collection.new(
    klass:                  self,
    items:                  items,
    links:                  raw_response["links"],
    paging:                 raw_response.dig("meta", "paging"),
    synchronized_at:        raw_response.dig("meta", "synchronizedAt"),
    latest_synchronization: raw_response.dig("meta", "latestSynchronization"),
  )
end
new(raw) click to toggle source
Calls superclass method
# File lib/ponto/api/base_resource.rb, line 44
def initialize(raw)
  attributes = prepare_attributes(raw)
  super(attributes)

  relationships = raw["relationships"] || {}
  setup_relationships(relationships)

  links = raw["links"] || {}
  setup_links(links)

  meta = raw["meta"] || {}
end

Public Instance Methods

reload!() click to toggle source
# File lib/ponto/api/base_resource.rb, line 57
def reload!
  reloaded   = self.class.find_raw_by_uri(uri)
  attributes = prepare_attributes(reloaded)
  attributes.each do |key, value|
    self[key] = value
  end
  self
end

Private Instance Methods

prepare_attributes(raw) click to toggle source
# File lib/ponto/api/base_resource.rb, line 68
def prepare_attributes(raw)
  base = {
    "id"  => raw["id"],
  }
  attributes           = raw["attributes"]    || {}
  meta                 = raw["meta"]          || {}
  params               = base.merge(attributes).merge(meta)
  Ponto::Util.underscorize_hash(params)
end
setup_relationships(relationships) click to toggle source
# File lib/ponto/api/base_resource.rb, line 78
def setup_relationships(relationships)
  relationships.each do |key, relationship|
    if relationship["data"]
      klass = Ponto.const_get(Ponto::Util.camelize(key))
      method_name = Ponto::Util.underscore(key)
      define_singleton_method(method_name) do |headers: nil|
        klass.find_by_uri(uri: relationship["links"]["related"], headers: headers)
      end
      self[Ponto::Util.underscore("#{key}_id")] = relationship["data"]["id"]
    else
      singular_key = key[0..-2]
      klass        = Ponto.const_get(Ponto::Util.camelize(singular_key))
      method_name  = Ponto::Util.underscore(key)
      define_singleton_method(method_name) do |headers: nil, **query_params|
        uri = relationship["links"]["related"]
        klass.list_by_uri(uri: uri, headers: headers, query_params: query_params)
      end
    end
  end
end