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 |