From aba212e13062c43a1192ef885b05145ac1cc9fe7 Mon Sep 17 00:00:00 2001 From: David Gay Date: Sun, 23 May 2021 17:06:34 -0400 Subject: Bazaar with buy orders, sell orders, and order cancellation --- app/models/bazaar_order.rb | 12 ++++++++++++ app/models/character.rb | 14 ++++++++++---- app/models/character_item.rb | 14 ++------------ app/models/concerns/destroy_if_zero_quantity.rb | 18 ++++++++++++++++++ 4 files changed, 42 insertions(+), 16 deletions(-) create mode 100644 app/models/bazaar_order.rb create mode 100644 app/models/concerns/destroy_if_zero_quantity.rb (limited to 'app/models') diff --git a/app/models/bazaar_order.rb b/app/models/bazaar_order.rb new file mode 100644 index 0000000..d36d520 --- /dev/null +++ b/app/models/bazaar_order.rb @@ -0,0 +1,12 @@ +class BazaarOrder < ApplicationRecord + include DestroyIfZeroQuantity + + belongs_to :character + belongs_to :item + + validates :price_each, :quantity, + numericality: { greater_than_or_equal_to: 0, + less_than_or_equal_to: 2_000_000_000, only_integer: true } + validates :buy_order, inclusion: { in: [true, false] } + +end diff --git a/app/models/character.rb b/app/models/character.rb index bad2bb2..003f8af 100644 --- a/app/models/character.rb +++ b/app/models/character.rb @@ -11,6 +11,7 @@ class Character < ApplicationRecord has_many :items, through: :character_items has_many :character_skills has_many :chat_messages + has_many :bazaar_orders validates :name, presence: true validates_length_of :name, maximum: 15, message: "can't be longer than 15 characters" validates_uniqueness_of :name, message: "is already being used" @@ -35,12 +36,17 @@ class Character < ApplicationRecord def wildscour_level; skill_level("wildscour"); end def worldcall_level; skill_level("worldcall"); end + def vestige + vestige = self.character_items.find_by(item: Item.find_by_gid("vestige")) + vestige ? vestige.quantity : 0 + end + def shift_item(item, amount) item = Item.find_by_gid(item) if item.is_a? String CharacterItem.transaction do ci = self.character_items.find_or_initialize_by(item: item) - ci.increment(:quantity, amount) - ci.save + ci.increment!(:quantity, amount) + ci.save! end end @@ -71,7 +77,7 @@ class Character < ApplicationRecord open_slots = self.open_slots_for(item) raise EquipmentError unless open_slots.any? self.shift_item(item, -1) - self.equipment.create(item: item, slot: open_slots.first) + self.equipment.create!(item: item, slot: open_slots.first) end end @@ -80,7 +86,7 @@ class Character < ApplicationRecord equipment = self.equipment.find_by(slot: slot) raise EquipmentError unless equipment item = equipment.item - equipment.destroy + equipment.destroy! self.shift_item(item, 1) end end diff --git a/app/models/character_item.rb b/app/models/character_item.rb index b54f799..6ee13ab 100644 --- a/app/models/character_item.rb +++ b/app/models/character_item.rb @@ -1,4 +1,6 @@ class CharacterItem < ApplicationRecord + include DestroyIfZeroQuantity + belongs_to :character belongs_to :item validates :quantity, presence: true @@ -9,17 +11,5 @@ class CharacterItem < ApplicationRecord end end - after_save :destroy_if_zero_quantity - scope :ordered_by_item_name, -> { includes(:item).order("items.name") } - - private - def destroy_if_zero_quantity - if self.quantity == 0 - destroy - elsif self.quantity < 0 - # TODO: Can improve this (at the least, with reporting, later). - raise ItemQuantityError - end - end end diff --git a/app/models/concerns/destroy_if_zero_quantity.rb b/app/models/concerns/destroy_if_zero_quantity.rb new file mode 100644 index 0000000..6fdfb3e --- /dev/null +++ b/app/models/concerns/destroy_if_zero_quantity.rb @@ -0,0 +1,18 @@ +module DestroyIfZeroQuantity + extend ActiveSupport::Concern + + included do + after_save :destroy_if_zero_quantity + end + + private + def destroy_if_zero_quantity + byebug + if self.quantity == 0 + destroy + elsif self.quantity < 0 + # TODO: Can improve this (at the least, with reporting, later). + raise ItemQuantityError + end + end +end -- cgit v1.2.3