Files
astuto/app/controllers/posts_controller.rb

113 lines
2.9 KiB
Ruby
Raw Normal View History

2019-09-02 14:32:57 +02:00
class PostsController < ApplicationController
2019-09-12 15:51:45 +02:00
before_action :authenticate_user!, only: [:create, :update]
2019-09-02 19:26:34 +02:00
2019-09-04 17:37:08 +02:00
def index
2019-09-02 19:26:34 +02:00
posts = Post
2019-09-27 15:48:21 +02:00
.select(
:id,
:title,
:description,
:post_status_id,
'COUNT(DISTINCT likes.id) AS likes_count',
'COUNT(DISTINCT comments.id) AS comments_count',
'((LOG(COUNT(DISTINCT likes.id) + 1) + LOG(COUNT(DISTINCT comments.id) + 1)) + (EXTRACT(EPOCH FROM posts.created_at) / 45000)) AS hotness',
"(SELECT COUNT(*) AS liked FROM likes WHERE likes.user_id=#{current_user ? current_user.id : -1} AND likes.post_id=posts.id)"
)
.left_outer_joins(:likes)
.left_outer_joins(:comments)
.group('posts.id')
2019-09-03 12:58:44 +02:00
.where(filter_params)
.search_by_name_or_description(params[:search])
2019-09-27 15:48:21 +02:00
.order('hotness DESC')
2019-09-04 21:12:07 +02:00
.page(params[:page])
2019-09-02 19:26:34 +02:00
render json: posts
2019-09-02 19:26:34 +02:00
end
2019-09-02 14:32:57 +02:00
def create
post = Post.new(post_params)
if post.save
Follow.create(post_id: post.id, user_id: current_user.id)
render json: post, status: :created
2019-09-02 14:32:57 +02:00
else
render json: {
error: post.errors.full_messages
}, status: :unprocessable_entity
2019-09-02 14:32:57 +02:00
end
end
2019-09-12 15:51:45 +02:00
def show
@post = Post.find(params[:id])
2019-09-19 14:00:34 +02:00
@post_statuses = PostStatus.select(:id, :name, :color).order(order: :asc)
2019-09-27 11:40:33 +02:00
@board = @post.board
2019-09-12 15:51:45 +02:00
respond_to do |format|
format.html
format.json { render json: @post }
end
end
def update
post = Post.find(params[:id])
2019-09-16 19:38:56 +02:00
if !current_user.power_user? && current_user.id != post.user_id
render json: t('backend.errors.unauthorized'), status: :unauthorized
2019-09-12 18:03:19 +02:00
return
2019-09-12 15:51:45 +02:00
end
2019-09-21 12:54:57 +02:00
post.board_id = params[:post][:board_id] if params[:post].has_key?(:board_id)
post_status_changed = false
if params[:post].has_key?(:post_status_id) and
params[:post][:post_status_id] != post.post_status_id
post_status_changed = true
post.post_status_id = params[:post][:post_status_id]
end
2019-09-12 15:51:45 +02:00
if post.save
if post_status_changed
PostStatusChange.create(
user_id: current_user.id,
post_id: post.id,
post_status_id: post.post_status_id
)
send_notifications(post)
end
2019-09-12 15:51:45 +02:00
render json: post, status: :no_content
else
render json: {
error: post.errors.full_messages
2019-09-12 15:51:45 +02:00
}, status: :unprocessable_entity
end
end
2019-09-02 14:32:57 +02:00
private
2019-09-03 12:58:44 +02:00
def filter_params
2019-09-05 17:11:07 +02:00
defaults = { board_id: Board.first.id }
2019-09-04 17:37:08 +02:00
params
.permit(:board_id, :post_status_id, :page, :search)
2019-09-04 17:37:08 +02:00
.with_defaults(defaults)
.except(:page, :search)
2019-09-03 12:58:44 +02:00
end
2019-09-02 14:32:57 +02:00
def post_params
params
.require(:post)
.permit(:title, :description, :board_id)
.merge(user_id: current_user.id)
2019-09-02 14:32:57 +02:00
end
def send_notifications(post)
UserMailer.notify_followers_of_post_status_change(post: post).deliver_later
end
2019-09-02 14:32:57 +02:00
end