chatwoot-develop/app/controllers/api/v1/accounts/captain/pricings_controller.rb

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