parent
3cf598eeec
commit
69f958c647
@ -0,0 +1,17 @@
|
||||
class Users::ProjectPackagesController < Users::BaseController
|
||||
|
||||
def index
|
||||
packages = Users::ProjectPackageService.call(observed_user, query_params)
|
||||
|
||||
@count = packages.count
|
||||
@packages = paginate(packages.includes(:project_package_category))
|
||||
|
||||
bidding_users = BiddingUser.where(project_package_id: @packages.map(&:id), user_id: observed_user.id)
|
||||
bidding_users = bidding_users.group(:project_package_id).select(:project_package_id, :status)
|
||||
@bidding_status_map = bidding_users.each_with_object({}) { |u, h| h[u.project_package_id] = u.status }
|
||||
end
|
||||
|
||||
def query_params
|
||||
params.permit(:category, :status, :sort_by, :sort_direction)
|
||||
end
|
||||
end
|
@ -0,0 +1,76 @@
|
||||
class Users::ProjectPackageService < ApplicationService
|
||||
include CustomSortable
|
||||
|
||||
sort_columns :published_at, default_by: :published_at, default_direction: :desc
|
||||
|
||||
attr_reader :user, :params
|
||||
|
||||
def initialize(user, params)
|
||||
@user = user
|
||||
@params = params
|
||||
end
|
||||
|
||||
def call
|
||||
packages = category_scope_filter
|
||||
|
||||
packages = user_policy_filter(packages)
|
||||
|
||||
custom_sort(packages, :published_at, params[:sort_direction])
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def category_scope_filter
|
||||
case params[:category]
|
||||
when 'bidden' then
|
||||
user.bidden_project_packages
|
||||
when 'manage' then
|
||||
user.project_packages
|
||||
else
|
||||
ids = user.bidding_users.pluck(:project_package_id) + user.project_packages.pluck(:id)
|
||||
ProjectPackage.where(id: ids)
|
||||
end
|
||||
end
|
||||
|
||||
def user_policy_filter(relations)
|
||||
if self_or_admin?
|
||||
status_filter(relations)
|
||||
else
|
||||
relations.visible
|
||||
end
|
||||
end
|
||||
|
||||
def status_filter(relations)
|
||||
return relations unless self_or_admin?
|
||||
|
||||
case params[:category]
|
||||
when 'bidden' then bidding_status_filter(relations)
|
||||
when 'manage' then package_status_filter(relations)
|
||||
else relations
|
||||
end
|
||||
end
|
||||
|
||||
def bidding_status_filter(relations)
|
||||
case params[:status]
|
||||
when 'bidding_lost' then
|
||||
relations.where(bidding_users: { status: :bidding_lost })
|
||||
when 'bidding_won' then
|
||||
relations.where(bidding_users: { status: :bidding_won })
|
||||
else
|
||||
relations
|
||||
end
|
||||
end
|
||||
|
||||
def package_status_filter(relations)
|
||||
case params[:status]
|
||||
when 'unpublished' then relations.invisible
|
||||
when 'bidding' then relations.where(status: :published)
|
||||
when 'finished' then relations.where(status: %w[bidding_ended bidding_finished])
|
||||
else relations
|
||||
end
|
||||
end
|
||||
|
||||
def self_or_admin?
|
||||
User.current&.id == user.id || User.current&.admin_or_business?
|
||||
end
|
||||
end
|
@ -0,0 +1,20 @@
|
||||
user = observed_user
|
||||
|
||||
json.count @count
|
||||
json.project_packages do
|
||||
json.array! @packages.each do |package|
|
||||
json.extract! package, :id, :title, :status, :min_price, :max_price, :visit_count, :bidding_users_count
|
||||
|
||||
is_creator = user.id == package.creator_id
|
||||
json.type is_creator ? 'manage' : 'bidden'
|
||||
json.category_id package.project_package_category_id
|
||||
json.category_name package.category_name
|
||||
|
||||
unless is_creator
|
||||
json.bidden_status @bidding_status_map[package.id]
|
||||
end
|
||||
|
||||
json.deadline_at package.display_deadline_at
|
||||
json.published_at package.display_published_at
|
||||
end
|
||||
end
|
Loading…
Reference in new issue