ifd_tools 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md CHANGED
@@ -25,4 +25,5 @@ To install:
25
25
  1. There are several configuration options for color choices in the `ifd_tools.rb` initializer.
26
26
  2. To track specific events, create subclasses of `IfdTools::Tracking::Event` in your application, in `app/models/ifd_tools/tracking` folder.
27
27
  3. Be sure to override the `assign_trackable_item_by_id` method per subclass (default implement is to raise an exception)
28
- 4. Tracking requests can be initiated via the API at `/api/track.xml?type=product_event&id=14`. The `type` parameter is the class name without the module prefixes, underscored -> "IfdTools::Tracking::ProductEvent" should be sent as "product_event".
28
+ 4. Tracking requests can be initiated via the API at `/api/track.xml?type=product_event&id=14`. The `type` parameter is the class name without the module prefixes, underscored -> "IfdTools::Tracking::ProductEvent" should be sent as "product_event".
29
+ 5. Also have "batch tracking" functionality available, which will accept JSON or XML in a request to process multiple entries. Each "event" is id, type and optionally timestamp (UNIX) or platform.
@@ -0,0 +1,8 @@
1
+ xml.instruct!
2
+ xml.response do
3
+ if @error.present?
4
+ xml.error { xml.cdata! @error }
5
+ else
6
+ xml.track @events.count
7
+ end
8
+ end
@@ -0,0 +1,18 @@
1
+ xml.instruct!
2
+ xml.response do
3
+ xml.error { "validations failed" }
4
+ xml.failures do
5
+ @failures.each do |attribute, messages|
6
+ xml.attribute(key: attribute) do
7
+ messages.each do |error|
8
+ xml.message { xml.cdata! error }
9
+ end
10
+ end
11
+ end
12
+ end
13
+ xml.validations do
14
+ @customer.errors.full_messages.uniq.each do |message|
15
+ xml.message { xml.cdata! message }
16
+ end
17
+ end
18
+ end
@@ -4,5 +4,30 @@ class ApiController < ApplicationController
4
4
  respond_to :json, :xml
5
5
 
6
6
  include IfdTools::ApiControllerExtensions
7
+
8
+ # Use this block to initialize the given Customer instance
9
+ # The return value of this block will be assigned back to the
10
+ # @customer ivar, which is used to generate the HTTP response (validations failed, etc)
11
+ #
12
+ # The request must be to "/api/create_customer" and the params namespaced under "params[:customer]"
13
+ # If you have special params that will throw exception if passed to Customer.new(params[:customer]), for example params[:customer][:account_level]
14
+ # then you should move that special attribute outside of the :customer hash & process it separately
15
+ #
16
+ create_customer do |customer|
17
+
18
+ # Notes on parameter
19
+ #
20
+ # "customer" is initially set to this before it is passed into this block
21
+ # "customer" is also available as @customer
22
+ # customer = Customer.new params[:customer]
23
+
24
+ # Example request
25
+ # To make use of some parameter that's not directly an attribute, for example :account_level
26
+ # Just make sure that :account_level is outside of the params[:customer] hash
27
+ #
28
+ # customer.account_level = CustomerAccountLevel.find_by_abbreviation(params[:account_level])
29
+
30
+ customer
31
+ end
7
32
 
8
33
  end
@@ -0,0 +1,44 @@
1
+ module IfdTools
2
+ module ApiController
3
+ module Customers
4
+
5
+ extend ActiveSupport::Concern
6
+
7
+ def create_customer
8
+ if params[:customer]
9
+ @customer = Customer.new params[:customer]
10
+ @customer = instance_exec @customer, &self.class.create_customer_block
11
+ if @customer.valid?
12
+ @customer.save
13
+ respond_to do |format|
14
+ format.json { render json: { success: "Registered" }, status: :ok }
15
+ format.xml { render xml: { success: "Registered" }, status: :ok }
16
+ end
17
+ else
18
+ respond_to do |format|
19
+ @failures = @customer.errors.keys.inject({}) { |failures, key| failures[key] = @customer.errors[key].uniq; failures }
20
+ format.json { render json: { error: "validations failed", validations: @customer.errors.full_messages.uniq, failures: @failures }, status: :unprocessable_entity }
21
+ format.xml { render status: :unprocessable_entity }
22
+ end
23
+ end
24
+ else
25
+ respond_to do |format|
26
+ format.json { render json: { error: "Missing parameters" }, status: :unprocessable_entity }
27
+ format.xml { render xml: { error: "Missing parameters" }, status: :unprocessable_entity }
28
+ end
29
+ end
30
+ end
31
+
32
+ included do
33
+ cattr_accessor :create_customer_block
34
+ end
35
+
36
+ module ClassMethods
37
+ def create_customer(&block)
38
+ self.create_customer_block = block
39
+ end
40
+ end
41
+
42
+ end
43
+ end
44
+ end
@@ -38,6 +38,49 @@ module IfdTools
38
38
  render status: :unprocessable_entity
