Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 35 additions & 1 deletion app/controllers/dashboard/orders_controller.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
class Dashboard::OrdersController < ApplicationController
before_action :set_items_and_users, only: [ :new, :create ]

def index
@orders = Order.includes(:item, :reservation, :user).order(created_at: :desc)
end
Expand All @@ -16,6 +18,38 @@ def new
end

def create
# Write Code Here
reservation = Reservation.find(order_params[:reservation_id])
item = Item.find(order_params[:item_id])
user = User.find(order_params[:user_id])

@order = reservation.build_order(
email: reservation.email,
name: item.name,
user: user,
item: item,
)

if item.stock < 1
flash.now.alert = "在庫が不足しています"
return render :new
end

if @order.execute_payment_and_update_reservation_and_item(token: order_params[:token])
redirect_to dashboard_orders_path, notice: "注文が作成されました"
else
flash.now.alert = "決済に失敗しました。"
render :new
end
end

private

def order_params
params.require(:order).permit(:reservation_id, :item_id, :user_id, :token)
end

def set_items_and_users
@items = Item.all.order(:name)
@users = User.all.order(:name)
end
end
20 changes: 20 additions & 0 deletions app/models/order.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,24 @@ class Order < ApplicationRecord

validates :email, presence: true
validates :name, presence: true

def execute_payment_and_update_reservation_and_item(token:)
response = PaymentApiClient.execute(token:, amount: item.price)

ActiveRecord::Base.transaction do
build_payment(payment_id: response[:payment_id], amount: response[:amount])
if reservation.status == "completed"
raise ActiveRecord::RecordInvalid, "Reservation is already completed"
end
reservation.update!(status: :completed)
item.update!(stock: item.stock - 1)
save!
end

true
rescue Timeout::Error, ArgumentError
false
rescue ActiveRecord::RecordInvalid, ActiveRecord::RecordNotSaved
false
end
end