Class: ActiveSpy::Rails::Base

Inherits:
Object
  • Object
show all
Defined in:
lib/active_spy/rails/base.rb

Overview

Default template for callbacks handlers.

Instance Method Summary collapse

Constructor Details

#initialize(object) ⇒ Base

Returns a new instance of Base.



12
13
14
15
16
# File 'lib/active_spy/rails/base.rb', line 12

def initialize(object)
  @object = object
  inject_is_new_method(@object)
  @object.is_new = true if @object.new_record?
end

Instance Method Details

#after_createObject

Handles a create callback, prepare and send the request to the event-runner.



50
51
52
53
54
# File 'lib/active_spy/rails/base.rb', line 50

def after_create
  request_params = get_request_params('create')
  prepare_request(request_params)
  send_event_request unless ActiveSpy::Configuration.development_mode
end

#after_destroyObject

Handles an destroy callback, prepare and send the request to the event-runner.



66
67
68
69
70
# File 'lib/active_spy/rails/base.rb', line 66

def after_destroy
  request_params = get_request_params('destroy')
  prepare_request(request_params)
  send_event_request unless ActiveSpy::Configuration.development_mode
end

#after_saveObject

Handles the generic save. Determines which rail action was done, create or update and call the right callback.



43
44
45
46
# File 'lib/active_spy/rails/base.rb', line 43

def after_save
  action = get_action('save')
  send("after_#{action}")
end

#after_updateObject

Handles an update callback, prepare and send the request to the event-runner.



58
59
60
61
62
# File 'lib/active_spy/rails/base.rb', line 58

def after_update
  request_params = get_request_params('update')
  prepare_request(request_params)
  send_event_request unless ActiveSpy::Configuration.development_mode
end

#get_action(real_method) ⇒ Object

Returns the correct action for the method called in the model.



131
132
133
134
135
136
137
# File 'lib/active_spy/rails/base.rb', line 131

def get_action(real_method)
  if real_method == 'save'
    return 'create' if @object.is_new?
    return 'update'
  end
  'destroy'
end

#get_request_params(action) ⇒ Object

Get the event request params for a given method.



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/active_spy/rails/base.rb', line 107

def get_request_params(action)
  # real_method = method.to_s.split('_').last
  # action = get_action(real_method)
  {
    type:     @object.class.name,
    actor:    @object.instance_variable_get('@actor'),
    realm:    @object.instance_variable_get('@realm'),
    payload:  @object.payload_for(action),
    action:   action
  }
end

#inject_is_new_method(object) ⇒ Object

Inject an attribute in the object, called is_new? and a setter for it.



28
29
30
31
32
33
34
35
36
37
38
# File 'lib/active_spy/rails/base.rb', line 28

def inject_is_new_method(object)
  object.instance_eval do
    def is_new=(value)
      @is_new = value
    end

    def is_new?
      @is_new
    end
  end
end

#prepare_request(request_params) ⇒ Object

Prepare a request with request_params, validates the request and remove the injected is_mew_method, because it’s not needed anymore.



75
76
77
78
79
# File 'lib/active_spy/rails/base.rb', line 75

def prepare_request(request_params)
  @event_json = { event: request_params }.to_json
  ActiveSpy::Rails::Validation::Event.new(@event_json).validate! unless ActiveSpy::Configuration.skip_validations
  remove_is_new_method(@object)
end

#remove_is_new_method(object) ⇒ Object

Remove a previously added is_new attribute from a given object.



121
122
123
124
125
126
127
# File 'lib/active_spy/rails/base.rb', line 121

def remove_is_new_method(object)
  object.instance_eval do
    undef :is_new=
    undef :is_new?
    instance_variable_set(:@is_new, nil)
  end
end

#respond_to?(method) ⇒ Boolean

Overriding to avoid sending the object to server 2 times (in both before and after callabcks).

Returns:

  • (Boolean)


21
22
23
# File 'lib/active_spy/rails/base.rb', line 21

def respond_to?(method)
  method.include?('after_')
end

#send_event_requestObject

Sends the event request to the configured event-runner instance.



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/active_spy/rails/base.rb', line 83

def send_event_request
  response    = nil
  host        = ActiveSpy::Configuration.event_host
  port        = ActiveSpy::Configuration.event_port
  verify_ssl  = ActiveSpy::Configuration.event_verify_ssl
  url         = "#{host}:#{port}/events"

  params = { headers: { content_type: :json }, method: :post, url: url, payload: @event_json }
  params[:verify_ssl] = verify_ssl if verify_ssl

  begin
    response = RestClient::Request.execute(params)
  rescue => e
    ::Rails.logger.info(e.response)
  end
  if response && defined?(Rails) && !ActiveSpy::Configuration.development_mode
    ::Rails.logger.info('[SPY] Event sent to event-runner.')
    ::Rails.logger.info("[SPY] Event-runner response code: #{response.code}")
    ::Rails.logger.info("[SPY] Event-runner response: #{response.body}")
  end
end