diff --git a/app/controllers/accounts_controller.rb b/app/controllers/accounts_controller.rb index 377b13f12..a837e952f 100644 --- a/app/controllers/accounts_controller.rb +++ b/app/controllers/accounts_controller.rb @@ -192,7 +192,9 @@ class AccountsController < ApplicationController sync_params = { password: params[:password].to_s, - email: @user.mail + email: @user.mail, + login_name: @user.name, + source_id: 0 } interactor = Gitea::User::UpdateInteractor.call(@user.login, sync_params) diff --git a/app/controllers/notices_controller.rb b/app/controllers/notices_controller.rb new file mode 100644 index 000000000..bf7eb21b1 --- /dev/null +++ b/app/controllers/notices_controller.rb @@ -0,0 +1,21 @@ +class NoticesController < ApplicationController + + def create + tip_exception("参数有误") if params["source"].blank? + user_id = params[:user_id] + + if params["source"] == "CompetitionBegin" + competition_id = params[:competition_id] + SendTemplateMessageJob.perform_later('CompetitionBegin', user_id, competition_id) + elsif params["source"] == "CompetitionResult" + competition_id = params[:competition_id] + SendTemplateMessageJob.perform_later('CompetitionResult', user_id, competition_id) + elsif params["source"] == "CompetitionReview" + competition_id = params[:competition_id] + SendTemplateMessageJob.perform_later('CompetitionReview', user_id, competition_id) + else + tip_exception("#{params["source"]}未配置") + end + render_ok + end +end diff --git a/app/jobs/send_template_message_job.rb b/app/jobs/send_template_message_job.rb index de75024dd..9cc819a11 100644 --- a/app/jobs/send_template_message_job.rb +++ b/app/jobs/send_template_message_job.rb @@ -326,6 +326,30 @@ class SendTemplateMessageJob < ApplicationJob receivers_email_string, email_title, email_content = MessageTemplate::TeamLeft.get_email_message_content(receiver, organization, team) Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) end + when 'CompetitionBegin' + user_id, competition_id = args[0], args[1] + user = User.find_by_id(user_id) + project = Project.find_by_sql("select *,title as name from competitions where id=#{competition_id}") + return unless user.present? && project.present? + receivers = User.where(id: user_id) + receivers_string, content, notification_url = MessageTemplate::CompetitionBegin.get_message_content(receivers, project.first) + Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {user_id: user_id, competition_name: project.first&.name, identifier: project.first&.identifier}) + when 'CompetitionReview' + user_id, competition_id = args[0], args[1] + user = User.find_by_id(user_id) + project = Project.find_by_sql("select *,title as name from competitions where id=#{competition_id}") + return unless user.present? && project.present? + receivers = User.where(id: user_id) + receivers_string, content, notification_url = MessageTemplate::CompetitionReview.get_message_content(receivers, project.first) + Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {user_id: user_id, competition_name: project.first&.name, identifier: project.first&.identifier}) + when 'CompetitionResult' + user_id, competition_id = args[0], args[1] + user = User.find_by_id(user_id) + project = Project.find_by_sql("select *,title as name from competitions where id=#{competition_id}") + return unless user.present? && project.present? + receivers = User.where(id: user_id) + receivers_string, content, notification_url = MessageTemplate::CompetitionResult.get_message_content(receivers, project.first) + Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {user_id: user_id, competition_name: project.first&.name, identifier: project.first&.identifier}) end end end \ No newline at end of file diff --git a/app/models/message_template.rb b/app/models/message_template.rb index 13864184a..f34200132 100644 --- a/app/models/message_template.rb +++ b/app/models/message_template.rb @@ -74,6 +74,11 @@ class MessageTemplate < ApplicationRecord self.create(type: 'MessageTemplate::TeamJoined', sys_notice: '你已被拉入组织 {organization}{team} 团队,拥有{role}权限', email: email_html, email_title: "#{PLATFORM}: 在 {organization} 组织你的账号有权限变更", notification_url: '{baseurl}/{login}') email_html = File.read("#{email_template_html_dir}/team_left.html") self.create(type: 'MessageTemplate::TeamLeft', sys_notice: '你已被移出组织 {organization}{team} 团队', email: email_html, email_title: "#{PLATFORM}: 在 {organization} 组织你的账号有权限变更", notification_url: '{baseurl}/{login}') + + # 竞赛通知 + self.create(type: 'MessageTemplate::CompetitionBegin', sys_notice: '你报名的竞赛 {competition_name} 已进入比赛进行阶段,可在此期间提交作品', notification_url: '{to_url}') + self.create(type: 'MessageTemplate::CompetitionResult', sys_notice: '你报名的竞赛 {competition_name} 已进入成绩公示阶段,可查看排行榜信息', notification_url: '{to_url}') + self.create(type: 'MessageTemplate::CompetitionReview', sys_notice: '你报名的竞赛 {competition_name} 距作品提交结束日期仅剩3天,若尚未提交参赛作品,请尽快提交', notification_url: '{to_url}') end def self.sys_notice diff --git a/app/models/message_template/competition_begin.rb b/app/models/message_template/competition_begin.rb new file mode 100644 index 000000000..b521d7455 --- /dev/null +++ b/app/models/message_template/competition_begin.rb @@ -0,0 +1,35 @@ +# == Schema Information +# +# Table name: message_templates +# +# id :integer not null, primary key +# type :string(255) +# sys_notice :text(65535) +# email :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# notification_url :string(255) +# email_title :string(255) +# + +# 报名的竞赛进入比赛进行阶段 +# 触发场景 +# 赛队成员报名的竞赛已进入比赛进行阶段 +# 通知文案格式 +# 你报名的竞赛 xxx 已进入比赛进行阶段,可在此阶段提交作品 +# 时间:x分钟/小时/天/月前 +# 通知文案示例 +# 你报名的竞赛 代码审查大赛 已进入比赛进行阶段,可在此期间提交作品 +# 时间:3小时前 +# 点击通知跳转页面 +# 点击此通知将跳转到代码审查大赛详情页: +# http://117.50.100.12:8080/competitions/lgw7st/home +class MessageTemplate::CompetitionBegin < MessageTemplate + + # MessageTemplate::FollowedTip.get_message_content(User.where(login: 'yystopf'), User.last) + def self.get_message_content(receivers, competition) + return receivers_string(receivers), sys_notice.to_s.gsub('{competition_name}', competition&.name), notification_url.to_s.gsub('{to_url}', "/competitions/#{competition.identifier}/home") + # rescue + # return '', '', '' + end +end diff --git a/app/models/message_template/competition_result.rb b/app/models/message_template/competition_result.rb new file mode 100644 index 000000000..c949a38cf --- /dev/null +++ b/app/models/message_template/competition_result.rb @@ -0,0 +1,35 @@ +# == Schema Information +# +# Table name: message_templates +# +# id :integer not null, primary key +# type :string(255) +# sys_notice :text(65535) +# email :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# notification_url :string(255) +# email_title :string(255) +# + +# 报名的竞赛进入成绩公示阶段 +# 触发场景 +# 赛队成员报名的竞赛已进入成绩公示阶段 +# 通知文案格式 +# 你报名的竞赛 xxx 已进入成绩公示阶段,可查看排行榜信息 +# 时间:x分钟/小时/天/月前 +# 通知文案示例 +# 你报名的竞赛 代码审查大赛 已进入成绩公示阶段,可查看排行榜信息 +# 时间:3小时前 +# 点击通知跳转页面 +# 点击此通知将跳转到代码审查大赛详情页: +# http://117.50.100.12:8080/competitions/lgw7st/home +class MessageTemplate::CompetitionResult < MessageTemplate + + # MessageTemplate::FollowedTip.get_message_content(User.where(login: 'yystopf'), User.last) + def self.get_message_content(receivers, competition) + return receivers_string(receivers), sys_notice.gsub('{competition_name}', competition&.title), notification_url.gsub('{to_url}', "/competitions/#{competition.identifier}/home") + rescue + return '', '', '' + end +end diff --git a/app/models/message_template/competition_review.rb b/app/models/message_template/competition_review.rb new file mode 100644 index 000000000..12bf5a883 --- /dev/null +++ b/app/models/message_template/competition_review.rb @@ -0,0 +1,35 @@ +# == Schema Information +# +# Table name: message_templates +# +# id :integer not null, primary key +# type :string(255) +# sys_notice :text(65535) +# email :text(65535) +# created_at :datetime not null +# updated_at :datetime not null +# notification_url :string(255) +# email_title :string(255) +# + +# 报名的竞赛比赛结束时间临近 +# 触发场景 +# 赛队成员报名的竞赛阶段处于比赛进行中,且距比赛结束日期仅剩3天 +# 通知文案格式 +# 你报名的竞赛 xxx 距作品提交结束日期仅剩3天,若尚未提交参赛作品,请尽快提交 +# 时间:x分钟/小时/天/月前 +# 通知文案示例 +# 你报名的竞赛 代码审查大赛 距作品提交结束日期仅剩3天,若尚未提交参赛作品,请尽快提交 +# 时间:3小时前 +# 点击通知跳转页面 +# 点击此通知将跳转到代码审查大赛详情页: +# http://117.50.100.12:8080/competitions/lgw7st/home +class MessageTemplate::CompetitionReview < MessageTemplate + + # MessageTemplate::FollowedTip.get_message_content(User.where(login: 'yystopf'), User.last) + def self.get_message_content(receivers, competition) + return receivers_string(receivers), sys_notice.gsub('{competition_name}', competition&.title), notification_url.gsub('{to_url}', "/competitions/#{competition.identifier}/home") + rescue + return '', '', '' + end +end diff --git a/config/routes.rb b/config/routes.rb index 36cd53919..05ffc8b5f 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -9,7 +9,6 @@ Rails.application.routes.draw do # Serve websocket cable requests in-process mount ActionCable.server => '/cable' - get 'attachments/entries/get_file', to: 'attachments#get_file' get 'attachments/download/:id', to: 'attachments#show' get 'attachments/download/:id/:filename', to: 'attachments#show' @@ -25,7 +24,6 @@ Rails.application.routes.draw do resources :edu_settings scope '/api' do - resources :topics, only: [:index] namespace :ci do resources :languages, only: [:index, :show] do collection do @@ -147,16 +145,6 @@ Rails.application.routes.draw do get :get_children_journals end end - - resources :claims, only: [:index] do - collection do - post :create - delete :destroy - get :index - put :update - end - end - resources :issue_times, only: [:create] do collection do post :end_work @@ -385,6 +373,7 @@ Rails.application.routes.draw do resource :bind_user, only: [:create] resources :hot_keywords, only: [:index] + resources :notices, only: [:create] namespace :weapps do resource :home, only: [:show] @@ -683,16 +672,6 @@ Rails.application.routes.draw do namespace :admins do mount Sidekiq::Web => '/sidekiq' get '/', to: 'dashboards#index' - namespace :topic do - resources :activity_forums - resources :banners - resources :cards - resources :cooperators - resources :excellent_projects - resources :experience_forums - resources :pinned_forums - end - resources :project_statistics, only: [:index] do collection do get :visits_static diff --git a/lib/tasks/competition_notice.rake b/lib/tasks/competition_notice.rake new file mode 100644 index 000000000..3de5b3eeb --- /dev/null +++ b/lib/tasks/competition_notice.rake @@ -0,0 +1,38 @@ +# 竞赛通知 + +namespace :competition_notice do + + desc "竞赛通知-进入提交作品状态" + task submit_work_begin: :environment do + competitions = Project.find_by_sql("select * from competitions where status=1 and DATE_FORMAT(enroll_end_time,'%Y-%m-%d %h:00:00') ='#{(Time.now - 1.day).strftime('%Y-%m-%d %H:00:00')}' ") + competitions.each do |c| + competition_teams = Project.find_by_sql("select * from competition_teams where competition_id=#{c.id} ") + competition_teams.each do |team| + SendTemplateMessageJob.perform_later('CompetitionBegin', team.user_id, c.id) + end + end + end + + desc "竞赛通知-截止提交作品时间前3小时" + task submit_work_end: :environment do + competitions = Project.find_by_sql("select * from competitions where status=1 and DATE_FORMAT(end_time,'%Y-%m-%d %h:00:00') ='#{(Time.now + 3.hours).strftime('%Y-%m-%d %H:00:00')}' ") + competitions.each do |c| + competition_teams = Project.find_by_sql("select * from competition_teams where competition_id=#{c.id} ") + competition_teams.each do |team| + SendTemplateMessageJob.perform_later('CompetitionReview', team.user_id, c.id) + end + end + end + + desc "竞赛通知-报名的竞赛进入成绩公示阶段" + task submit_work_result: :environment do + competitions = Project.find_by_sql("select * from competitions where status=1 and DATE_FORMAT(review_time,'%Y-%m-%d %h:00:00') ='#{(Time.now - 1.day).strftime('%Y-%m-%d %H:00:00')}' ") + competitions.each do |c| + competition_teams = Project.find_by_sql("select * from competition_teams where competition_id=#{c.id} ") + competition_teams.each do |team| + SendTemplateMessageJob.perform_later('CompetitionResult', team.user_id, c.id) + end + end + end + +end \ No newline at end of file