forked from jasder/forgeplus
92 lines
2.6 KiB
Ruby
92 lines
2.6 KiB
Ruby
|
class LibrariesController < ApplicationController
|
||
|
include PaginateHelper
|
||
|
|
||
|
before_action :require_login, :check_auth, except: %i[index show]
|
||
|
before_action :check_account, except: %i[index show]
|
||
|
after_action :increment_visit_count, only: [:show, :edit, :update]
|
||
|
helper_method :current_library, :library_manageable?
|
||
|
|
||
|
def index
|
||
|
libraries = current_laboratory.libraries
|
||
|
|
||
|
libraries =
|
||
|
if User.current&.logged? && params[:type] == 'mine'
|
||
|
libraries.where(user_id: current_user.id).order(created_at: :desc)
|
||
|
else
|
||
|
libraries.where(status: :published).order(visited_count: :desc)
|
||
|
end
|
||
|
|
||
|
keyword = params[:keyword].to_s.strip
|
||
|
if keyword.present?
|
||
|
libraries = libraries.where('title LIKE :keyword OR author_name LIKE :keyword OR author_school_name LIKE :keyword',
|
||
|
keyword: "%#{keyword}%")
|
||
|
end
|
||
|
|
||
|
@count = libraries.count
|
||
|
@libraries = paginate libraries.includes(:library_tags, user: :user_extension)
|
||
|
|
||
|
ids = @libraries.map(&:id)
|
||
|
@download_count_map = Attachment.where(container_type: 'Library', container_id: ids)
|
||
|
.group(:container_id).sum(:downloads)
|
||
|
end
|
||
|
|
||
|
def show
|
||
|
unless current_library.published? || library_manageable?(current_library)
|
||
|
return render_forbidden
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def create
|
||
|
library = current_user.libraries.new
|
||
|
Libraries::SaveService.call(library, current_user, save_params)
|
||
|
render_ok({id: library.id})
|
||
|
rescue Libraries::SaveService::Error => ex
|
||
|
render_error(ex.message)
|
||
|
end
|
||
|
|
||
|
def update
|
||
|
return render_forbidden unless library_manageable?(current_library)
|
||
|
|
||
|
Libraries::SaveService.call(current_library, current_user, save_params)
|
||
|
render_ok({id: current_library.id})
|
||
|
rescue Libraries::SaveService::Error => ex
|
||
|
render_error(ex.message)
|
||
|
end
|
||
|
|
||
|
def destroy
|
||
|
if admin_or_business?
|
||
|
current_library.destroy!
|
||
|
elsif current_library.user_id == current_user&.id
|
||
|
unless current_library.pending?
|
||
|
render_error('只有草稿才能删除')
|
||
|
return
|
||
|
end
|
||
|
|
||
|
current_library.destroy!
|
||
|
else
|
||
|
render_forbidden
|
||
|
return
|
||
|
end
|
||
|
|
||
|
render_ok
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def current_library
|
||
|
@_current_library ||= Library.find(params[:id])
|
||
|
end
|
||
|
|
||
|
def library_manageable?(library)
|
||
|
current_user&.id == library.user_id || admin_or_business?
|
||
|
end
|
||
|
|
||
|
def increment_visit_count
|
||
|
current_library.increment_visited_count! if current_library && current_library.id
|
||
|
end
|
||
|
|
||
|
def save_params
|
||
|
params.permit(:title, :content, :author_name, :author_school_name,
|
||
|
:cover_id, :publish, attachment_ids: [], tag_ids: [])
|
||
|
end
|
||
|
end
|