39
39
  end
40
40
  end
41
+
42
+ # Used to record events from the application, more than one at a time, by submitting a request via JSON or XML
43
+ #
44
+ # Example request stucture:
45
+ # events
46
+ # event
47
+ # type product_event
48
+ # id 14
49
+ # timestamp 1233452 (optional)
50
+ # platform mac (optional)
51
+ #
52
+ def batch_track
53
+
54
+ begin
55
+
56
+ @events = params[:events] || []
57
+ @events.map(&:symbolize_keys!)
58
+ @events.each do |event|
59
+
60
+ case event[:type]
61
+ when "application_event"
62
+ @event = IfdTools::Tracking::ApplicationEvent.new
63
+
64
+ else
65
+ @event = "ifd_tools/tracking/#{event[:type]}".camelize.constantize.new
66
+ @event.assign_trackable_item_by_id(event[:id])
67
+
68
+ end
69
+
70
+ @event.ip_address = request.remote_ip
71
+ @event.customer = current_customer
72
+ @event.platform = event[:platform] || IfdTools::Tracking::Event.platform_for_request(request)
73
+ @event.timestamp = Time.at(event[:timestamp]) || Time.now
74
+ @event.save!
75
+
76
+ end
77
+
78
+ rescue Exception => e
79
+ @error = e.message
80
+ render status: :unprocessable_entity
81
+ end
82
+
83
+ end
41
84
 
42
85
  end
43
86
  end
@@ -1,6 +1,7 @@
1
1
  require 'ifd_tools/api_controller/emergency_messages'
2
2
  require 'ifd_tools/api_controller/software_updates'
3
3
  require 'ifd_tools/api_controller/notifier_updates'
4
+ require 'ifd_tools/api_controller/customers'
4
5
  require 'ifd_tools/api_controller/contact_requests'
5
6
  require 'ifd_tools/api_controller/tracking'
6
7
 
@@ -14,6 +15,7 @@ module IfdTools
14
15
  include IfdTools::ApiController::NotifierUpdates
15
16
  include IfdTools::ApiController::Tracking
16
17
  include IfdTools::ApiController::ContactRequests
18
+ include IfdTools::ApiController::Customers
17
19
  end
18
20
 
19
21
  end
@@ -1,3 +1,3 @@
1
1
  module IfdTools
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ifd_tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-15 00:00:00.000000000 Z
12
+ date: 2012-10-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -298,7 +298,9 @@ files:
298
298
  - app/views/admin/shared/_footer.html.haml
299
299
  - app/views/admin/software_updates/_form.html.haml
300
300
  - app/views/admin/users/_form.html.haml
301
+ - app/views/api/batch_track.builder
301
302
  - app/views/api/contact.builder
303
+ - app/views/api/create_customer.builder
302
304
  - app/views/api/emergency_messages.builder
303
305
  - app/views/api/notifier_updates.builder
304
306
  - app/views/api/software_updates.builder
@@ -344,6 +346,7 @@ files:
344
346
  - lib/ifd_tools/active_admin/base.rb
345
347
  - lib/ifd_tools/active_admin/can_can/action_items.rb
346
348
  - lib/ifd_tools/api_controller/contact_requests.rb
349
+ - lib/ifd_tools/api_controller/customers.rb
347
350
  - lib/ifd_tools/api_controller/emergency_messages.rb
348
351
  - lib/ifd_tools/api_controller/notifier_updates.rb
349
352
  - lib/ifd_tools/api_controller/software_updates.rb