89 lines
2.5 KiB
Ruby
89 lines
2.5 KiB
Ruby
class Api::V1::Accounts::Captain::PricingsController < Api::V1::Accounts::BaseController
|
|
before_action :fetch_pricings, only: [:index]
|
|
before_action :fetch_pricing, only: [:show, :update, :destroy]
|
|
|
|
def index
|
|
render json: @pricings
|
|
end
|
|
|
|
def show
|
|
render json: @pricing
|
|
end
|
|
|
|
def create
|
|
inbox_ids_param = params[:pricing][:inbox_ids]
|
|
|
|
if inbox_ids_param.is_a?(Array) && inbox_ids_param.present?
|
|
render json: create_for_multiple_inboxes(inbox_ids_param)
|
|
else
|
|
render json: create_single_pricing
|
|
end
|
|
rescue StandardError => e
|
|
Rails.logger.error "Error creating pricing: #{e.message}"
|
|
Rails.logger.error e.backtrace.join("\n")
|
|
render json: { error: e.message }, status: :unprocessable_entity
|
|
end
|
|
|
|
def update
|
|
# On update, if multiple inboxes are passed, we technically can't 'split' this ID.
|
|
# We assume usage of the first inbox or nil.
|
|
# If the user wants to assign to multiple, they should create new ones.
|
|
target_inbox_id = params[:pricing][:inbox_ids]&.first
|
|
|
|
@pricing.update!(pricing_params.merge(inbox_id: target_inbox_id))
|
|
render json: @pricing
|
|
rescue StandardError => e
|
|
render json: { error: e.message }, status: :unprocessable_entity
|
|
end
|
|
|
|
def destroy
|
|
@pricing.destroy!
|
|
head :ok
|
|
end
|
|
|
|
private
|
|
|
|
def fetch_pricing
|
|
@pricing = current_account.captain_pricings.find(params[:id])
|
|
end
|
|
|
|
def fetch_pricings
|
|
@pricings = current_account.captain_pricings.order(created_at: :desc)
|
|
|
|
# Filter by inbox if provided (returns Specific Inbox + Global rules)
|
|
@pricings = @pricings.where(inbox_id: [params[:inbox_id], nil]) if params[:inbox_id].present?
|
|
|
|
return if params[:query].blank?
|
|
|
|
# Fuzzy search using ILIKE for case-insensitive matching
|
|
@pricings = @pricings.left_outer_joins(:captain_brand).where(
|
|
'suite_category ILIKE :query OR captain_brands.name ILIKE :query',
|
|
query: "%#{params[:query]}%"
|
|
)
|
|
end
|
|
|
|
def pricing_params
|
|
params.require(:pricing).permit(:captain_brand_id, :day_range, :suite_category, :duration, :price)
|
|
end
|
|
|
|
def create_for_multiple_inboxes(inbox_ids)
|
|
last_pricing = nil
|
|
ActiveRecord::Base.transaction do
|
|
inbox_ids.each do |iid|
|
|
pricing = current_account.captain_pricings.new(pricing_params)
|
|
pricing.inbox_id = iid.to_i
|
|
pricing.save!
|
|
last_pricing = pricing
|
|
end
|
|
end
|
|
last_pricing
|
|
end
|
|
|
|
def create_single_pricing
|
|
@pricing = current_account.captain_pricings.new(pricing_params)
|
|
@pricing.inbox_id = nil
|
|
@pricing.save!
|
|
@pricing
|
|
end
|
|
end
|