diff --git a/app/controllers/live_links_controller.rb b/app/controllers/live_links_controller.rb index bc89c11d3..085a8178b 100644 --- a/app/controllers/live_links_controller.rb +++ b/app/controllers/live_links_controller.rb @@ -16,8 +16,19 @@ class LiveLinksController < ApplicationController end def update - render_forbidden("无权限操作") unless current_user.id == current_live.user_id || current_user.admin? - current_live.update!(on_status: params[:on_status]) + tip_exception(403, "无权限操作") unless current_user.id == current_live.user_id || current_user.admin? + tip_exception("请勿重复开启") if current_live.on_status && params[:on_status].to_i == 1 + + ActiveRecord::Base.transaction do + current_live.update!(on_status: params[:on_status]) + + # 开启时发送消息,关闭直播时删除对应的消息 + if params[:on_status].to_i == 1 + LivePublishJob.perform_later(current_live.id) + else + current_live.tidings.destroy_all + end + end render_ok end diff --git a/app/decorators/tiding_decorator.rb b/app/decorators/tiding_decorator.rb index 58345b601..771df3aa2 100644 --- a/app/decorators/tiding_decorator.rb +++ b/app/decorators/tiding_decorator.rb @@ -321,6 +321,10 @@ module TidingDecorator I18n.t(locale_format(parent_container_type)) % container&.exercise_name end + def live_link_content + I18n.t(locale_format) % container&.user.try(:show_real_name) + end + def student_graduation_topic_content I18n.t(locale_format) % container&.graduation_topic.try(:name) end diff --git a/app/jobs/live_publish_job.rb b/app/jobs/live_publish_job.rb new file mode 100644 index 000000000..3296dbe52 --- /dev/null +++ b/app/jobs/live_publish_job.rb @@ -0,0 +1,27 @@ +# 直播开启的消息通知 +class LivePublishJob < ApplicationJob + queue_as :notify + + def perform(live_id) + live = LiveLink.find_by(id: live_id) + return if live.blank? || live.course.blank? + course = live.course + + attrs = %i[ + user_id trigger_user_id container_id container_type parent_container_id parent_container_type + belong_container_id belong_container_type viewed tiding_type created_at updated_at + ] + + same_attrs = { + trigger_user_id: live.user_id, container_id: live.id, container_type: 'LiveLink', + parent_container_id: live.id, parent_container_type: 'LiveLink', + belong_container_id: live.course_id, belong_container_type: 'Course', + viewed: 0, tiding_type: 'LiveLink' + } + Tiding.bulk_insert(*attrs) do |worker| + course.students.pluck(:user_id).each do |user_id| + worker.add same_attrs.merge(user_id: user_id) + end + end + end +end diff --git a/app/models/live_link.rb b/app/models/live_link.rb index e559baa6b..cd6655c30 100644 --- a/app/models/live_link.rb +++ b/app/models/live_link.rb @@ -2,6 +2,8 @@ class LiveLink < ApplicationRecord belongs_to :course belongs_to :user + has_many :tidings, as: :container, dependent: :destroy + validates :url, presence: true validates :description, length: { maximum: 100, too_long: "不能超过100个字符" } diff --git a/config/locales/tidings/zh-CN.yml b/config/locales/tidings/zh-CN.yml index 1117786c0..92c815a05 100644 --- a/config/locales/tidings/zh-CN.yml +++ b/config/locales/tidings/zh-CN.yml @@ -238,3 +238,4 @@ 2_end: "你提交的发布视频申请:%s,审核未通过<br/><span>原因:%{reason}</span>" PublicCourseStart_end: "你报名参与的开放课程:%s,将于%s正式开课" SubjectStartCourse_end: "您创建的开放课程:%s 已达到开课人数要求。您可以在24小时内自主开设新一期课程。如果超过24小时未开课,平台将自动开课并复制您上一期的课程内容。" + LiveLink_end: "%s老师正在直播中" diff --git a/spec/jobs/live_publish_job_spec.rb b/spec/jobs/live_publish_job_spec.rb new file mode 100644 index 000000000..d996446d4 --- /dev/null +++ b/spec/jobs/live_publish_job_spec.rb @@ -0,0 +1,5 @@ +require 'rails_helper' + +RSpec.describe LivePublishJob, type: :job do + pending "add some examples to (or delete) #{__FILE__}" +end