Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
shotengai
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open-source
shotengai
Commits
843c69a7
Commit
843c69a7
authored
Sep 11, 2017
by
ivan Lan
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Improve routes & controller for customer
parent
3735d662
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
118 additions
and
84 deletions
+118
-84
controllers_generator.rb
lib/generators/shotengai/controllers_generator.rb
+13
-17
order_spec.rb
...generators/templates/spec/requests/customer/order_spec.rb
+16
-28
product_snapshot_spec.rb
...templates/spec/requests/customer/product_snapshot_spec.rb
+12
-2
shotengai.rb
lib/shotengai.rb
+3
-2
buyer.rb
lib/shotengai/buyer.rb
+3
-3
carts_controller.rb
lib/shotengai/controllers/customer/carts_controller.rb
+49
-0
orders_controller.rb
lib/shotengai/controllers/customer/orders_controller.rb
+9
-21
product_snapshots_controller.rb
...ngai/controllers/customer/product_snapshots_controller.rb
+11
-8
order.rb
lib/shotengai/order.rb
+2
-3
No files found.
lib/generators/shotengai/controllers_generator.rb
View file @
843c69a7
...
...
@@ -79,7 +79,7 @@ module Shotengai
def
merchant_routes
product
,
order
=
@product
.
underscore
,
@order
.
underscore
"
namespace :
#{
@namespace
.
to_sym
}
do
namespace :
#{
@namespace
}
do
resources :
#{
product
.
pluralize
}
, shallow: true do
member do
post :put_on_shelf
...
...
@@ -103,29 +103,26 @@ module Shotengai
def
customer_routes
product
,
order
=
@product
.
underscore
,
@order
.
underscore
"
namespace :
#{
@namespace
.
to_sym
}
do
namespace :
#{
@namespace
}
do
resources :
#{
product
.
pluralize
}
, shallow: true, only: [:index, :show] do
resources :
#{
product
}
_series, only: [:index, :show]
resources :
product
_series, only: [:index, :show]
end
resources :
#{
product
}
_snapshots, only: [:index, :show]
resources :
#{
order
.
pluralize
}
, shallow: true do
# order_cart
resource :cart, only: [:show, :update] do
resources :
#{
product
}
_snapshots
end
resources :
#{
order
.
pluralize
}
do
resources :
#{
product
}
_snapshots
member do
post :pay
post :cancel
post :get_it
end
collection do
get :cart
post :create_directly
post :add_to_cart
post :confirm
end
resources :
#{
product
}
_snapshots, only: [:index, :create]
end
end"
end
"
end
end
end
end
\ No newline at end of file
lib/generators/templates/spec/requests/customer/order_spec.rb
View file @
843c69a7
...
...
@@ -29,14 +29,14 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
@orders
=
create_list
(
:order
,
3
,
buyer:
@user
)
@order_1
=
@orders
.
first
@cart
=
@
order_1
.
class
.
cart_class
.
create!
(
buyer:
@user
)
@cart
=
@
user
.
order_cart
@snapshot_1
.
update!
(
order:
@order_1
)
@snapshot_other
.
update!
(
order:
@order_1
)
@snapshot_2
.
update!
(
order_cart:
@cart
)
end
path
"/
#{
namespace
}
/
orders/
cart"
do
path
"/
#{
namespace
}
/cart"
do
get
(
summary:
'用户 购物车'
)
do
produces
'application/json'
...
...
@@ -52,7 +52,7 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
end
end
path
"/
#{
namespace
}
/
orders/add_to_cart
"
do
path
"/
#{
namespace
}
/
cart/product_snapshots
"
do
post
(
summary:
'用户 添加快照至购物车( using series_id & count )'
)
do
produces
'application/json'
...
...
@@ -63,9 +63,9 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
let
(
:buyer_type
)
{
@user
.
class
.
name
}
parameter
:snapshot
,
in: :body
,
schema:
{
parameter
:
product_
snapshot
,
in: :body
,
schema:
{
type: :object
,
properties:
{
snapshot:
{
product_
snapshot:
{
type: :object
,
properties:
{
shotengai_series_id:
{
type: :integer
},
count:
{
type: :integer
},
...
...
@@ -75,9 +75,9 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
}
response
(
201
,
description:
'Create snapshot and add it to the cart'
)
do
let
(
:snapshot
)
{
let
(
:
product_
snapshot
)
{
{
snapshot:
{
product_
snapshot:
{
shotengai_series_id:
@series_1
.
id
,
count:
10
,
}
...
...
@@ -177,7 +177,7 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
end
path
"/
#{
namespace
}
/orders
/create_directly
"
do
path
"/
#{
namespace
}
/orders"
do
post
(
summary:
'create order'
)
do
produces
'application/json'
consumes
'application/json'
...
...
@@ -193,7 +193,7 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
address:
{
type: :string
},
user_remark:
{
type: :text
},
},
snapshot:
{
snapshot
s
:
{
type: :object
,
properties:
{
shotengai_series_id:
{
type: :integer
},
count:
{
type: :integer
},
...
...
@@ -210,7 +210,7 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
address:
'This is an special address.'
,
user_remark:
'user remark ...'
},
snapshot:
{
snapshot
s
:
{
shotengai_series_id:
@series_1
.
id
,
count:
10
,
}
...
...
@@ -303,14 +303,8 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
}
end
end
end
path
"/
#{
namespace
}
/orders/{id}/pay"
do
parameter
:id
,
in: :path
,
type: :integer
let
(
:id
)
{
@order_1
.
id
}
post
(
summary:
'用户
支付订单'
)
do
delete
(
summary:
'用户 取消未
支付订单'
)
do
produces
'application/json'
consumes
'application/json'
parameter
:buyer_type
,
in: :query
,
type: :string
...
...
@@ -320,18 +314,17 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
produces
'application/json'
consumes
'application/json'
response
(
200
,
description:
'successful'
)
do
it
{
expect
(
JSON
.
parse
(
response
.
body
)[
'pay_time'
]).
not_to
be_nil
}
response
(
204
,
description:
'successful'
)
do
end
end
end
path
"/
#{
namespace
}
/orders/{id}/
cancel
"
do
path
"/
#{
namespace
}
/orders/{id}/
pay
"
do
parameter
:id
,
in: :path
,
type: :integer
let
(
:id
)
{
@order_1
.
id
}
post
(
summary:
'用户
取消未
支付订单'
)
do
post
(
summary:
'用户 支付订单'
)
do
produces
'application/json'
consumes
'application/json'
parameter
:buyer_type
,
in: :query
,
type: :string
...
...
@@ -342,17 +335,12 @@ RSpec.describe "#{namespace}/orders", type: :request, capture_examples: true, ta
produces
'application/json'
consumes
'application/json'
response
(
200
,
description:
'successful'
)
do
it
{
expect
(
JSON
.
parse
(
response
.
body
)[
'status'
]).
to
eq
(
'canceled'
)
}
end
response
(
400
,
description:
'failed , you can cancel a order which status is unpaid'
)
do
before
{
@order_1
.
pay!
}
it
{
expect
(
response
.
status
).
to
eq
(
400
)
}
it
{
expect
(
JSON
.
parse
(
response
.
body
)[
'pay_time'
]).
not_to
be_nil
}
end
end
end
path
"/
#{
namespace
}
/orders/{id}/
get_it
"
do
path
"/
#{
namespace
}
/orders/{id}/
confirm
"
do
parameter
:id
,
in: :path
,
type: :integer
let
(
:id
)
{
@order_1
.
id
}
...
...
lib/generators/templates/spec/requests/customer/product_snapshot_spec.rb
View file @
843c69a7
...
...
@@ -2,6 +2,7 @@ require 'swagger_helper'
namespace
=
'<%= @namespace %>'
RSpec
.
describe
"
#{
namespace
}
/product_snapshots"
,
type: :request
,
capture_examples:
true
,
tags:
[
"
#{
namespace
}
API"
,
"product_snapshots"
]
do
before
do
@user
=
create
(
:user
)
@products
=
create_list
(
:product
,
3
)
@product_1
=
@products
.
first
...
...
@@ -27,7 +28,7 @@ RSpec.describe "#{namespace}/product_snapshots", type: :request, capture_example
@snapshot_other
=
create
(
:product_snapshot
,
series:
@series_2
,
count:
5
)
@order
=
create
(
:order
)
@cart
=
Order
::
Cart
.
create!
@cart
=
@user
.
order_cart
@snapshot_1
.
update!
(
order:
@order
)
@snapshot_other
.
update!
(
order:
@order
)
@snapshot_2
.
update!
(
order_cart:
@cart
)
...
...
@@ -36,7 +37,11 @@ RSpec.describe "#{namespace}/product_snapshots", type: :request, capture_example
path
"/
#{
namespace
}
/product_snapshots"
do
get
(
summary:
'用户 快照列表 三参数可仍以任意组合'
)
do
parameter
:buyer_type
,
in: :query
,
type: :string
parameter
:buyer_id
,
in: :query
,
type: :integer
let
(
:buyer_id
)
{
@user
.
id
}
let
(
:buyer_type
)
{
@user
.
class
.
name
}
parameter
:page
,
in: :query
,
type: :string
parameter
:per_page
,
in: :query
,
type: :string
parameter
:series_id
,
in: :query
,
type: :integer
...
...
@@ -73,6 +78,11 @@ RSpec.describe "#{namespace}/product_snapshots", type: :request, capture_example
end
path
"/
#{
namespace
}
/product_snapshots/{id}"
do
parameter
:buyer_type
,
in: :query
,
type: :string
parameter
:buyer_id
,
in: :query
,
type: :integer
let
(
:buyer_id
)
{
@user
.
id
}
let
(
:buyer_type
)
{
@user
.
class
.
name
}
let
(
:id
)
{
@snapshot_1
.
id
}
get
(
summary:
'商户 商品快照的详情'
)
do
...
...
lib/shotengai.rb
View file @
843c69a7
...
...
@@ -17,17 +17,18 @@ module Shotengai
autoload
:Base
,
'shotengai/controllers/base'
module
Merchant
autoload
:ProductsController
,
'shotengai/controllers/merchant/products_controller'
autoload
:ProductsController
,
'shotengai/controllers/merchant/products_controller'
autoload
:ProductSnapshotsController
,
'shotengai/controllers/merchant/product_snapshots_controller'
autoload
:ProductSeriesController
,
'shotengai/controllers/merchant/product_series_controller'
autoload
:OrdersController
,
'shotengai/controllers/merchant/orders_controller'
end
module
Customer
autoload
:ProductsController
,
'shotengai/controllers/customer/products_controller'
autoload
:ProductsController
,
'shotengai/controllers/customer/products_controller'
autoload
:ProductSnapshotsController
,
'shotengai/controllers/customer/product_snapshots_controller'
autoload
:ProductSeriesController
,
'shotengai/controllers/customer/product_series_controller'
autoload
:OrdersController
,
'shotengai/controllers/customer/orders_controller'
autoload
:CartsController
,
'shotengai/controllers/customer/carts_controller'
end
end
end
lib/shotengai/buyer.rb
View file @
843c69a7
...
...
@@ -33,11 +33,11 @@ module Shotengai
)
end
def buy_it_immediately snapshot_params, order_params
def buy_it_immediately snapshot
s
_params, order_params
ActiveRecord::Base.transaction do
order = self.
#{
collection_name
}
.create!(order_params)
Shotengai::Series.find(snapshot
_params[:shotengai_series_id]).snapshots.create!(
snapshot_params.merge({
snapshots_params && Shotengai::Series.find(snapshots
_params[:shotengai_series_id]).snapshots.create!(
snapshot
s
_params.merge({
shotengai_order: order
})
)
...
...
lib/shotengai/controllers/customer/carts_controller.rb
0 → 100644
View file @
843c69a7
module
Shotengai
module
Controller
module
Customer
class
CartsController
<
Shotengai
::
Controller
::
Base
self
.
resources
=
Cart
self
.
template_dir
=
'shotengai/customer/cart'
before_action
:buyer_auth
before_action
:set_resource
# NOTE: before_action would not keep the super methods' "only" condition
remove_actions
:index
,
:create
,
:destroy
default_query
do
|
resource
,
params
|
end
index_query
do
|
resource
,
params
|
end
private
def
buyer_auth
@buyer
=
params
[
:buyer_type
].
constantize
.
find
(
params
[
:buyer_id
])
end
def
set_resource
@resource
=
@buyer
.
order_cart
end
def
resource_params
params
.
require
(
resource_key
).
permit
(
:address
,
:customer_remark
,
incr_snapshot_ids:
[],
gone_snapshot_ids:
[]
)
end
def
snapshot_params
params
.
require
(
:snapshot
).
permit
(
:shotengai_series_id
,
:count
)
end
def
edit_only_unpaid
raise
Shotengai
::
WebError
.
new
(
'订单已支付,不可修改。'
,
'-1'
,
403
)
unless
@resource
.
unpaid?
end
end
end
end
end
lib/shotengai/controllers/customer/orders_controller.rb
View file @
843c69a7
...
...
@@ -7,8 +7,6 @@ module Shotengai
before_action
:buyer_auth
before_action
:edit_only_unpaid
,
only:
[
:update
]
# before_action would not keep the super methods' "only" condition
skip_before_action
:set_resource
,
only:
[
:cart
,
:add_to_cart
,
:create_directly
]
remove_actions
:destroy
...
...
@@ -18,19 +16,9 @@ module Shotengai
index_query
do
|
resource
,
params
|
resource
.
status_is
(
params
[
:status
])
end
def
cart
@resource
=
@buyer
.
order_cart
respond_with
@resource
,
template:
"shotengai/customer/cart/show"
end
def
add_to_cart
snapshot
=
@buyer
.
add_to_order_cart
(
snapshot_params
)
respond_with
@resource
=
snapshot
,
template:
'shotengai/customer/snapshots/show'
,
status:
201
end
def
create_directly
# using :series_id & :count
@resource
=
@buyer
.
buy_it_immediately
(
snapshot_params
,
resource_params
)
def
create
# Use :series_id & :count
@resource
=
@buyer
.
buy_it_immediately
(
snapshots_params
,
resource_params
)
respond_with
@resource
,
template:
"
#{
@@template_dir
}
/show"
,
status:
201
end
...
...
@@ -39,13 +27,13 @@ module Shotengai
respond_with
@resource
,
template:
"
#{
@@template_dir
}
/show"
end
def
cancel
def
destroy
@resource
.
cancel!
respond_with
@resource
,
template:
"
#{
@@template_dir
}
/show"
head
204
end
def
get_it
@resource
.
get_it
def
confirm
@resource
.
confirm!
respond_with
@resource
,
template:
"
#{
@@template_dir
}
/show"
end
...
...
@@ -55,14 +43,14 @@ module Shotengai
end
def
resource_params
params
.
require
(
resource_key
).
permit
(
params
[
resource_key
]
&&
params
.
require
(
resource_key
).
permit
(
:address
,
:customer_remark
,
incr_snapshot_ids:
[],
gone_snapshot_ids:
[]
)
end
def
snapshot_params
params
.
require
(
:snapshot
).
permit
(
def
snapshot
s
_params
params
[
:snapshots
]
&&
params
.
require
(
:snapshots
).
permit
(
:shotengai_series_id
,
:count
)
end
...
...
lib/shotengai/controllers/customer/product_snapshots_controller.rb
View file @
843c69a7
...
...
@@ -5,8 +5,8 @@ module Shotengai
self
.
resources
=
ProductSnapshot
self
.
template_dir
=
'shotengai/customer/snapshots/'
before_action
:
edit_only_unpaid
,
only:
[
:update
,
:destroy
]
before_action
:
buyer_auth
before_action
:edit_only_unpaid
,
except:
[
:index
,
:show
,
:create
]
default_query
do
|
resource
,
params
|
# /orders/:order_id/snapshots
# /series/:series_id/snapshots
...
...
@@ -21,19 +21,22 @@ module Shotengai
params
[
:in_cart
]
?
resource
.
in_cart
:
resource
.
in_order
end
# 不指定 order 时,默认创建在 cart 中
# TODO: WARNING: snapshots
def
create
buyer_type
,
buyer_id
=
resource_params
.
values_at
(
:buy_type
,
:buyer_id
)
@buyer
=
buyer_type
.
constantize
.
find
(
buyer_id
)
if
buyer_type
&&
buyer_id
@resource
=
default_resources
.
create!
(
resource_params
.
merge
(
buyer:
buyer
)
)
order_or_cart
=
Shotengai
::
Order
.
find_by_id
(
params
[
:order_id
])
||
@buyer
.
order_cart
@resource
=
order_or_cart
.
product_snapshots
.
create!
(
resource_params
)
respond_with
@resource
,
template:
"
#{
@@template_dir
}
/show"
,
status:
201
end
private
def
buyer_auth
@buyer
=
params
[
:buyer_type
].
constantize
.
find
(
params
[
:buyer_id
])
end
def
resource_params
params
.
require
(
resource_key
).
permit
(
:count
,
:shotengai_series_id
,
:buyer_id
,
:buy_type
:count
,
:shotengai_series_id
)
end
...
...
lib/shotengai/order.rb
View file @
843c69a7
...
...
@@ -52,7 +52,7 @@ module Shotengai
transitions
from: :paid
,
to: :delivering
end
event
:
get_it
,
after: :set_receipt_time
do
event
:
confirm
,
after: :set_receipt_time
do
transitions
from: :delivering
,
to: :received
end
# event :evaluate {
...
...
@@ -102,8 +102,7 @@ module Shotengai
ActiveRecord
::
Base
.
transaction
do
ids
.
each
{
|
id
|
# using update(shotengai_order_id: id) can not get self.id before save
Shotengai
::
Snapshot
.
find
(
id
).
update!
(
shotengai_order_id:
self
.
id
)
Shotengai
::
Snapshot
.
find
(
id
).
update!
(
shotengai_order:
self
)
}
end
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment