Files
timeoverflow/app/controllers/posts_controller.rb
Marc Anguera Insa 8870afe53c Upgrade to Ruby 3 💫
2023-12-08 18:47:40 +01:00

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