spree_api 1.0.7 → 1.1.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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 %>