spree_api 1.0.7 → 1.1.0.rc1

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.
Files changed (87) hide show
  1. data/.gitignore +17 -0
  2. data/Gemfile +6 -0
  3. data/LICENSE +19 -23
  4. data/README.md +22 -10
  5. data/Rakefile +30 -0
  6. data/app/controllers/spree/api/v1/base_controller.rb +71 -0
  7. data/app/controllers/spree/api/v1/images_controller.rb +46 -0
  8. data/app/controllers/spree/api/v1/line_items_controller.rb +40 -0
  9. data/app/controllers/spree/api/v1/orders_controller.rb +53 -0
  10. data/app/controllers/spree/api/v1/products_controller.rb +46 -0
  11. data/app/controllers/spree/api/v1/variants_controller.rb +56 -0
  12. data/app/helpers/spree/api/api_helpers.rb +44 -0
  13. data/app/models/spree/line_item_decorator.rb +3 -0
  14. data/app/models/spree/option_value_decorator.rb +5 -0
  15. data/app/models/spree/order_decorator.rb +12 -0
  16. data/app/models/spree/user_decorator.rb +11 -0
  17. data/app/views/spree/api/v1/errors/invalid_api_key.rabl +2 -0
  18. data/app/views/spree/api/v1/errors/invalid_resource.rabl +3 -0
  19. data/app/views/spree/api/v1/errors/must_specify_api_key.rabl +2 -0
  20. data/app/views/spree/api/v1/errors/not_found.rabl +2 -0
  21. data/app/views/spree/api/v1/errors/unauthorized.rabl +2 -0
  22. data/app/views/spree/api/v1/images/show.rabl +2 -0
  23. data/app/views/spree/api/v1/line_items/new.rabl +3 -0
  24. data/app/views/spree/api/v1/line_items/show.rabl +5 -0
  25. data/app/views/spree/api/v1/orders/address.rabl +0 -0
  26. data/app/views/spree/api/v1/orders/cart.rabl +0 -0
  27. data/app/views/spree/api/v1/orders/complete.rabl +0 -0
  28. data/app/views/spree/api/v1/orders/could_not_transition.rabl +3 -0
  29. data/app/views/spree/api/v1/orders/delivery.rabl +3 -0
  30. data/app/views/spree/api/v1/orders/index.rabl +7 -0
  31. data/app/views/spree/api/v1/orders/invalid_shipping_method.rabl +2 -0
  32. data/app/views/spree/api/v1/orders/payment.rabl +0 -0
  33. data/app/views/spree/api/v1/orders/show.rabl +3 -0
  34. data/app/views/spree/api/v1/products/index.rabl +8 -0
  35. data/app/views/spree/api/v1/products/new.rabl +3 -0
  36. data/app/views/spree/api/v1/products/product.rabl +1 -0
  37. data/app/views/spree/api/v1/products/show.rabl +21 -0
  38. data/app/views/spree/api/v1/variants/index.rabl +3 -0
  39. data/app/views/spree/api/v1/variants/new.rabl +2 -0
  40. data/app/views/spree/api/v1/variants/show.rabl +3 -0
  41. data/app/views/spree/api/v1/variants/variant.rabl +1 -0
  42. data/config/locales/en.yml +11 -15
  43. data/config/routes.rb +14 -28
  44. data/db/migrate/{20100107141738_add_api_key_to_users.rb → 20100107141738_add_api_key_to_spree_users.rb} +1 -1
  45. data/lib/spree/api.rb +7 -4
  46. data/lib/spree/api/controller_setup.rb +27 -0
  47. data/lib/spree/api/engine.rb +3 -13
  48. data/lib/spree/api/version.rb +5 -0
  49. data/lib/spree_api.rb +0 -2
  50. data/script/rails +5 -0
  51. data/spec/controllers/spree/api/v1/base_controller_spec.rb +29 -0
  52. data/spec/controllers/spree/api/v1/images_controller_spec.rb +50 -0
  53. data/spec/controllers/spree/api/v1/line_items_controller_spec.rb +77 -0
  54. data/spec/controllers/spree/api/v1/orders_controller_spec.rb +148 -0
  55. data/spec/controllers/spree/api/v1/products_controller_spec.rb +159 -0
  56. data/spec/controllers/spree/api/v1/variants_controller_spec.rb +90 -0
  57. data/spec/fixtures/thinking-cat.jpg +0 -0
  58. data/spec/models/spree/order_spec.rb +18 -0
  59. data/spec/models/spree/user_spec.rb +19 -0
  60. data/spec/spec_helper.rb +28 -0
  61. data/spec/support/api_helpers.rb +68 -0
  62. data/spec/support/controller_hacks.rb +27 -0
  63. data/spree_api.gemspec +24 -0
  64. metadata +123 -56
  65. data/app/assets/javascripts/admin/spree.js +0 -4
  66. data/app/assets/javascripts/admin/spree_api.js +0 -2
  67. data/app/assets/javascripts/store/spree.js +0 -4
  68. data/app/assets/javascripts/store/spree_api.js +0 -2
  69. data/app/assets/stylesheets/admin/spree.css +0 -6
  70. data/app/assets/stylesheets/admin/spree_api.css +0 -4
  71. data/app/assets/stylesheets/store/spree.css +0 -6
  72. data/app/assets/stylesheets/store/spree_api.css +0 -4
  73. data/app/controllers/spree/admin/users_controller_decorator.rb +0 -17
  74. data/app/controllers/spree/api/base_controller.rb +0 -172
  75. data/app/controllers/spree/api/countries_controller.rb +0 -3
  76. data/app/controllers/spree/api/inventory_units_controller.rb +0 -18
  77. data/app/controllers/spree/api/line_items_controller.rb +0 -20
  78. data/app/controllers/spree/api/orders_controller.rb +0 -19
  79. data/app/controllers/spree/api/products_controller.rb +0 -14
  80. data/app/controllers/spree/api/shipments_controller.rb +0 -35
  81. data/app/controllers/spree/api/states_controller.rb +0 -8
  82. data/app/models/line_item_decorator.rb +0 -7
  83. data/app/models/order_decorator.rb +0 -9
  84. data/app/models/shipment_decorator.rb +0 -9
  85. data/app/models/user_decorator.rb +0 -19
  86. data/app/overrides/api_admin_user_edit_form.rb +0 -6
  87. data/app/views/spree/admin/users/_api_fields.html.erb +0 -16
