spree_api 1.1.1 → 1.1.2.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.
- data/app/controllers/spree/api/v1/base_controller.rb +5 -1
- data/app/controllers/spree/api/v1/orders_controller.rb +13 -2
- data/app/controllers/spree/api/v1/products_controller.rb +1 -1
- data/app/controllers/spree/api/v1/shipments_controller.rb +8 -3
- data/app/controllers/spree/api/v1/zones_controller.rb +45 -0
- data/app/helpers/spree/api/api_helpers.rb +4 -0
- data/app/views/spree/api/v1/products/show.rabl +4 -0
- data/app/views/spree/api/v1/zones/index.rabl +2 -0
- data/app/views/spree/api/v1/zones/show.rabl +6 -0
- data/config/routes.rb +2 -0
- data/script/rails +5 -2
- data/spec/controllers/spree/api/v1/orders_controller_spec.rb +24 -0
- data/spec/controllers/spree/api/v1/products_controller_spec.rb +22 -0
- data/spec/controllers/spree/api/v1/shipments_controller_spec.rb +3 -2
- data/spec/controllers/spree/api/v1/zones_controller_spec.rb +54 -0
- data/spec/models/spree/order_spec.rb +4 -4
- metadata +23 -21
@@ -59,7 +59,7 @@ module Spree
|
|
59
59
|
|
60
60
|
def find_product(id)
|
61
61
|
begin
|
62
|
-
product_scope.find_by_permalink!(id)
|
62
|
+
product_scope.find_by_permalink!(id.to_s)
|
63
63
|
rescue ActiveRecord::RecordNotFound
|
64
64
|
product_scope.find(id)
|
65
65
|
end
|
@@ -68,9 +68,13 @@ module Spree
|
|
68
68
|
def product_scope
|
69
69
|
if current_api_user.has_role?("admin")
|
70
70
|
scope = Product
|
71
|
+
unless params[:show_deleted]
|
72
|
+
scope = scope.not_deleted
|
73
|
+
end
|
71
74
|
else
|
72
75
|
scope = Product.active
|
73
76
|
end
|
77
|
+
|
74
78
|
scope.includes(:master)
|
75
79
|
end
|
76
80
|
|
@@ -3,6 +3,7 @@ module Spree
|
|
3
3
|
module V1
|
4
4
|
class OrdersController < Spree::Api::V1::BaseController
|
5
5
|
before_filter :map_nested_attributes, :only => [:create, :update]
|
6
|
+
before_filter :authorize_read!, :except => [:index, :search, :create]
|
6
7
|
|
7
8
|
def index
|
8
9
|
# should probably look at turning this into a CanCan step
|
@@ -11,11 +12,10 @@ module Spree
|
|
11
12
|
end
|
12
13
|
|
13
14
|
def show
|
14
|
-
authorize! :read, order
|
15
15
|
end
|
16
16
|
|
17
17
|
def search
|
18
|
-
@orders = Order.
|
18
|
+
@orders = Order.ransack(params[:q]).result.page(params[:page])
|
19
19
|
render :index
|
20
20
|
end
|
21
21
|
|
@@ -55,6 +55,13 @@ module Spree
|
|
55
55
|
render :show
|
56
56
|
end
|
57
57
|
|
58
|
+
def empty
|
59
|
+
authorize! :read, order
|
60
|
+
order.line_items.destroy_all
|
61
|
+
order.update!
|
62
|
+
render :text => nil, :status => 200
|
63
|
+
end
|
64
|
+
|
58
65
|
private
|
59
66
|
|
60
67
|
def map_nested_attributes
|
@@ -72,6 +79,10 @@ module Spree
|
|
72
79
|
render :could_not_transition, :status => 422
|
73
80
|
end
|
74
81
|
end
|
82
|
+
|
83
|
+
def authorize_read!
|
84
|
+
authorize! :read, order
|
85
|
+
end
|
75
86
|
end
|
76
87
|
end
|
77
88
|
end
|
@@ -6,24 +6,29 @@ module Spree
|
|
6
6
|
before_filter :find_and_update_shipment, :only => [:ship, :ready]
|
7
7
|
|
8
8
|
def ready
|
9
|
-
@shipment.ready
|
9
|
+
unless @shipment.ready?
|
10
|
+
@shipment.ready!
|
11
|
+
end
|
10
12
|
render :show
|
11
13
|
end
|
12
14
|
|
13
15
|
def ship
|
14
|
-
@shipment.
|
16
|
+
unless @shipment.shipped?
|
17
|
+
@shipment.ship!
|
18
|
+
end
|
15
19
|
render :show
|
16
20
|
end
|
17
21
|
|
18
22
|
private
|
19
23
|
|
20
24
|
def find_order
|
21
|
-
@order = Order.find_by_number!(params[:order_id])
|
25
|
+
@order = Spree::Order.find_by_number!(params[:order_id])
|
22
26
|
end
|
23
27
|
|
24
28
|
def find_and_update_shipment
|
25
29
|
@shipment = @order.shipments.find_by_number!(params[:id])
|
26
30
|
@shipment.update_attributes(params[:shipment])
|
31
|
+
@shipment.reload
|
27
32
|
end
|
28
33
|
end
|
29
34
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Spree
|
2
|
+
module Api
|
3
|
+
module V1
|
4
|
+
class ZonesController < Spree::Api::V1::BaseController
|
5
|
+
def index
|
6
|
+
@zones = Zone.order('name ASC')
|
7
|
+
end
|
8
|
+
|
9
|
+
def show
|
10
|
+
zone
|
11
|
+
end
|
12
|
+
|
13
|
+
def create
|
14
|
+
authorize! :create, Zone
|
15
|
+
@zone = Zone.new(map_nested_attributes_keys(Spree::Zone, params[:zone]))
|
16
|
+
if @zone.save
|
17
|
+
render :show, :status => 201
|
18
|
+
else
|
19
|
+
invalid_resource!(@zone)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def update
|
24
|
+
authorize! :update, Zone
|
25
|
+
if zone.update_attributes(map_nested_attributes_keys(Spree::Zone, params[:zone]))
|
26
|
+
render :show, :status => 200
|
27
|
+
else
|
28
|
+
invalid_resource!(@zone)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def destroy
|
33
|
+
authorize! :delete, Zone
|
34
|
+
zone.destroy
|
35
|
+
render :text => nil, :status => 200
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def zone
|
40
|
+
@zone ||= Spree::Zone.find(params[:id])
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -16,6 +16,10 @@ module Spree
|
|
16
16
|
:count_on_hand, :meta_description, :meta_keywords, :taxon_ids]
|
17
17
|
end
|
18
18
|
|
19
|
+
def product_property_attributes
|
20
|
+
[:id, :product_id, :property_id, :value, :property_name]
|
21
|
+
end
|
22
|
+
|
19
23
|
def variant_attributes
|
20
24
|
[:id, :name, :count_on_hand, :sku, :price, :weight, :height, :width, :depth, :is_master, :cost_price, :permalink]
|
21
25
|
end
|
data/config/routes.rb
CHANGED
@@ -31,6 +31,7 @@ Spree::Core::Engine.routes.prepend do
|
|
31
31
|
put :address
|
32
32
|
put :delivery
|
33
33
|
put :cancel
|
34
|
+
put :empty
|
34
35
|
end
|
35
36
|
|
36
37
|
resources :line_items
|
@@ -51,6 +52,7 @@ Spree::Core::Engine.routes.prepend do
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
55
|
+
resources :zones
|
54
56
|
resources :countries, :only => [:index, :show]
|
55
57
|
resources :addresses, :only => [:show, :update]
|
56
58
|
resources :taxonomies do
|
data/script/rails
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
3
|
|
4
|
-
|
5
|
-
|
4
|
+
ENGINE_ROOT = File.expand_path('../..', __FILE__)
|
5
|
+
ENGINE_PATH = File.expand_path('../../lib/spree/api/engine', __FILE__)
|
6
|
+
|
7
|
+
require 'rails/all'
|
8
|
+
require 'rails/engine/commands'
|
@@ -34,6 +34,23 @@ module Spree
|
|
34
34
|
assert_unauthorized!
|
35
35
|
end
|
36
36
|
|
37
|
+
it "cannot cancel an order that doesn't belong to them" do
|
38
|
+
order.update_attribute(:completed_at, Time.now)
|
39
|
+
order.update_attribute(:shipment_state, "ready")
|
40
|
+
api_put :cancel, :id => order.to_param
|
41
|
+
assert_unauthorized!
|
42
|
+
end
|
43
|
+
|
44
|
+
it "cannot add address information to an order that doesn't belong to them" do
|
45
|
+
api_put :address, :id => order.to_param
|
46
|
+
assert_unauthorized!
|
47
|
+
end
|
48
|
+
|
49
|
+
it "cannot change delivery information on an order that doesn't belong to them" do
|
50
|
+
api_put :delivery, :id => order.to_param
|
51
|
+
assert_unauthorized!
|
52
|
+
end
|
53
|
+
|
37
54
|
it "can create an order" do
|
38
55
|
variant = create(:variant)
|
39
56
|
api_post :create, :order => { :line_items => [{ :variant_id => variant.to_param, :quantity => 5 }] }
|
@@ -47,6 +64,7 @@ module Spree
|
|
47
64
|
|
48
65
|
context "working with an order" do
|
49
66
|
before do
|
67
|
+
Order.any_instance.stub :user => current_api_user
|
50
68
|
create(:payment_method)
|
51
69
|
order.next # Switch from cart to address
|
52
70
|
order.ship_address.should be_nil
|
@@ -128,6 +146,12 @@ module Spree
|
|
128
146
|
json_response["errors"].should include("Invalid shipping method specified.")
|
129
147
|
end
|
130
148
|
end
|
149
|
+
|
150
|
+
it "can empty an order" do
|
151
|
+
api_put :empty, :id => order.to_param
|
152
|
+
response.status.should == 200
|
153
|
+
order.reload.line_items.should be_empty
|
154
|
+
end
|
131
155
|
end
|
132
156
|
end
|
133
157
|
|
@@ -48,6 +48,7 @@ module Spree
|
|
48
48
|
|
49
49
|
it "gets a single product" do
|
50
50
|
product.master.images.create!(:attachment => image("thinking-cat.jpg"))
|
51
|
+
product.set_property("spree", "rocks")
|
51
52
|
api_get :show, :id => product.to_param
|
52
53
|
json_response.should have_attributes(attributes)
|
53
54
|
product_json = json_response["product"]
|
@@ -60,6 +61,10 @@ module Spree
|
|
60
61
|
:attachment_width,
|
61
62
|
:attachment_height,
|
62
63
|
:attachment_content_type])
|
64
|
+
|
65
|
+
product_json["product_properties"].first.should have_attributes([:value,
|
66
|
+
:product_id,
|
67
|
+
:property_name])
|
63
68
|
end
|
64
69
|
|
65
70
|
|
@@ -127,6 +132,23 @@ module Spree
|
|
127
132
|
json_response["pages"].should == 1
|
128
133
|
end
|
129
134
|
|
135
|
+
# Regression test for #1626
|
136
|
+
context "deleted products" do
|
137
|
+
before do
|
138
|
+
create(:product, :deleted_at => Time.now)
|
139
|
+
end
|
140
|
+
|
141
|
+
it "does not include deleted products" do
|
142
|
+
api_get :index
|
143
|
+
json_response["products"].count.should == 2
|
144
|
+
end
|
145
|
+
|
146
|
+
it "can include deleted products" do
|
147
|
+
api_get :index, :show_deleted => 1
|
148
|
+
json_response["products"].count.should == 3
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
130
152
|
it "can create a new product" do
|
131
153
|
api_post :create, :product => { :name => "The Other Product",
|
132
154
|
:price => 19.99 }
|
@@ -5,7 +5,7 @@ describe Spree::Api::V1::ShipmentsController do
|
|
5
5
|
let!(:attributes) { [:id, :tracking, :number, :cost, :shipped_at] }
|
6
6
|
|
7
7
|
before do
|
8
|
-
|
8
|
+
Spree::Order.any_instance.stub(:paid? => true)
|
9
9
|
stub_authentication!
|
10
10
|
end
|
11
11
|
|
@@ -16,12 +16,13 @@ describe Spree::Api::V1::ShipmentsController do
|
|
16
16
|
api_put :ready
|
17
17
|
json_response.should have_attributes(attributes)
|
18
18
|
json_response["shipment"]["state"].should == "ready"
|
19
|
+
shipment.reload.state.should == "ready"
|
19
20
|
end
|
20
21
|
|
21
22
|
context "can transition a shipment from ready to ship" do
|
22
23
|
before do
|
23
|
-
shipment.order.update_attribute(:payment_state, 'paid')
|
24
24
|
shipment.update!(shipment.order)
|
25
|
+
shipment.state.should == "ready"
|
25
26
|
end
|
26
27
|
|
27
28
|
it "can transition a shipment from ready to ship" do
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
describe Api::V1::ZonesController do
|
5
|
+
render_views
|
6
|
+
|
7
|
+
let!(:attributes) { [:id, :name, :zone_members] }
|
8
|
+
|
9
|
+
before do
|
10
|
+
stub_authentication!
|
11
|
+
@zone = create(:zone, :name => 'Europe')
|
12
|
+
end
|
13
|
+
|
14
|
+
it "gets list of zones" do
|
15
|
+
api_get :index
|
16
|
+
json_response.first.should have_attributes(attributes)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "gets a zone" do
|
20
|
+
api_get :show, :id => @zone.id
|
21
|
+
json_response.should have_attributes(attributes)
|
22
|
+
json_response['zone']['name'].should eq @zone.name
|
23
|
+
json_response['zone']['zone_members'].size.should eq @zone.zone_members.count
|
24
|
+
end
|
25
|
+
|
26
|
+
context "as an admin" do
|
27
|
+
sign_in_as_admin!
|
28
|
+
|
29
|
+
it "can create a new zone" do
|
30
|
+
api_post :create, :zone => { :name => "North Pole",
|
31
|
+
:zone_members => [ :zone_member => {
|
32
|
+
:zoneable_id => 1 }] }
|
33
|
+
response.status.should == 201
|
34
|
+
json_response.should have_attributes(attributes)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "updates a zone" do
|
38
|
+
api_put :update, :id => @zone.id,
|
39
|
+
:zone => { :name => "Americas",
|
40
|
+
:zone_members => [ :zone_member => {
|
41
|
+
:zoneable_type => 'Spree::Country',
|
42
|
+
:zoneable_id => 1 }]}
|
43
|
+
response.status.should == 200
|
44
|
+
json_response['zone']['name'].should eq 'Americas'
|
45
|
+
end
|
46
|
+
|
47
|
+
it "can delete a zone" do
|
48
|
+
api_delete :destroy, :id => @zone.id
|
49
|
+
response.status.should == 200
|
50
|
+
lambda { @zone.reload }.should raise_error(ActiveRecord::RecordNotFound)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -5,14 +5,14 @@ module Spree
|
|
5
5
|
let(:user) { stub_model(User) }
|
6
6
|
|
7
7
|
it 'can build an order from API parameters' do
|
8
|
-
|
9
|
-
|
10
|
-
order = Order.build_from_api(user, { :line_items_attributes => [{ :variant_id =>
|
8
|
+
product = Spree::Product.create!(:name => 'Test', :sku => 'TEST-1', :price => 33.22)
|
9
|
+
variant_id = product.master.id
|
10
|
+
order = Order.build_from_api(user, { :line_items_attributes => [{ :variant_id => variant_id, :quantity => 5 }]})
|
11
11
|
|
12
12
|
order.user.should == user
|
13
13
|
line_item = order.line_items.first
|
14
14
|
line_item.quantity.should == 5
|
15
|
-
line_item.variant_id.should ==
|
15
|
+
line_item.variant_id.should == variant_id
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
metadata
CHANGED
@@ -1,41 +1,41 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.1.2.rc1
|
5
|
+
prerelease: 6
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Ryan Bigg
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-25 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: spree_core
|
16
|
-
requirement: &
|
16
|
+
requirement: &70220783785700 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - =
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 1.1.
|
21
|
+
version: 1.1.2.rc1
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70220783785700
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: spree_auth
|
27
|
-
requirement: &
|
27
|
+
requirement: &70220783782780 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - =
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.1.
|
32
|
+
version: 1.1.2.rc1
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70220783782780
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rabl
|
38
|
-
requirement: &
|
38
|
+
requirement: &70220783780280 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - =
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: 0.6.5
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70220783780280
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rspec-rails
|
49
|
-
requirement: &
|
49
|
+
requirement: &70220783772020 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - =
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: 2.9.0
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70220783772020
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: database_cleaner
|
60
|
-
requirement: &
|
60
|
+
requirement: &70220783768740 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,7 +65,7 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70220783768740
|
69
69
|
description: Spree's API
|
70
70
|
email:
|
71
71
|
- ryan@spreecommerce.com
|
@@ -90,6 +90,7 @@ files:
|
|
90
90
|
- app/controllers/spree/api/v1/taxonomies_controller.rb
|
91
91
|
- app/controllers/spree/api/v1/taxons_controller.rb
|
92
92
|
- app/controllers/spree/api/v1/variants_controller.rb
|
93
|
+
- app/controllers/spree/api/v1/zones_controller.rb
|
93
94
|
- app/helpers/spree/api/api_helpers.rb
|
94
95
|
- app/models/spree/line_item_decorator.rb
|
95
96
|
- app/models/spree/option_value_decorator.rb
|
@@ -141,6 +142,8 @@ files:
|
|
141
142
|
- app/views/spree/api/v1/variants/new.rabl
|
142
143
|
- app/views/spree/api/v1/variants/show.rabl
|
143
144
|
- app/views/spree/api/v1/variants/variant.rabl
|
145
|
+
- app/views/spree/api/v1/zones/index.rabl
|
146
|
+
- app/views/spree/api/v1/zones/show.rabl
|
144
147
|
- config/initializers/metal_load_paths.rb
|
145
148
|
- config/locales/en.yml
|
146
149
|
- config/routes.rb
|
@@ -166,6 +169,7 @@ files:
|
|
166
169
|
- spec/controllers/spree/api/v1/taxonomies_controller_spec.rb
|
167
170
|
- spec/controllers/spree/api/v1/taxons_controller_spec.rb
|
168
171
|
- spec/controllers/spree/api/v1/variants_controller_spec.rb
|
172
|
+
- spec/controllers/spree/api/v1/zones_controller_spec.rb
|
169
173
|
- spec/fixtures/thinking-cat.jpg
|
170
174
|
- spec/models/spree/order_spec.rb
|
171
175
|
- spec/models/spree/user_spec.rb
|
@@ -188,16 +192,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
188
192
|
version: '0'
|
189
193
|
segments:
|
190
194
|
- 0
|
191
|
-
hash: -
|
195
|
+
hash: -1105458712086829155
|
192
196
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
193
197
|
none: false
|
194
198
|
requirements:
|
195
|
-
- - ! '
|
199
|
+
- - ! '>'
|
196
200
|
- !ruby/object:Gem::Version
|
197
|
-
version:
|
198
|
-
segments:
|
199
|
-
- 0
|
200
|
-
hash: -3593481641416743509
|
201
|
+
version: 1.3.1
|
201
202
|
requirements: []
|
202
203
|
rubyforge_project:
|
203
204
|
rubygems_version: 1.8.10
|
@@ -217,6 +218,7 @@ test_files:
|
|
217
218
|
- spec/controllers/spree/api/v1/taxonomies_controller_spec.rb
|
218
219
|
- spec/controllers/spree/api/v1/taxons_controller_spec.rb
|
219
220
|
- spec/controllers/spree/api/v1/variants_controller_spec.rb
|
221
|
+
- spec/controllers/spree/api/v1/zones_controller_spec.rb
|
220
222
|
- spec/fixtures/thinking-cat.jpg
|
221
223
|
- spec/models/spree/order_spec.rb
|
222
224
|
- spec/models/spree/user_spec.rb
|