Class: Billomat::Models::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/billomat/models/base.rb

Overview

This class is the base for all other models (resources). It handles the communication with the gateway to talk to the API.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(data = {}) ⇒ Billomat::Models::Base

Initializes a new model.

rubocop:disable Style/OpenStructUse because of the convenient

dynamic data access

Parameters:

  • data (Hash) (defaults to: {})

    the attributes of the object


36
37
38
# File 'lib/billomat/models/base.rb', line 36

def initialize(data = {})
  @data = OpenStruct.new(data)
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

All values in the @data hash can be accessed like a ‘normal’ method.

Examples:

invoice = Billomat::Models::Invoice.new(invoice_number: '123')
invoice.invoice_number
#=> '123'

116
117
118
119
120
# File 'lib/billomat/models/base.rb', line 116

def method_missing(method, *args, &block)
  return @data[method] if @data.to_h.key?(method)

  super
end

Instance Attribute Details

#dataObject

Returns the value of attribute data.


8
9
10
# File 'lib/billomat/models/base.rb', line 8

def data
  @data
end

Class Method Details

.find(id) ⇒ Billomat::Models::Base?

Tries to find the resource for the given id.

Parameters:

  • id (String)

    the resource id

Returns:


14
15
16
17
18
19
# File 'lib/billomat/models/base.rb', line 14

def self.find(id)
  return nil if id.nil?

  resp = Billomat::Gateway.new(:get, "#{base_path}/#{id}").run
  new(resp[resource_name])
end

.where(hash = {}) ⇒ Array<Billomat::Models::Base>

Allows to query for a record.

Parameters:

  • hash (Hash) (defaults to: {})

    the query parameters

Returns:


25
26
27
# File 'lib/billomat/models/base.rb', line 25

def self.where(hash = {})
  Billomat::Search.new(self, hash).run
end

Instance Method Details

#as_json(_options = nil) ⇒ Hash

Returns the object with the right JSON structure.

Returns:

  • (Hash)

    the objects data


106
107
108
# File 'lib/billomat/models/base.rb', line 106

def as_json(_options = nil)
  @data.to_h
end

#createTrueClass Also known as: create!

rubocop:disable Style/OpenStructUse because of the convenient

dynamic data access

Returns:

  • (TrueClass)

56
57
58
59
60
61
62
63
64
# File 'lib/billomat/models/base.rb', line 56

def create
  resp = Billomat::Gateway.new(
    :post, self.class.base_path, wrapped_data
  ).run

  @data = OpenStruct.new(resp[self.class.resource_name])

  true
end

#deleteTrueClass Also known as: delete!

Returns:

  • (TrueClass)

79
80
81
82
83
84
# File 'lib/billomat/models/base.rb', line 79

def delete
  path = "#{self.class.base_path}/#{id}"
  Billomat::Gateway.new(:delete, path).run

  true
end

#idString?

Returns the object’s ID.

Returns:

  • (String, nil)

    the object’s ID


88
89
90
# File 'lib/billomat/models/base.rb', line 88

def id
  @data['id'] || nil
end

#respond_to_missing?(method, include_privat = false) ⇒ TrueClass, FalseClass

Necessary for method_missing.

Parameters:

  • method (Symbol)

    The method name

  • include_privat (TrueClass, FalseClass) (defaults to: false)

Returns:

  • (TrueClass, FalseClass)

127
128
129
# File 'lib/billomat/models/base.rb', line 127

def respond_to_missing?(method, include_privat = false)
  @data.to_h.key?(method.to_s) || super
end

#saveTrueClass Also known as: save!

Persists the current object in the API. When record is new it calls create, otherwise it saves the object.

Returns:

  • (TrueClass)

45
46
47
48
49
# File 'lib/billomat/models/base.rb', line 45

def save
  return create if id.nil?

  update
end

#updateTrueClass Also known as: update!

Returns:

  • (TrueClass)

69
70
71
72
73
74
75
# File 'lib/billomat/models/base.rb', line 69

def update
  path = "#{self.class.base_path}/#{id}"
  resp = Billomat::Gateway.new(:put, path, wrapped_data).run
  @data = resp[self.class.resource_name]

  true
end

#wrapped_dataHash

Wraps the data so the API accepts the request.

Examples:

some_invoice.wrapped_data
#=> { "invoice" => { "id" => "12345"  } }

Returns:

  • (Hash)

    the wrapped data


99
100
101
# File 'lib/billomat/models/base.rb', line 99

def wrapped_data
  { self.class.resource_name => @data.to_h }
end