|
- 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
|