app/controllers/georgia/pages_controller.rb in georgia-0.7.8 vs app/controllers/georgia/pages_controller.rb in georgia-0.8.0
- old
+ new
@@ -1,36 +1,52 @@
module Georgia
class PagesController < ApplicationController
include Georgia::Concerns::Helpers
- # load_and_authorize_resource class: Georgia::Page
-
before_filter :prepare_new_page, only: [:search]
before_filter :prepare_page, only: [:show, :edit, :settings, :update, :copy, :preview, :draft]
def show
- redirect_to [:edit, @page]
+ if @page
+ authorize @page
+ redirect_to edit_page_revision_path(@page, @page.current_revision)
+ else
+ authorize Georgia::Page
+ redirect_to [:search, model], alert: "This #{instance_name} has been deleted."
+ end
end
# Edit current revision
def edit
- redirect_to [:edit, @page, @page.current_revision]
+ if @page and @page.current_revision
+ authorize @page
+ redirect_to edit_page_revision_path(@page, @page.current_revision)
+ else
+ authorize Georgia::Page
+ redirect_to [:search, model], alert: "This #{instance_name} has been deleted."
+ end
end
# Edit current page
def settings
+ authorize @page
+ @revision = @page.current_revision
+ @activities = @page.activities.order(created_at: :desc)
+ @awaiting_revisions = @page.revisions.where(status: Georgia::Revision.statuses[:review])
end
# Create page, load first current revision and js redirect to revisions#edit
def create
@page = model.new(slug: params[:title].try(:parameterize))
+ authorize @page
if @page.save
- @page.revisions.create(template: Georgia.templates.first) do |rev|
+ @page.revisions.create(template: Georgia.templates.first, revised_by_id: current_user.id, status: :published) do |rev|
rev.contents << Georgia::Content.new(locale: I18n.default_locale, title: params[:title])
end
@page.update_attribute(:current_revision, @page.revisions.first)
+ CreateActivity.new(@page, :create, owner: current_user).call
respond_to do |format|
format.html { redirect_to edit_page_revision_path(@page, @page.current_revision), notice: "#{@page.title} was successfully created." }
format.js { render layout: false }
end
else
@@ -41,96 +57,77 @@
end
end
# Update page settings
def update
- Georgia::Page.update_tree(params[:page_tree]) if params[:page_tree]
- if @page.update_attributes(params[:page])
+ authorize @page
+ model.update_tree(params[:page_tree]) if params[:page_tree]
+ if @page.update(sanitized_params)
+ CreateActivity.new(@page, :update, owner: current_user).call
respond_to do |format|
- format.html { render :settings, notice: "#{@page.title} was successfully updated." }
+ format.html { redirect_to [:settings, @page], notice: "#{@page.title} was successfully updated." }
format.js { head :ok }
end
else
respond_to do |format|
- format.html { redirect_to [:settings, @page], notice: "Oups. Something went wrong." }
+ format.html { redirect_to [:settings, @page], alert: "Oups. Something went wrong." }
format.js { head :internal_server_error }
end
end
end
# Creates a copy of a page and redirects to its revisions#edit
def copy
- @copy = @page.copy
- redirect_to edit_page_revision_path(@copy, @copy.current_revision), notice: "Do not forget to change your url"
+ authorize @page
+ if @copy = CopyPage.new(@page.model).call
+ CreateActivity.new(@page, :copy, owner: current_user).call
+ redirect_to edit_page_revision_path(@copy, @copy.current_revision), notice: "#{instance_name.humanize} successfully copied. Do not forget to change your url"
+ else
+ render_error("Oups. Something went wrong.")
+ end
end
# Destroys page and its revisions from page
# Also used to destroy multiple pages from table checkboxes
def destroy
back_url = url_for(controller: controller_name, action: :search)
@pages = model.where(id: params[:id])
+ authorize @pages
+ message = @pages.length > 1 ? "#{instance_name.humanize.pluralize(@pages.length)} successfully deleted." : "#{@pages.first.title} successfully deleted."
if @pages.destroy_all
- respond_to do |format|
- format.html { redirect_to back_url, notice: "#{instance_name.humanize} successfully deleted." }
- format.js { head :ok }
- end
+ render_success(message, redirect_url: [:search, model])
else
- respond_to do |format|
- format.html { redirect_to back_url, alert: "Oups. Something went wrong." }
- format.js { head :internal_server_error }
- end
+ render_error("Oups. Something went wrong.")
end
end
- # Flush cache from multiple pages
- def flush_cache
- @pages = model.where(id: params[:id])
- @cache_keys = @pages.map(&:cache_key)
- unless @cache_keys.map{|k| expire_action(k)}.include?(false)
- respond_to do |format|
- format.html { redirect_to :back, notice: "Cache was successfully cleared." }
- format.js { head :ok }
- end
- else
- respond_to do |format|
- format.html { redirect_to :back, alert: "Oups. Either there wasn't any cache to start with or something went wrong." }
- format.js { head :internal_server_error }
- end
- end
- end
-
# Publishes multiple pages from table checkboxes
def publish
- @pages = model.where(id: params[:id])
-
+ set_pages
+ authorize @pages
unless @pages.map(&:publish).include?(false)
- respond_to do |format|
- format.html { redirect_to :back, notice: "Successfully published." }
- format.js { head :ok }
+ @pages.each do |page|
+ CreateActivity.new(page, :publish, owner: current_user).call
end
+ render_success("Successfully published.")
else
- respond_to do |format|
- format.html { redirect_to :back, alert: "Oups. Something went wrong." }
- format.js { head :internal_server_error }
- end
+ render_error("Oups. Something went wrong.")
end
end
- # Unpublishes the page
+ # Unpublishes multiple pages from table checkboxes
def unpublish
- @pages = model.where(id: params[:id])
+ set_pages
+ authorize @pages
unless @pages.map(&:unpublish).include?(false)
- respond_to do |format|
- format.html { redirect_to :back, notice: "Successfully unpublished." }
- format.js { head :ok }
+ @pages.each do |page|
+ CreateActivity.new(page, :unpublish, owner: current_user).call
end
+ render_success("Successfully unpublished.")
else
- respond_to do |format|
- format.html { redirect_to :back, alert: "Oups. Something went wrong." }
- format.js { head :internal_server_error }
- end
+ render_error("Oups. Something went wrong.")
end
end
# Sorts subpages/children from pages#settings
# FIXME: This should be taken care of in pages#update
@@ -142,26 +139,69 @@
end
render nothing: true
end
def index
- redirect_to search_pages_path
+ authorize model
+ redirect_to [:search, model]
end
def search
+ authorize model
session[:search_params] = params
- @search = Georgia::Indexer.adapter.search(model, params)
- @pages = Georgia::PageDecorator.decorate_collection(@search.results)
+ if model.count > 0
+ search_conditions = model.search_conditions(params)
+ @search = model.search(search_conditions).page(params[:page])
+ @pages = Georgia::PageDecorator.decorate_collection(@search.records)
+ else
+ @pages = []
+ end
end
private
def prepare_new_page
@page = model.new
end
def prepare_page
- @page = model.find(params[:id]).decorate
+ @page = model.where(id: params[:id]).first.try(:decorate)
+ end
+
+ def page_params
+ params.require(:page).permit(permitted_keys)
+ end
+
+ def sanitized_params
+ ParseJsonTags.new(page_params).call
+ end
+
+ def permitted_keys
+ [:slug, :parent_id, :tag_list]
+ end
+
+ def set_pages
+ @pages = model.where(id: params[:id])
+ end
+
+ def render_success success_message, redirect_url: :back
+ @status_message = success_message
+ @status = :notice
+ respond_to do |format|
+ format.html { redirect_to redirect_url, notice: @status_message }
+ format.js { render layout: false }
+ format.json { render json: { ids: @pages.map(&:id), message: @status_message, status: @status } }
+ end
+ end
+
+ def render_error error_message
+ @status_message = error_message
+ @status = :alert
+ respond_to do |format|
+ format.html { redirect_to :back, alert: @status_message }
+ format.js { render layout: false }
+ format.json { render json: { message: @status_message, status: @status } }
+ end
end
end
end