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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 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