Skip to content
Draft
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
17 changes: 16 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
include OrderInputHandler

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

def create
# Write Code Here
order, payment = build_order_and_payment

ActiveRecord::Base.transaction do
payment.pay!(token:) &&
order.save! &&
order.reservation.completed! &&
order.item.decrease_stock
end

redirect_to dashboard_orders_path, notice: "注文が作成されました"
end

private

def token = params.dig(:order, :token)
end
18 changes: 18 additions & 0 deletions app/models/concerns/order_input_handler.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# frozen_string_literal: true

module OrderInputHandler
def build_order_and_payment
order = reservation.build_order
order.assign_attributes(params.expect(order: %i[email name item_id user_id]))
payment = order.build_payment
payment.assign_attributes(amount: order.item.price)

[ order, payment ]
end

private

def reservation = Reservation.find(params.dig(:order, :reservation_id))

def reservation_id = params.dig(:order, :reservation_id)
end

Check failure on line 18 in app/models/concerns/order_input_handler.rb

View workflow job for this annotation

GitHub Actions / lint

Layout/TrailingEmptyLines: Final newline missing.
2 changes: 2 additions & 0 deletions app/models/item.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,6 @@ class Item < ApplicationRecord
validates :name, presence: true
validates :stock, presence: true, numericality: { greater_than_or_equal_to: 0 }
validates :price, presence: true, numericality: { greater_than: 0 }

def decrease_stock = self.stock -= 1
end
5 changes: 5 additions & 0 deletions app/models/order.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,9 @@ class Order < ApplicationRecord

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

before_validation do
self.email = reservation&.email
self.name = item&.name
end
end
7 changes: 7 additions & 0 deletions app/models/payment.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,11 @@ class Payment < ApplicationRecord

validates :payment_id, presence: true
validates :amount, presence: true, numericality: { greater_than: 0 }

def pay!(token:)
results = PaymentApiClient.execute(token:, amount:)
self.payment_id = results[:payment_id]

save!
end
end
Loading