forgeplus/app/services/memos_service.rb

842 lines
34 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# encoding=utf-8
class MemosService
include ApplicationHelper
include ApiIndexHelper
include ActionView::Helpers::NumberHelper
LIMIT = 10
def index params, current_user
page = params[:page].to_i > 0 ? (params[:page].to_i - 1) : 0
index_limit = params[:limit] || 5
offset = page * index_limit.to_i
search = params[:search].to_s.strip
sort_name = params[:sort] || "published_at"
all_memos = Memo&.visible&.roots
all_hottest_memos = all_memos.hottest_five_memos
hottest_memos = object_to_hash(all_hottest_memos)
all_recommend_memos = all_memos.recommend_five_memos
recommend_memos = object_to_hash(all_recommend_memos)
if search.present?
all_memos = all_memos.where("subject like ?", "%#{search}%")
end
memos_count = all_memos.size # 帖子的总数
all_memos = all_memos.order_index(sort_name)&.includes(:forum_section,author: :user_extension).limit(index_limit).offset(offset)
memo_lists = get_memo_lists(all_memos, false, current_user, false)
{status: 0,limit: index_limit, memos_count: memos_count,
hottest_memos: hottest_memos, recommend_memos: recommend_memos, memos: memo_lists}
end
def related_memos params, current_user
memo = Memo.find(params[:id])
return { status: 404 } if memo.hidden? && (!current_user || !(current_user.admin? || current_user.id == memo.author_id))
all_memos = Memo.visible.roots.where("id != ?", params[:id].to_i).includes(memo_forums: :forum_section,author: :user_extension).related_search_name(memo.try(:subject).to_s).order_index("published_at").limit(5).offset(0)
memo_lists = get_memo_lists(all_memos, false, current_user, false)
{status: 0, memos: memo_lists}
end
def new params, current_user, session
return {status: -1, message: "您的账户已被禁言,如有疑问请联系版主或论坛管理员"} if user_is_banned?(current_user)
csrf_token = session[:_csrf_token] ||= SecureRandom.base64(32)
params_section = {}
if params[:section_id].present?
current_forum_section = ForumSection.find_by_id(params[:section_id])
params_section = {
id: current_forum_section.id,
title: current_forum_section.title,
parent_section_id: current_forum_section.ancestry,
parent_section_title: current_forum_section&.parent&.try(:title)
}
end
{status:0,:csrf_token => csrf_token, params_section: params_section}
end
# params 直接传params[:memo][:subject]
# subject标题
# content内容
# forum_id 话题类型
# sticky 是否置顶(创建时没入口)
# repertoire_name + language 技术标签
# attachments 附件
# attachment_id 是帖子的头像
def create params, current_user
return {status: -1, message: "请填写必填的内容"} if params[:memo][:subject].blank? || params[:memo][:content].blank? || params[:forum_id].blank? || params[:memo][:tag_id].blank? || params[:memo][:is_original].blank?
# elsif params[:memo][:content].length > 2000
# {status: -1, message: "不能超过2000个字符"}
return {status: -1, message: "您的账户已被禁言,如有疑问请联系版主或论坛管理员"} if user_is_banned?(current_user)
return {status: 1, message: "帖子创建成功,请等待管理员审核。。。"} if ["智库百科", "新百胜", "第一财经", "秒懂百科"].select { |t| params[:memo][:subject].to_s.include?(t) }.size > 0
begin
memo = Memo.new(params[:memo])
memo.author = current_user
memo.forum_section_id = params[:children_forum_id].present? ? params[:children_forum_id] : params[:forum_id]
memo.published_at = Time.now if params[:memo][:published_at].blank?
memo.hidden = false
# memo.save!
if memo.save!
memo.update_attachments(params[:attachments]) if params[:attachments].present?
# 为了区分帖子头像改变其类型为MemoIcon
create_user_tidings(memo, "forum_post")
if params[:attachment_id]
attachment = Attachment.find(params[:attachment_id])
attachment.update_attributes(:container_id => memo.id, :container_type => "Memo", :memo_image => true)
end
{status: 1, message: "帖子创建成功,请等待管理员审核", memo_id: memo.id}
else
{status: -1, message: memo.errors.messages.values[0][0]}
end
rescue => e
{status: -1, message: e}
end
end
def show_simple params, current_user
memo = Memo.find(params[:id])
memo_info = {id: memo.id,
subject: memo.subject,
published_time: rename_time_minute(memo.published_at),
viewed_count: memo.viewed_count, #浏览
}
{status: 0, memo: memo_info}
end
# params
# :id 帖子id
# return
# :memo 帖子
# :memo_replies 帖子的回复
# :recommend_shixun 推荐实训
# :admin 当前用户是否是管理员
# :author_info 表示当前帖子用户的信息
def show params, current_user
memo = Memo.find(params[:id])
return { status: 404 } if memo.hidden? && !(current_user.admin? || current_user.id == memo.author_id)
# return { status: 404 } if memo.hidden? && (!current_user || !(current_user.admin? || current_user.id == memo.author_id))
is_banned = user_is_banned?(current_user)
forum_section = memo&.forum_section
watcher_params = {
visitable_type: "Memo",
visitable_id: params[:id],
user_id: current_user.id
}
#帖子的二级分类
forum_tag = {
title: forum_section.try(:title),
id: forum_section.try(:id)
}
# 消息总数
attachments_list = acttachements_info memo.attachments.where(:memo_image => false)
memo_image = memo.attachments.where(:memo_image => true).first
memo_image_info = {:id => memo_image.id, :filename => memo_image.filename, :url => "/attachments/download/" + "#{memo_image.id}" + "/" + "#{memo_image.filename}",
:filesize => memo_image.filesize} if memo_image
user_praise = PraiseTread.is_user_praise(memo.id, "Memo", current_user.try(:id)).exists?
memo.update_column(:viewed_count, memo.viewed_count + 1) if params[:only_data].blank?
# 帖子的回复
memos = memo.reply_for_memo
unless current_user.try(:admin?) # 只有管理员和发布人能看到隐藏的回复
memos = memos.where("hidden = false or (hidden = true and author_id = ?)", current_user.try(:id))
end
memo_author = memo.author
memo_author_memos = memo_author.memos.visible.roots
memos = memos.includes(:praise_tread, :author).order_index("created_at").limit(LIMIT)
watched = memo_author.watched_by?(current_user)
banned_permission = user_banned_permission current_user, memo.forum_section_id #当前用户是否具有禁言的权限
memo_watched = memo.watched_by?(current_user)
# list = memo_list memos, current_user
is_md = memo.is_md
author_info = {username: memo_author.show_real_name,
watched: watched,
is_blocked: current_user&.blocked_for(memo_author.id),
is_blocked_by: memo_author&.blocked_for(current_user.id),
image_url: "#{url_to_avatar(memo_author, true)}",
identity: memo_author.identity,
login: memo_author.login,
user_id: memo_author.id,
description: memo_author&.user_extension&.brief_introduction,
memos_count: memo_author_memos.posts.size,
replies_count: memo_author_memos.total_replies.size,
watchers_count: memo_author.fan_count,
current_login: current_user.try(:login),
current_image_url: current_user.try(:login).present? ? "#{url_to_avatar(current_user, true)}" : "/images/avatars/User/b",
is_current_user: memo.author_id == current_user.try(:id)
}
recent_memos = memo_author_memos.posts.where("id != ?", params[:id].to_i).order_index("published_at").select([:id,:subject]).limit(3).as_json
memo_info = {id: memo.id,
subject: memo.subject,
is_md: is_md,
content: memo.content,
time: time_from_now(memo.published_at.present? ? memo.published_at : memo.created_at),
published_time: rename_time_minute(memo.published_at),
hidden: memo.hidden,
memo_watched: memo_watched,
forum_tag: forum_tag, #类型
sticky: memo.sticky, # 置顶 1
is_fine: memo.is_fine, #是否加精
viewed_count: memo.viewed_count, #浏览
replies_count: memo.can_see_reply_count(current_user), #回复
praises_count: memo.praises_count, #赞数
reward: memo.reward,
attachment_url: attachments_list,
user_praise: user_praise,
tag_name: memo.meno_tag_name,
is_original: memo.is_original,
reprint_link: memo.reprint_link,
apply_destroy: current_user&.id == memo.author_id && memo.apply_destroy?,
}
if current_user
#TODO 通知消息暂时隐藏
# unless memo.children.blank?
# memo.children.includes(:memo_messages).each do |child|
# child.memo_messages.each do |memo_message|
# memo_message.update_attributes(:viewed => true) if current_user.id == memo_message.user_id
# end
# end
# end
# query_memo_messages = memo.memo_messages
# unless query_memo_messages
# query_memo_messages.each do |query_memo_message|
# query_memo_message.update_attributes(:viewed => true) if current_user.id == query_memo_message.user_id
# end
# end
if memo.author_id != current_user.id
if memo.visit_actions.exists?(watcher_params)
memo.visit_actions.where(watcher_params).first.update_attribute(:updated_at,Time.now)
else
VisitAction.create!(watcher_params)
end
end
end
{status: 0, memo: memo_info, author_info: author_info, memo_image_info: memo_image_info,
recent_memos: recent_memos,banned_permission: banned_permission, is_banned: is_banned, is_current_admin: current_user&.admin?, current_login: current_user&.login}
end
def more_reply params, current_user
page = params[:page].to_i > 0 ? (params[:page].to_i - 1) : 0
limit = params[:limit] || 10
offset = page * limit.to_i
memo_id = params[:id]
memo = Memo.find(memo_id)
memos = memo.reply_for_memo
unless current_user.try(:admin?) # 只有管理员和发布人能看到隐藏的回复
memos = memos.where("hidden = false or (hidden = true and author_id = ?)", current_user.try(:id))
end
# 总数,分页使用
# memos_all = Memo.where(parent_id: memo_id, hidden: false)
memos_count = memos.count
memos = memos.includes(:praise_tread, :author).order_index("created_at").limit(limit).offset(offset)
list = memo_list memos, current_user
{:memo_replies => list, :memos_count => memos_count}
end
def confirm_delete params, current_user
memo = Memo.find(params[:id])
return {status: 404} unless memo.present?
return {status: -1, message: "您没有权限操作!"} unless current_user&.id == memo.author_id
if params[:is_apply].to_i == 1 #表示申请操作
memo.apply_destroy!
memo.save!
Tiding.create!(:user_id => 1, :trigger_user_id => current_user&.id,
container_id: memo.id, container_type: 'Memo',
:viewed => 0, :tiding_type => "apply_delete", :extra => "d_1")
{status: 1, message: "操作成功"}
else
memo.common!
memo.save!
Tiding.create!(:user_id => 1, :trigger_user_id => current_user&.id,
container_id: memo.id, container_type: 'Memo',
:viewed => 0, :tiding_type => "cancel_delete", :extra => "d_0")
{status: 1, message: "已取消申请删帖"}
end
end
def destroy params, current_user
user_permission = check_banned_permission current_user, params[:id]
memo = Memo.select(:id,:parent_id, :forum_section_id).find(params[:id])
return {status: -1, message: "帖子不存在!"} unless memo.present?
return {status: -1, message: "您没有权限操作!"} unless user_permission
if memo.destroy
{status: 0, message: "帖子删除成功!"}
else
{status: -1, message: "帖子删除失败!"}
end
end
# 隐藏评论功能
def hidden params, current_user
memo = Memo.select([:id, :hidden]).find(params[:id])
if current_user.admin?
if params[:hidden] == "1"
memo.update_attribute(:hidden, true)
elsif params[:hidden] == "0"
memo.update_column("hidden", false)
end
else
raise("你没有权限")
end
end
def edit params, current_user
# memo_type = object_to_hash Forum.select([:id, :name])
# memo_tag = object_to_hash Label.select([:id, :name])
memo = Memo.select([:id, :subject, :content,:author_id,:tag_id, :is_original, :reprint_link, :forum_section_id]).find params[:id]
return {status: -1, message: "帖子不存在"} if memo.blank?
return {status: -1, message: "您的账户已被禁言,如有疑问请联系版主或论坛管理员"} if user_is_banned?(current_user)
return { status: -1, message: "您没有权限编辑" } unless current_user.present? && (current_user.admin? || (current_user.id == memo.author_id) || user_banned_permission(current_user, params[:id]))
attachments_list = acttachements_info memo.attachments.where(:memo_image => false)
memo_image = memo.attachments.where(:memo_image => true).first
memo_image_info = {:id => memo_image.id,
:filename => memo_image.filename,
:url => "/attachments/download/" + "#{memo_image.id}" + "/" + "#{memo_image.filename}",
:filesize => number_to_human_size(memo_image.filesize,significant: false, precision: 2)} if memo_image
banned_permission = user_banned_permission current_user, params[:id]
memo_forum_section = memo&.forum_section
if memo_forum_section&.parent.present?
forum_first = {
forum_id: memo_forum_section&.parent.try(:id),
forum_name: memo_forum_section&.parent.try(:title)
}
children_forum_first = {
children_forum_id: memo_forum_section.try(:id),
children_forum_name: memo_forum_section.try(:title)
}
else
forum_first = {
forum_id: memo_forum_section.try(:id),
forum_name: memo_forum_section.try(:title)
}
children_forum_first = {}
end
memo.attributes.merge!({banned_permission: banned_permission,
attachments_url: attachments_list,
memo_image_info: memo_image_info,
forum_section: forum_first,
children_forum_section: children_forum_first
})
end
def memo_hidden params, current_user
memo = Memo.find params[:id]
if params[:checked].to_s == 'true'
publish_time = Time.now
action_type = "passed"
extra = "1"
else
publish_time = Time.now
action_type = "refuse"
extra = "2"
end
memo.update_attributes(hidden: !(params[:checked].to_s == 'true'), published_at: publish_time) # 勾选代表不隐藏,所以要取反
CheckedAction.create!(user_id: current_user.id,checkable_type: "Memo",checkable_id: params[:id], action_type: action_type, action_at: Time.now)
if !memo.hidden? && memo.parent_id.present? && !memo.tidings.exists?(user_id: memo.parent.author_id,trigger_user_id: memo.author_id, extra: "3")
Tiding.create(:user_id => memo.parent.author_id, :trigger_user_id => memo.author_id,
container_id: memo.id, container_type: 'Memo',
:parent_container_id => memo.root_id, :parent_container_type => "Memo",
:viewed => 0, :tiding_type => "Comment", :extra => "3")
elsif !memo.hidden? && memo.parent_id.blank?
Tiding.create(:user_id => memo.author_id, :trigger_user_id => current_user.id,
container_id: memo.id, container_type: 'Memo',
:viewed => 0, :tiding_type => "Comment",:extra => extra)
end
{status: 1, message: "设置成功", is_hidden: memo.hidden}
end
def update params, current_user
params.permit!
if params[:memo][:subject].blank? || params[:memo][:content].blank? || params[:forum_id].blank?
{status: -1, message: "帖子内容不能为空"}
elsif user_is_banned?(current_user)
{status: -1, message: "您的账户已被禁言,如有疑问请联系版主或论坛管理员"}
else
memo = Memo.find params[:id]
return { status: 404 } if memo.hidden? && (!current_user || !(current_user.admin? || current_user.id == memo.author_id))
memo.update_attributes(params[:memo])
memo.update_attachments(params[:attachments]) if params[:attachments].present?
memo.forum_section_id = params[:children_forum_id].present? ? params[:children_forum_id] : params[:forum_id]
if memo.save!
if params[:attachment_id]
attachment = Attachment.find(params[:attachment_id])
attachment.update_attributes(:container_id => memo.id, :container_type => "Memo", :memo_image => true)
end
{status: 1, message: "帖子更新成功!"}
else
{status: -1, message: memo.errors.messages.values[0][0]}
end
end
end
# params
# parent_id: 给谁的回复id
# content: 回复的内容
def reply params, current_user
memo = Memo.find params[:parent_id]
return {status: -1, message: "您的账户已被禁言,如有疑问请联系版主或论坛管理员"} if user_is_banned?(current_user)
return {status: -1, message: "根据对方设置,暂时不能评论"} if memo.author.blocked_for(current_user&.id)
return { status: 404 } if memo.hidden? && (!current_user || !(current_user.admin? || current_user.id == memo.author_id))
begin
memo_params = {
parent_id: params[:parent_id] || nil,
content: params[:content].to_s,
subject: memo.subject,
author_id: current_user.id,
root_id: memo.root_id || memo.id,
hidden: true
}
reply = Memo.new(memo_params)
if reply.save
memo.update_attribute(:last_reply_on, Time.now)
memo.children << reply
create_user_tidings(reply, "forum_comment")
replies = {:id => reply.id, :content => reply.content, :time => time_from_now(reply.created_at), :user_id => reply.author_id,
:image_url => "#{url_to_avatar(reply.author, true)}", :username => reply.author.show_real_name, :reward => memo.reward, :hidden => reply.hidden,
:praise_count => reply.praises_count,:user_login => reply.author.try(:login), replies_count: reply.can_see_reply_count(current_user)}
{
status: 0,
reply: replies
}
else
{status: -1, message: reply.errors.messages.values[0][0]}
end
rescue => e
{status: -1, message: "出现错误"}
raise ActiveRecord::Rollback
end
end
def watch_memo params, current_user
memo = Memo.find params[:id]
if params[:is_watch] == 1
if Watcher.exists?(watchable_type: "Memo", watchable_id: params[:id], user_id: current_user.id)
w_status = -1
w_msg = "您已收藏"
else
memo_watch = Watcher.new(watchable: memo, user_id: current_user.id)
if memo_watch.save
w_status = 0
w_msg = "收藏成功"
else
w_status = -1
w_msg = "收藏失败,请稍后重试"
end
end
else
if Watcher.exists?(watchable_type: "Memo", watchable_id: params[:id], user_id: current_user.id)
Watcher.where(watchable_type: "Memo", watchable_id: params[:id], user_id: current_user.id).destroy_all
w_status = 0
w_msg = "取消收藏成功"
else
w_status = -1
w_msg = "您还未添加收藏"
end
end
{status: w_status, message: w_msg}
end
# params:
# order 排序
# sticky: 1 置顶,0 取消置顶
# id 帖子ID
def set_top_or_down params, current_user
user_permission = check_banned_permission current_user, params[:id]
s_order = params[:order] || "updated_at"
if user_permission
if Memo.find(params[:id]).update_attribute(:sticky, params[:sticky])
set_status = 0
set_msg = "操作成功"
else
set_status = -1
set_msg = "操作失败"
end
else
set_status = -1
set_msg = "您没有权限"
end
# memos = Memo.field_for_list.includes(:praise_tread, :author, :forums).where(:root_id => nil).order("sticky=1 desc, #{s_order} desc").limit(15)
# memo_list = memo_data memos
{status: set_status, message: set_msg}
end
def plus params, current_user
plus_type = params[:container_type].to_s
plus_id = params[:id]
pt = PraiseTread.where(:praise_tread_object_id => params[:id], :praise_tread_object_type => params[:container_type],
:user_id => current_user, :praise_or_tread => 1).first
# 如果当前用户已赞过,则不能重复赞
if params[:type] == 1 && pt.blank?
if pt.blank?
PraiseTread.create!(:praise_tread_object_id => plus_id, :praise_tread_object_type => plus_type,
:user_id => current_user.id, :praise_or_tread => 1) if pt.blank?
plus_name = plus_type.constantize.find(params[:id])
Tiding.create(:user_id => plus_name.try(:author_id), :trigger_user_id => current_user.id,
container_id: plus_id, container_type: plus_type,
:parent_container_id => plus_id, :parent_container_type => plus_type,
:viewed => 0, :tiding_type => "PraiseTread")
end
else
pt.destroy if pt.present? # 如果已赞过,则删掉这条赞(取消);如果没赞过,则为非法请求不处理
end
{:praise_count => PraiseTread.where(:praise_tread_object_id => params[:id], :praise_tread_object_type => params[:container_type],
:praise_or_tread => 1).count}
end
def banned_user params, current_user
user_permission = check_banned_permission current_user, params[:id]
if user_permission
last_banned_forum = BannedForum.where(user_id: params[:user_id])&.last
user_banned_count = last_banned_forum&.banned_count.to_i
if params[:banned].to_i == 1 #表示禁言
banned_params = {
user_id: params[:user_id],
author_id: current_user.id,
memo_id: params[:id],
is_banned: true,
banned_count: user_banned_count + 1
}
BannedForum.create!(banned_params)
{status: 0, message: "禁言成功"}
else
BannedForum.where(user_id: params[:user_id]).update_all(is_banned: false)
{status: 0, message: "取消禁言成功"}
end
else
{status: -1, message: "您没有权限操作"}
end
end
def is_fine params, current_user
user_permission = check_banned_permission current_user, params[:id]
if user_permission
if params[:is_fine] == 1
is_fine_b = true
else
is_fine_b = false
end
memo = Memo.find(params[:id]).update_attribute(:is_fine, is_fine_b)
if memo
{status: 0, message: "操作成功"}
else
{status: -1, message: "操作失败"}
end
else
{status: -1, message: "您没有权限操作"}
end
end
def forum_memos_head params, current_user
forum_section = ForumSection.find_by_id(params[:id])
return {status: -1, message: "版块不存在"} if forum_section.blank?
section_author = forum_section.user
forum_section_user = {username: section_author.try(:show_real_name), user_login: section_author.try(:login)}
forum_moders = []
if ForumModerator.exists?(forum_section_id: forum_section.id)
all_forum_moderators = forum_section.forum_moderators.includes(user: :user_extension).select([:id, :user_id])
all_forum_moderators.each do |moder|
moder_user = moder.user
forum_moder = {
username: moder_user.show_real_name,
user_login: moder_user.try(:login)
}
forum_moders << forum_moder
end
end
today_memos = forum_section.group_today
publish_today_count = today_memos.roots.size
replies_today_count = today_memos.size - publish_today_count
bread_crumb = get_bread_crumb(forum_section, current_user)
banned_permission = user_banned_permission current_user, params[:id]
watched = forum_section.watched_by?(current_user)
{
watched: watched,
bread_crumb: bread_crumb,
publish_today_count: publish_today_count,
replies_today_count: replies_today_count,
forum_section: single_section_info(forum_section),
forum_section_user: forum_section_user,
forum_moders: forum_moders,
banned_permission: banned_permission
}
end
def forum_memos params, current_user
forum_section = ForumSection.find_by_id(params[:id])
sort_name = params[:sort] || "published_at"
return {status: -1, message: "版块不存在"} if forum_section.blank?
page = params[:page].to_i > 0 ? (params[:page].to_i - 1) : 0
offset = page * LIMIT
all_memos =
if forum_section.is_root?
forum_section_ids = forum_section.child_ids << forum_section.id
Rails.logger.info "######### forum_section_ids: #{forum_section_ids}"
Memo.where(forum_section_id: forum_section_ids)
else
forum_section.memos.posts
end
select_type = params[:select_type]
case select_type.to_s
when "is_fine"
all_memos = all_memos.visible.where(is_fine: true)
when "my_memos"
all_memos = all_memos.where(author_id: current_user.id)
when "my_topics"
my_reply_memos = current_user.memos.visible.select([:id, :author_id, :hidden,:parent_id]).where("parent_id is not Null").pluck(:parent_id).uniq
all_memos = all_memos.where(id: my_reply_memos)
else
all_memos = all_memos.visible
end
if params[:search].present?
all_memos = all_memos.where("subject like '%#{params[:search].to_s.strip}%'")
end
# 总数,分页使用
all_memos = all_memos.order_index(sort_name)
memos_count = all_memos.size
all_memos = all_memos.limit(LIMIT).includes(:author, :praise_tread).offset(offset)
memo_lists = []
if all_memos.size > 0
memo_lists = get_memo_lists(all_memos, true, current_user, false)
end
{
memos_count: memos_count,
limit: LIMIT,
memos: memo_lists,
}
end
def forum_memos_right params, current_user
forum_section = ForumSection.find_by_id(params[:id])
notice = forum_section.section_notice
all_memos = forum_section.memos.posts.select(:author_id)
active_user_ids = all_memos.group("author_id").size.keys.uniq.first(6)
children_sections = ForumSection.where("ancestry is not null").order("watchers_count desc, memos_count desc").select([]).first(4)
new_childre_section = list_hot_sections(children_sections)
active_users = User.where(id: active_user_ids)
active_user_array = []
active_users.each do |user|
active_user_array.push({
username: user.show_real_name,
login: user.login,
image_url: "#{url_to_avatar(user)}?#{Time.now.to_i}"
})
end
{
username: forum_section.user.show_real_name,
user_login: forum_section.user.login,
notice: notice.try(:content),
recommend_forum_sections: new_childre_section,
active_users: active_user_array
}
end
def is_watch params, current_user
forum_section = ForumSection.find(params[:id])
children_sections = nil
children_sections = forum_section.descendants
if params[:is_watch] == 1
if Watcher.exists?(watchable_type: "ForumSection", watchable_id: params[:id], user_id: current_user.id)
w_status = -1
w_msg = "您已收藏"
else
Watcher.create(watchable: forum_section, user_id: current_user.id)
forum_section.increment!(:watchers_count)
if children_sections.present?
children_sections.each do |section|
Watcher.create!(watchable: section, user_id: current_user.id)
section.increment!(:watchers_count)
end
end
w_status = 0
w_msg = "收藏成功"
end
else
sections_ids = []
sections_ids = children_sections.pluck(:id) if children_sections.present?
forum_all_sections = [params[:id]] + sections_ids
forum_section.decrement!(:watchers_count)
if Watcher.exists?(watchable_type: "ForumSection", watchable_id: params[:id], user_id: current_user.id)
Watcher.where(watchable_type: "ForumSection", watchable_id: forum_all_sections, user_id: current_user.id).destroy_all
w_status = 0
w_msg = "取消收藏成功"
else
w_status = -1
w_msg = "您还未收藏"
end
end
{status: w_status, message: w_msg}
end
protected
def find_memo params
if params[:id].blank?
@memo = Memo.new
else
@memo = Memo.find params[:id]
end
end
# 将memos对象添加额外信息
def memo_data memos
memo_list = []
memos.each do |m|
forum_name = m.forums.map(&:name)
user_info = {username: m.author.show_real_name, login: m.author.login, image_url: "#{url_to_avatar(m.author)}?#{Time.now.to_i}", forum_name:forum_name, praise_count: m.praises_count}
memo_list << m.attributes.dup.merge(user_info)
end
memo_list
end
# 权限
def permission memo, current_user
if current_user.admin?
1
elsif memo.author_id == current_user.id
2
else
3
end
end
def check_banned_permission current_user, memo_id
return true if current_user&.admin?
# forum_id = MemoForum&.where(is_children: false, memo_id: memo_id)&.first.try(:forum_id).to_s
forum_id = Memo.find_by_id(memo_id).try(:forum_section_id)
user_banned_permission current_user, forum_id
end
def tag_list reps
rep_list = []
reps.each do |r|
sub_ids = SubRepertoire.where(:repertoire_id => r.id).pluck(:id)
tag = object_to_hash TagRepertoire.where(:sub_repertoire_id => sub_ids).field_for_list.order("name asc")
rep_list << {:rep => r, :tag => tag}
end
return rep_list
end
def memo_list memos, current_user
return nil if memos.blank?
# parent_reply_ids = memos.where()
list = [] # 贴子的回复
memos.includes(:praise_tread).each do |memo|
is_banned = user_is_banned?(memo.author) #帖子的用户是否被禁言
# 用户是否点赞
user_praise = memo.praise_tread.exists?(user_id: current_user.try(:id).to_i)
permission = current_user ? current_user.manager_of_memo?(memo) : false
# 实训TPM的管理员可以看到隐藏的评论
replies = {:id => memo.id, :content => memo.content, :time => time_from_now(memo.created_at), :user_id => memo.author_id,
:image_url => "#{url_to_avatar(memo.author, true)}", :username => memo.author.show_real_name, :reward => memo.reward, :hidden => memo.hidden,
:permission => permission, :praise_count => memo.praises_count, :user_praise => user_praise,
:user_login => memo.author.try(:login), :admin => current_user&.admin, is_banned: is_banned, replies_count: memo.can_see_reply_count(current_user)}
childrens = Memo.where(:parent_id => memo.id).includes(:author).reorder("created_at desc").limit(5)
unless current_user.try(:admin?) # 只有管理员和发布人能看到隐藏的回复
childrens = childrens.where("hidden = false or (hidden = true and author_id = ?)", current_user.try(:id))
end
children_list = [] # 子回复
childrens.each do |child|
children_praise = child.praise_tread.exists?(user_id: current_user.try(:id).to_i)
children_is_banned = user_is_banned?(child.author) #帖子的用户是否被禁言
children_list << {:id => child.id, :content => child.content, :time => time_from_now(child.created_at),:praise_count => memo.praises_count, :user_praise => children_praise,
:image_url => "#{url_to_avatar(child.author,true)}?#{Time.now.to_i}", :username => child.author.show_real_name, :hidden => child.hidden, replies_count: child.can_see_reply_count(current_user),
:permission => permission, :user_login => child.author.try(:login), :user_id => child.author.try(:id), :parent_id => child.parent_id, is_banned: children_is_banned}
end
list << replies.merge({children: children_list})
end
list
end
# 帖子附件信息
def acttachements_info attachments
attachments_list = []
if attachments.present?
attachments.each do |attach|
attachments_list << {:id => attach.id,
:title => attach.filename,
:url => "/attachments/download/" + "#{attach.id}" + "/" + "#{attach.filename}#{attach.is_pdf? ? "?disposition=inline" : ""}",
:filesize => number_to_human_size(attach.filesize,significant: false, precision: 2)}
end
end
return attachments_list
end
# 判断编辑器存储的内容是否是html类型的ke目的为了区分ke和markdown
def editor_html update_time
# str.include?("<p>" || "<div>" || "<span>" || "<img>" || "<strong>") && update_time < "2018-06-23"
update_time < "2018-06-23"
end
def list_hot_sections(forum_sections)
new_sections = []
forum_sections.each do |sec|
single_info = single_section_info(sec)
new_sections.push(single_info)
end
return new_sections
end
def single_section_info(section)
image = section.image_attachment
return {
id: section.id,
title: section.title,
description: section.description,
memos_count: section.visible_memos_count,
watchers_count: section.watchers_count,
picture: image.present? ? "/attachments/download/" + "#{image.id}" + "/" + "#{image.filename}" : ""
}
end
end