@@ -1,6 +0,0 @@
1
- /*
2
- *= require admin/spree_core
3
- *= require admin/spree_auth
4
- *= require admin/spree_api
5
- *= require admin/spree_promo
6
- */
@@ -1,4 +0,0 @@
1
- /*
2
- *= require admin/spree_core
3
- *= require admin/spree_auth
4
- */
@@ -1,6 +0,0 @@
1
- /*
2
- *= require store/spree_core
3
- *= require store/spree_auth
4
- *= require store/spree_api
5
- *= require store/spree_promo
6
- */
@@ -1,4 +0,0 @@
1
- /*
2
- *= require store/spree_core
3
- *= require store/spree_auth
4
- */
@@ -1,17 +0,0 @@
1
- Spree::Admin::UsersController.class_eval do
2
- before_filter :load_roles, :only => [:edit, :new, :update, :create, :generate_api_key, :clear_api_key]
3
-
4
- def generate_api_key
5
- if @user.generate_api_key!
6
- flash.notice = t('api.key_generated')
7
- end
8
- redirect_to edit_admin_user_path(@user)
9
- end
10
-
11
- def clear_api_key
12
- if @user.clear_api_key!
13
- flash.notice = t('api.key_cleared')
14
- end
15
- redirect_to edit_admin_user_path(@user)
16
- end
17
- end
@@ -1,172 +0,0 @@
1
- class Spree::Api::BaseController < Spree::BaseController
2
- before_filter :check_http_authorization
3
- before_filter :load_resource
4
- skip_before_filter :verify_authenticity_token, :if => lambda { admin_token_passed_in_headers }
5
-
6
- respond_to :json
7
-
8
- def index
9
- respond_with(@collection) do |format|
10
- format.json { render :json => @collection.to_json(collection_serialization_options) }
11
- end
12
- end
13
-
14
- def show
15
- respond_with(@object) do |format|
16
- format.json { render :json => @object.to_json(object_serialization_options) }
17
- end
18
- end
19
-
20
- def create
21
- if @object.save
22
- render :text => "Resource created\n", :status => 201, :location => object_url
23
- else
24
- respond_with(@object.errors, :status => 422)
25
- end
26
- end
27
-
28
- def update
29
- if @object.update_attributes(params[object_name])
30
- render :nothing => true
31
- else
32
- respond_with(@object.errors, :status => 422)
33
- end
34
- end
35
-
36
- def admin_token_passed_in_headers
37
- request.headers['HTTP_AUTHORIZATION'].present?
38
- end
39
-
40
- def access_denied
41
- render :text => 'access_denied', :status => 401
42
- end
43
-
44
- # Generic action to handle firing of state events on an object
45
- def event
46
- valid_events = model_class.state_machine.events.map(&:name)
47
- valid_events_for_object = @object ? @object.state_transitions.map(&:event) : []
48
-
49
- if params[:e].blank?
50
- errors = t('api.errors.missing_event')
51
- elsif valid_events_for_object.include?(params[:e].to_sym)
52
- @object.send("#{params[:e]}!")
53
- errors = nil
54
- elsif valid_events.include?(params[:e].to_sym)
55
- errors = t('api.errors.invalid_event_for_object', :events => valid_events_for_object.join(','))
56
- else
57
- errors = t('api.errors.invalid_event', :events => valid_events.join(','))
58
- end
59
-
60
- respond_to do |wants|
61
- wants.json do
62
- if errors.blank?
63
- render :nothing => true
64
- else
65
- render :json => errors.to_json, :status => 422
66
- end
67
- end
68
- end
69
- end
70
-
71
- protected
72
- def model_class
73
- "Spree::#{controller_name.classify}".constantize
74
- end
75
-
76
- def object_name
77
- controller_name.singularize
78
- end
79
-
80
- def load_resource
81
- if member_action?
82
- @object ||= load_resource_instance
83
- instance_variable_set("@#{object_name}", @object)
84
- else
85
- @collection ||= collection
86
- instance_variable_set("@#{controller_name}", @collection)
87
- end
88
- end
89
-
90
- def load_resource_instance
91
- if new_actions.include?(params[:action].to_sym)
92
- build_resource
93
- elsif params[:id]
94
- find_resource
95
- end
96
- end
97
-
98
- def parent
99
- nil
100
- end
101
-
102
- def find_resource
103
- if parent.present?
104
- parent.send(controller_name).find(params[:id])
105
- else
106
- model_class.includes(eager_load_associations).find(params[:id])
107
- end
108
- end
109
-
110
- def build_resource
111
- if parent.present?
112
- parent.send(controller_name).build(params[object_name])
113
- else
114
- model_class.new(params[object_name])
115
- end
116
- end
117
-
118
- def collection
119
- return @search unless @search.nil?
120
- params[:search] = {} if params[:search].blank?
121
- params[:search][:meta_sort] = 'created_at.desc' if params[:search][:meta_sort].blank?
122
-
123
- scope = parent.present? ? parent.send(controller_name) : model_class.scoped
124
-
125
- @search = scope.metasearch(params[:search]).relation.limit(100)
126
- @search
127
- end
128
-
129
- def collection_serialization_options
130
- {}
131
- end
132
-
133
- def object_serialization_options
134
- {}
135
- end
136
-
137
- def eager_load_associations
138
- nil
139
- end
140
-
141
- def object_errors
142
- {:errors => object.errors.full_messages}
143
- end
144
-
145
- def object_url(object = nil, options = {})
146
- target = object ? object : @object
147
- if parent.present?
148
- send "admin_#{parent[:model_name]}_#{object_name}_url", parent, target, options
149
- else
150
- send "admin_#{object_name}_url", target, options
151
- end
152
- end
153
-
154
- def collection_actions
155
- [:index]
156
- end
157
-
158
- def member_action?
159
- !collection_actions.include? params[:action].to_sym
160
- end
161
-
162
- def new_actions
163
- [:new, :create]
164
- end
165
-
166
- private
167
- def check_http_authorization
168
- if request.headers['HTTP_AUTHORIZATION'].blank?
169
- render :text => "Access Denied\n", :status => 401
170
- end
171
- end
172
- end
@@ -1,3 +0,0 @@
1
- class Spree::Api::CountriesController < Spree::Api::BaseController
2
- before_filter :access_denied, :except => [:index, :show]
3
- end
@@ -1,18 +0,0 @@
1
- class Spree::Api::InventoryUnitsController < Spree::Api::BaseController
2
- private
3
- def parent
4
- if params[:order_id]
5
- @parent = Spree::Order.find_by_param(params[:order_id])
6
- elsif params[:shipment_id]
7
- @parent = Spree::Shipment.find_by_param(params[:shipment_id])
8
- end
9
- end
10
-
11
- def parent_data
12
- [params[:order_id], params[:shipment_id]].compact
13
- end
14
-
15
- def eager_load_associations
16
- [:variant]
17
- end
18
- end
@@ -1,20 +0,0 @@
1
- class Spree::Api::LineItemsController < Spree::Api::BaseController
2
- private
3
- def parent
4
- if params[:order_id]
5
- @parent ||= Spree::Order.find_by_param(params[:order_id])
6
- end
7
- end
8
-
9
- def parent_data
10
- params[:order_id]
11
- end
12
-
13
- def collection_serialization_options
14
- { :include => [:variant], :methods => [:description] }
15
- end
16
-
17
- def object_serialization_options
18
- collection_serialization_options
19
- end
20
- end
@@ -1,19 +0,0 @@
1
- class Spree::Api::OrdersController < Spree::Api::BaseController
2
- before_filter :access_denied, :except => [:index, :show]
3
- authorize_resource :class => Spree::Order
4
-
5
- private
6
- def find_resource
7
- Spree::Order.find_by_param(params[:id])
8
- end
9
-
10
- def object_serialization_options
11
- { :include => {
12
- :bill_address => { :include => [:country, :state] },
13
- :ship_address => { :include => [:country, :state] },
14
- :shipments => { :include => [:shipping_method, :address] },
15
- :line_items => { :include => [:variant] }
16
- }
17
- }
18
- end
19
- end
@@ -1,14 +0,0 @@
1
- class Spree::Api::ProductsController < Spree::Api::BaseController
2
- include Spree::Core::Search
3
-
4
- private
5
- def collection
6
- params[:per_page] ||= 100
7
- @searcher = Spree::Config.searcher_class.new(params)
8
- @collection = @searcher.retrieve_products
9
- end
10
-
11
- def object_serialization_options
12
- { :include => [:master, :variants, :taxons] }
13
- end
14
- end
@@ -1,35 +0,0 @@
1
- class Spree::Api::ShipmentsController < Spree::Api::BaseController
2
- private
3
- def parent
4
- if params[:order_id]
5
- @parent ||= Spree::Order.find_by_param(params[:order_id])
6
- end
7
- end
8
-
9
- def collection_serialization_options
10
- { :include => { :shipping_method => {}, :address => {}, :inventory_units => { :include => :variant } },
11
- :except => [:shipping_method_id, :address_id] }
12
- end
13
-
14
- def object_serialization_options
15
- { :include => {
16
- :shipping_method => {},
17
- :address => { :include => [:country, :state] },
18
- :inventory_units => {
19
- :include => {
20
- :variant => {
21
- :include => {
22
- :product => { :only => [:name] }
23
- }
24
- }
25
- }
26
- }
27
- },
28
- :except => [:shipping_method_id, :address_id]
29
- }
30
- end
31
-
32
- def eager_load_associations
33
- [:shipping_method, :address, { :inventory_units => [:variant] }]
34
- end
35
- end
@@ -1,8 +0,0 @@
1
- class Spree::Api::StatesController < Spree::Api::BaseController
2
- before_filter :access_denied, :except => [:index, :show]
3
-
4
- private
5
- def parent
6
- @parent ||= Spree::Country.find(params[:country_id])
7
- end
8
- end
@@ -1,7 +0,0 @@
1
- Spree::LineItem.class_eval do
2
- def description
3
- d = variant.product.name.clone
4
- d << " (#{variant.options_text})" unless variant.option_values.empty?
5
- d
6
- end
7
- end
@@ -1,9 +0,0 @@
1
- Spree::Order.class_eval do
2
- def self.find_by_param(param)
3
- if param.to_i > 0
4
- Spree::Order.find(param)
5
- else
6
- Spree::Order.where(:number => param).first
7
- end
8
- end
9
- end
@@ -1,9 +0,0 @@
1
- Spree::Shipment.class_eval do
2
- def self.find_by_param(param)
3
- if param.to_i > 0
4
- Spree::Shipment.find(param)
5
- else
6
- Spree::Shipment.where(:number => param).first
7
- end
8
- end
9
- end
@@ -1,19 +0,0 @@
1
- Spree::User.class_eval do
2
- def clear_api_key!
3
- self.update_attribute(:authentication_token, "")
4
- end
5
-
6
- def generate_api_key!
7
- self.reset_authentication_token!
8
- end
9
-
10
- #def self.authenticate_with_http(username, password)
11
- # logger.debug(username)
12
- # self.authenticate_with_token(:auth_token => username)
13
- #end
14
-
15
- private
16
- def secure_digest(*args)
17
- Digest::SHA1.hexdigest(args.flatten.join('--'))
18
- end
19
- end
@@ -1,6 +0,0 @@
1
- Deface::Override.new(:virtual_path => "spree/admin/users/edit",
2
- :name => "api_admin_user_edit_form",
3
- :insert_after => "[data-hook='admin_user_edit_form'], #admin_user_edit_form[data-hook]",
4
- :partial => "spree/admin/users/api_fields",
5
- :disabled => false)
6
-
@@ -1,16 +0,0 @@
1
- <h2><%= t('api.access') %></h2>
2
-
3
- <% if @user.authentication_token.present? %>
4
- <p><strong><%= t('api.key') %></strong> <%= @user.authentication_token %></p>
5
- <%= form_tag spree.clear_api_key_admin_user_path(@user), :method => :put do %>
6
- <%= button t('api.clear_key') %>
7
- <% end %>
8
- <%= form_tag spree.generate_api_key_admin_user_path(@user), :method => :put do %>
9
- <%= button t('api.regenerate_key') %>
10
- <% end %>
11
- <% else %>
12
- <p><%= t('api.no_key') %></p>
13
- <%= form_tag spree.generate_api_key_admin_user_path(@user), :method => :put do %>
14
- <%= button t('api.generate_key') %>
15
- <% end %>
16
- <% end %>