117 lines
2.9 KiB
Ruby
117 lines
2.9 KiB
Ruby
class PostsController < ApplicationController
|
|
has_scope :by_category, as: :cat
|
|
has_scope :tagged_with, as: :tag
|
|
has_scope :by_organization, as: :org
|
|
|
|
def index
|
|
context = model.active.of_active_members
|
|
|
|
if current_organization.present?
|
|
context = context.where(
|
|
organization_id: current_organization.id
|
|
)
|
|
end
|
|
|
|
posts = apply_scopes(context)
|
|
posts = posts.search_by_query(params[:q]) if params[:q].present?
|
|
posts = posts.page(params[:page]).per(25)
|
|
|
|
instance_variable_set("@#{resources}", posts)
|
|
end
|
|
|
|
def new
|
|
post = model.new
|
|
post.user = current_user
|
|
instance_variable_set("@#{resource}", post)
|
|
end
|
|
|
|
def create
|
|
post = model.new(post_params)
|
|
post.organization = current_organization
|
|
|
|
persister = ::Persister::PostPersister.new(post)
|
|
|
|
if persister.save
|
|
redirect_to send("#{resource}_path", post)
|
|
else
|
|
instance_variable_set("@#{resource}", post)
|
|
render action: :new
|
|
end
|
|
end
|
|
|
|
def edit
|
|
post = current_organization.posts.find params[:id]
|
|
instance_variable_set("@#{resource}", post)
|
|
end
|
|
|
|
def show
|
|
post = Post.active.of_active_members.find(params[:id])
|
|
update_current_organization!(post.organization)
|
|
|
|
instance_variable_set("@#{resource}", post)
|
|
end
|
|
|
|
def update
|
|
post = current_organization.posts.find params[:id]
|
|
authorize post
|
|
instance_variable_set("@#{resource}", post)
|
|
|
|
persister = ::Persister::PostPersister.new(post)
|
|
|
|
if persister.update(post_params)
|
|
redirect_to post
|
|
else
|
|
render action: :edit, status: :unprocessable_entity
|
|
end
|
|
end
|
|
|
|
def destroy
|
|
post = current_organization.posts.find params[:id]
|
|
authorize post
|
|
redirect_to send("#{resources}_path") if post.update!(active: false)
|
|
end
|
|
|
|
private
|
|
|
|
def resource
|
|
controller_name.singularize
|
|
end
|
|
|
|
def resources
|
|
controller_name
|
|
end
|
|
|
|
def set_user_id(p)
|
|
if current_user.manages?(current_organization)
|
|
p.reverse_merge! user_id: current_user.id
|
|
else
|
|
p.merge! user_id: current_user.id
|
|
end
|
|
end
|
|
|
|
def post_params
|
|
permitted_fields = [:description, :end_on, :start_on, :title, :category_id,
|
|
:user_id, :is_group, :active, tag_list: []]
|
|
|
|
params.fetch(resource, {}).permit(*permitted_fields).tap do |p|
|
|
set_user_id(p)
|
|
end
|
|
end
|
|
|
|
# TODO: remove this horrible hack ASAP
|
|
#
|
|
# This hack set the current organization to the post's
|
|
# organization, both in session and controller instance variable.
|
|
#
|
|
# Before changing the current organization it's important to check that
|
|
# the current_user is an active member of the organization.
|
|
#
|
|
# @param organization [Organization]
|
|
def update_current_organization!(organization)
|
|
return unless current_user && current_user.active?(organization)
|
|
|
|
session[:current_organization_id] = organization.id
|
|
@current_organization = organization
|
|
end
|
|
end
|