You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pgfqe6ch8/app/services/memos_service.rb

405 lines
16 KiB

6 years ago
# encoding=utf-8
class MemosService
include ApplicationHelper
LIMIT = 10
def new current_user, session
csrf_token = session[:_csrf_token] ||= SecureRandom.base64(32)
tidding_count = unviewed_tiddings(current_user)
tag_list = object_to_hash TagRepertoire.field_for_list.order("name asc")
#tag_list = tag_list reps
current_user_info = format_for_current_user current_user
# csrf_token = SecureRandom.base64(32)
{tag_list: tag_list, current_user: current_user_info, :csrf_token => csrf_token, :tidding_count => tidding_count}
end
# params 直接传params[:memo][:subject]
# subject标题
# content内容
# forum_id 话题类型
# sticky 是否置顶(创建时没入口)
# repertoire_name + language 技术标签
# attachments 附件
# tags 标签数组
def create params, current_user
return nil if params[:memo][:subject].blank? || params[:memo][:content].blank? || params[:memo][:forum_id].blank?
memo = Memo.new(params[:memo])
memo.author = current_user
memo.save_attachments(params[:attachments]) if params[:attachments].present?
memo.save!
params[:tags].each do |tag|
MemoTagRepertoire.create(:memo_id => memo.id, :tag_repertoire_id => tag)
end
{status: 0, message: "帖子创建成功!", memo_id: memo.id}
end
# params
# :id 帖子id
# return
# :memo 帖子
# :memo_replies 帖子的回复
# :recommend_shixun 推荐实训
# :admin 当前用户是否是管理员
# :author_info 表示当前帖子用户的信息
#
def show params, current_user
current_user ||= User.find(2)
memo = Memo.find params[:id]
# 消息总数
tidding_count = unviewed_tiddings(current_user) if current_user
attachments_list = acttachements_info memo.attachments
memo_praise_count = memo.praise_tread.liker.count
user_praise = PraiseTread.where(:praise_tread_object_id => memo.id, :praise_tread_object_type => "Memo",
:user_id => current_user.try(:id), :praise_or_tread => 1).present? ? true : false
unless memo.children.blank?
memo.children.each do |child|
child.memo_messages.each do |memo_message|
memo_message.update_attributes(:viewed => true) if current_user.try(: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.try(:id) == query_memo_message.user_id
end
end
memo.update_column(:viewed_count, memo.viewed_count + 1)
replies_count = memo.all_replies
# 帖子的回复
memos = memo.reply_for_memo.includes(:praise_tread, :author).order("created_at desc").limit(LIMIT)
watched = memo.author.watched_by?(current_user)
list = memo_list memos, current_user
is_md = memo.is_md
author_info = {username: memo.author.show_name,
watched: watched,
image_url: url_to_avatar(memo.author),
identity: memo.author.identity,
login: memo.author.login,
user_id: memo.author.id}
tags = memo.tag_repertoires.map(&:name)
memo = {id: memo.id,
subject: memo.subject,
is_md: is_md,
content: memo.content,
time: memo.created_at,
tag: tags, # 标签是一个数组
sticky: memo.sticky, # 置顶 1
viewed_count: memo.viewed_count,
replies_count: replies_count,
praise_count: memo_praise_count,
reward: memo.reward,
attachment_url: attachments_list,
user_praise: user_praise}
current_user_info = format_for_current_user current_user
{ memo: memo, memo_replies: list, recommend_shixuns: recommends, author_info: author_info,
current_user: current_user_info, tidding_count: tidding_count}
end
def more_reply params, current_user
page = params[:page].to_i
offset = page * LIMIT
memo_id = params[:id]
# 总数,分页使用
memos_count = Memo.where(:parent_id => memo_id).count
memos = Memo.limit(LIMIT).where(:parent_id => memo_id).includes(:author, :praise_tread).order("created_at desc").offset(offset)
list = memo_list memos, current_user
return {:memo_replies => list, :memos_count => memos_count}
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
# return: tag_list 技术标签的所有数据, current_user 当前用户信息, attachments_url 附件信息, tag: 帖子选中标签的信息
def edit params, current_user
#reps = Repertoire.field_for_list.order("updated_at asc")
#tag_list = tag_list reps
tag_list = object_to_hash TagRepertoire.field_for_list.order("name asc")
memo = Memo.select([:id, :subject, :content, :forum_id, :repertoire_name]).find params[:id]
tags = memo.tag_repertoires.map{|tag| {id:tag.id, name: tag.name}}
attachments_list = acttachements_info memo.attachments
current_user_info = format_for_current_user current_user
memo.attributes.merge({tag_list: tag_list, current_user: current_user_info, attachments_url: attachments_list, tag: tags})
end
# params[:tags] 类型数组标签的id
def update params
memo = Memo.find params[:id]
if(memo.update_attributes(params[:memo]))
# 为了将旧数据的KE转换为MD
if !memo.is_md && params[:content_changed]
memo.update_column(:is_md, true)
end
memo.save_attachments(params[:attachments] || (params[:memo] && params[:memo][:uploads]))
end
memo.tag_repertoires.destroy_all
params[:tags].each do |tag|
MemoTagRepertoire.create(:memo_id => memo.id, :tag_repertoire_id => tag)
end
memo.save!
{status: 0, message: "帖子更新成功!"}
end
# params
# 排序:order -> 类型字符串replies_count最热 created_at 最新
# 搜索:search -> 类型:字符串;
# 类型:forum -> 类型:整型; 值3 操作指南 5 技术分享
# 用户:user_id -> 搜索那个用户的帖子(目前主要用来显示我的帖子)。
# 标签:tag_repertoire_id -> 热门标签的tag_repertoire表的id
# return:
# memo_list 列表
# memo_count 帖子的总数
# current_user 用户信息
# hot_memos 热门帖子
# recommend_shixuns 推荐实训
# hot_tags 热门标签
# my_memos_count 我的帖子数
def get_memos_list params, current_user
current_user ||= User.find(2)
# all_replies_count 表示所有回复(一级+二级回复数) replies_count表示帖子的回复只包含一级回复
s_order = (params[:order] == "replies_count" ? "all_replies_count" : params[:order]) || "updated_at"
tidding_count = unviewed_tiddings(current_user) if current_user.present?
page = params[:page].to_i
offset = page * 15
search = params[:search]
forum_id = params[:forum]
user_id = params[:user_id]
if user_id.to_i == -1
user_id = current_user.try(:id)
end
tag_repertoire_id = params[:tag_repertoire_id]
sql =
if forum_id
search ? "forum_id = #{forum_id} and root_id is null and subject like '%#{search}%'"
: "forum_id = #{forum_id} and root_id is null"
elsif search
user_id ? "author_id=#{user_id.to_i} and forum_id in(3,5) and root_id is null and subject like '%#{search}%'"
: "forum_id in(3,5) and root_id is null and subject like '%#{search}%'"
else
user_id ? "author_id=#{user_id.to_i} and forum_id in(3,5) and root_id is null"
: "forum_id in(3,5) and root_id is null"
end
if tag_repertoire_id
#language = Base64.urlsafe_decode64("#{language}")
# 下面Memo表关联user表了两个表中都包含language字段因此 才在tag_repertoire_id前加入表名查询
memo_ids = MemoTagRepertoire.where(:tag_repertoire_id => tag_repertoire_id).pluck(:memo_id)
memo_ids = memo_ids ? memo_ids.join(",") : -1
sql += " and #{Memo.table_name}.id in (#{memo_ids})"
end
# REDO最新回复不需要查看所有回复数为0的帖子
if params[:order] == "updated_at"
sql += " and all_replies_count != 0"
end
memos = Memo.field_for_list.includes(:praise_tread, :author).where("#{sql}")
memos_count = memos.count # 帖子的总数
memos = memos.order("sticky=1 desc, #{Memo.table_name}.#{s_order} desc").offset(offset).limit(15)
memo_list = memo_data memos
my_memos_count = Memo.user_posts(current_user.try(:id)).count
# 标签只有forum_id = 5才有
#hot_tags = Memo.find_by_sql("select distinct language from memos where forum_id = 5 and root_id is NULL and language is not NULL order by replies_count desc, created_at desc limit 9").map(&:language)
tags_info = MemoTagRepertoire.find_by_sql("SELECT tag_repertoire_id, tr.name,count(*) cnt
FROM `memo_tag_repertoires` mtr
join tag_repertoires tr on tr.id = mtr.tag_repertoire_id
group by tag_repertoire_id order by cnt desc, tag_repertoire_id desc limit 9")
hot_tags = tags_info.map{|o| o.attributes.dup.except("cnt")}
hot_memos = hot_memo_info Memo.field_for_recommend.posts.hot.limit(4)
current_user_info = format_for_current_user current_user
{memo_list: memo_list, memo_count: memos_count, hot_memos: hot_memos,
hot_tags: hot_tags, recommend_shixuns: recommends, my_memos_count: my_memos_count,
current_user: current_user_info, tidding_count: tidding_count}
end
# params
# parent_id: 给谁的回复id
# content: 回复的内容
def reply params, current_user
ActiveRecord::Base.transaction do
memo = Memo.find params[:parent_id]
reply = Memo.new
reply.content = params[:content]
reply.author = current_user
reply.forum_id = memo.forum_id
reply.subject = memo.subject
reply.root_id = memo.root_id || memo.id
memo.children << reply
m = Memo.find reply.root_id
m.increment!(:all_replies_count)
reply
end
end
# params:
# order 排序
# forum_id: 3.技术分享; 5操作指南
# sticky: 1 置顶,0 取消置顶
# id 帖子ID
def set_top_or_down params
s_order = params[:order] || "updated_at"
forum_id = params[:forum_id]
sql = forum_id ? "forum_id = #{forum_id} and root_id is null" : "forum_id in(3,5) and root_id is null"
Memo.find(params[:id]).update_attribute(:sticky, params[:sticky])
memos = Memo.field_for_list.includes(:praise_tread, :author).where("#{sql}").order("sticky=1 desc, #{s_order} desc").limit(15)
memo_list = memo_data memos
{status: 0, message: "操作成功!", memo_list: memo_list}
end
protected
# 推荐实训 = 2个热门实训 + 2个最新实训
def recommends
hot_shixuns = Shixun.field_for_recommend.published.order("myshixuns_count desc").limit(2)
newest_shixuns = Shixun.field_for_recommend.published.order("created_at desc").limit(2)
recommend_shixuns = []
hot_shixuns.each do |hs|
myshixun_count = hs.myshixuns.count
recommend_shixuns << {:id => hs.id, :name => hs.name, :identifier => hs.identifier, :myshixuns_count => myshixun_count, :image_url => url_to_avatar(hs)}
end
newest_shixuns.each do |ns|
myshixun_count = ns.myshixuns.count
recommend_shixuns << {:id => ns.id, :name => ns.name, :identifier => ns.identifier, :myshixuns_count => myshixun_count, :image_url => url_to_avatar(ns)}
end
return recommend_shixuns
end
def unviewed_tiddings current_user
new_tidings_count = current_user.tidings.where("created_at > '#{current_user.onclick_time.onclick_time}'").count
new_pri_message_count = current_user.private_messages.where("created_at > '#{current_user.onclick_time.onclick_time}'").count
count = new_tidings_count + new_pri_message_count
return count
end
def find_memo params
if params[:id].blank?
@memo = Memo.new
else
@memo = Memo.find params[:id]
end
end
def format_for_current_user current_user
{username: current_user.show_name, login: current_user.login,
user_id: current_user.id, image_url: url_to_avatar(current_user),
admin: current_user.admin?, is_teacher: current_user.user_extensions.try(:identity) == 0 }
end
# 将数据库对象转换成哈希对象
def object_to_hash objects
objects.map{|o| o.attributes.dup}
end
# 将memos对象添加额外信息
def memo_data memos
memo_list = []
memos.each do |m|
praise_count = m.praise_tread.where(:praise_or_tread => 1).count
replies_count = m.all_replies
tag = m.tag_repertoires.map(&:name)
user_info = {username: m.author.show_name, login: m.author.login, image_url: url_to_avatar(m.author), praise_count: praise_count, replies_count: replies_count, tag: tag}
memo_list << m.attributes.dup.merge(user_info)
end
memo_list
end
def hot_memo_info memos
memo_info = []
memos.each do |m|
praise_count = m.praise_tread.where(:praise_or_tread => 1).count
replies_count = m.all_replies
tag = m.tag_repertoires.map(&:name)
memo_info << m.attributes.dup.merge({replies_count: replies_count, praise_count: praise_count, tag: tag})
end
memo_info
end
# 权限
def permission memo, current_user
if current_user.admin?
1
elsif memo.author_id == current_user.id
2
else
3
end
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?
list = [] # 贴子的回复
memos.each do |memo|
# 总赞数
praise_count = memo.praise_tread.liker.count
# 用户是否点赞
user_praise = memo.praise_tread.select{|pt| pt.user_id == current_user.id}.length > 0 ? true : 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), :username => memo.author.show_name, :reward => memo.reward, :hidden => memo.hidden,
:permission => current_user.manager_of_memo?(memo), :praise_count => praise_count, :user_praise => user_praise,
:user_login => memo.author.try(:login), :admin => current_user.admin}
# 现在没有二级回复所以查询的时候直接从root_id取
childrens = Memo.where(:parent_id => memo.id).includes(:author).reorder("created_at asc")
children_list = [] # 子回复
# :reward => child.reward,
childrens.each do |child|
children_list << {:id => child.id, :content => child.content, :time => time_from_now(child.created_at),
:image_url => url_to_avatar(child.author), :username => child.author.show_name, :hidden => child.hidden,
:permission => current_user.manager_of_memo?(memo), :user_login => child.author.try(:login), :user_id => child.author.try(:id)}
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,
:filename => attach.filename,
:url => "/attachments/download/" + "#{attach.id}" + "/" + "#{attach.filename}",
:filesize => attach.filesize}
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
end