79 lines
1.7 KiB
Ruby
79 lines
1.7 KiB
Ruby
class BooksController < ApplicationController
|
|
allow_unauthenticated_access only: %i[ index show ]
|
|
|
|
before_action :ensure_index_is_not_empty, only: :index
|
|
before_action :set_book, only: %i[ show edit update destroy ]
|
|
before_action :set_users, only: %i[ new edit ]
|
|
before_action :ensure_editable, only: %i[ edit update destroy ]
|
|
|
|
def index
|
|
@books = Book.accessable_or_published.ordered
|
|
end
|
|
|
|
def new
|
|
@book = Book.new
|
|
end
|
|
|
|
def create
|
|
book = Book.create! book_params
|
|
update_accesses(book)
|
|
|
|
redirect_to book_slug_url(book)
|
|
end
|
|
|
|
def show
|
|
@leaves = @book.leaves.active.with_leafables.positioned
|
|
end
|
|
|
|
def edit
|
|
end
|
|
|
|
def update
|
|
@book.update(book_params)
|
|
update_accesses(@book)
|
|
remove_cover if params[:remove_cover] == "true"
|
|
|
|
redirect_to book_slug_url(@book)
|
|
end
|
|
|
|
def destroy
|
|
@book.destroy
|
|
|
|
redirect_to root_url
|
|
end
|
|
|
|
private
|
|
def set_book
|
|
@book = Book.accessable_or_published.find params[:id]
|
|
end
|
|
|
|
def set_users
|
|
@users = User.active.ordered
|
|
end
|
|
|
|
def ensure_editable
|
|
head :forbidden unless @book.editable?
|
|
end
|
|
|
|
def ensure_index_is_not_empty
|
|
if !signed_in? && Book.published.none?
|
|
require_authentication
|
|
end
|
|
end
|
|
|
|
def book_params
|
|
params.require(:book).permit(:title, :subtitle, :author, :cover, :remove_cover, :everyone_access, :theme)
|
|
end
|
|
|
|
def update_accesses(book)
|
|
editors = [ Current.user.id, *params[:editor_ids]&.map(&:to_i) ]
|
|
readers = [ Current.user.id, *params[:reader_ids]&.map(&:to_i) ]
|
|
|
|
book.update_access(editors: editors, readers: readers)
|
|
end
|
|
|
|
def remove_cover
|
|
@book.cover.purge
|
|
end
|
|
end
|