| @@ -18,7 +18,7 @@ class Organizations::TeamUsersController < Organizations::BaseController | |||
| ActiveRecord::Base.transaction do | |||
| @team_user = TeamUser.build(@organization.id, @operate_user.id, @team.id) | |||
| @organization_user = OrganizationUser.build(@organization.id, @operate_user.id) | |||
| SendTemplateMessageJob.perform_later('OrganizationRole', @operate_user.id, @organization.id, @team.authorize_name) if Site.has_notice_menu? | |||
| SendTemplateMessageJob.perform_later('TeamJoined', @operate_user.id, @organization.id, @team.id) if Site.has_notice_menu? | |||
| Gitea::Organization::TeamUser::CreateService.call(@organization.gitea_token, @team.gtid, @operate_user.login) | |||
| end | |||
| rescue Exception => e | |||
| @@ -31,6 +31,7 @@ class Organizations::TeamUsersController < Organizations::BaseController | |||
| ActiveRecord::Base.transaction do | |||
| @team_user.destroy! | |||
| Gitea::Organization::TeamUser::DeleteService.call(@organization.gitea_token, @team.gtid, @operate_user.login) | |||
| SendTemplateMessageJob.perform_later('TeamLeft', @operate_user.id, @organization.id, @team.id) if Site.has_notice_menu? | |||
| org_team_users = @organization.team_users.where(user_id: @operate_user.id) | |||
| unless org_team_users.present? | |||
| @organization.organization_users.find_by(user_id: @operate_user.id).destroy! | |||
| @@ -94,18 +94,6 @@ class SendTemplateMessageJob < ApplicationJob | |||
| receivers_email_string, email_title, email_content = MessageTemplate::OrganizationLeft.get_email_message_content(receiver, organization) | |||
| Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) | |||
| end | |||
| when 'OrganizationRole' | |||
| user_id, organization_id, role = args[0], args[1], args[2] | |||
| user = User.find_by_id(user_id) | |||
| organization = Organization.find_by_id(organization_id) | |||
| return unless user.present? && organization.present? | |||
| receivers = User.where(id: user.id) | |||
| receivers_string, content, notification_url = MessageTemplate::OrganizationRole.get_message_content(receivers, organization, role) | |||
| Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {user_id: user.id, organization_id: organization.id, role: role}) | |||
| receivers.find_each do |receiver| | |||
| receivers_email_string, email_title, email_content = MessageTemplate::OrganizationRole.get_email_message_content(receiver, organization, role) | |||
| Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) | |||
| end | |||
| when 'ProjectIssue' | |||
| operator_id, issue_id = args[0], args[1] | |||
| operator = User.find_by_id(operator_id) | |||
| @@ -276,6 +264,32 @@ class SendTemplateMessageJob < ApplicationJob | |||
| receivers_email_string, email_title, email_content = MessageTemplate::PullRequestMerged.get_email_message_content(receiver, operator, pull_request) | |||
| Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) | |||
| end | |||
| when 'TeamJoined' | |||
| user_id, organization_id, team_id = args[0], args[1], args[2] | |||
| user = User.find_by_id(user_id) | |||
| organization = Organization.find_by_id(organization_id) | |||
| team = Team.find_by_id(team_id) | |||
| return unless user.present? && organization.present? && team.present? | |||
| receivers = User.where(id: user.id) | |||
| receivers_string, content, notification_url = MessageTemplate::TeamJoined.get_message_content(receivers, organization, team) | |||
| Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {user_id: user.id, organization_id: organization.id, team_id: team.id}) | |||
| receivers.find_each do |receiver| | |||
| receivers_email_string, email_title, email_content = MessageTemplate::TeamJoined.get_email_message_content(receiver, organization, team) | |||
| Notice::Write::EmailCreateService.call(receivers_email_string, email_title, email_content) | |||
| end | |||
| when 'TeamLeft' | |||
| user_id, organization_id, team_id = args[0], args[1], args[2] | |||
| user = User.find_by_id(user_id) | |||
| organization = Organization.find_by_id(organization_id) | |||
| team = Team.find_by_id(team_id) | |||
| return unless user.present? && organization.present? && team.present? | |||
| receivers = User.where(id: user.id) | |||
| receivers_string, content, notification_url = MessageTemplate::TeamLeft.get_message_content(receivers, organization, team) | |||
| Notice::Write::CreateService.call(receivers_string, content, notification_url, source, {user_id: user.id, organization_id: organization.id, team_id: team.id}) | |||
| receivers.find_each do |receiver| | |||
| 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 | |||
| end | |||
| end | |||
| end | |||
| @@ -31,8 +31,6 @@ class MessageTemplate < ApplicationRecord | |||
| self.create(type: 'MessageTemplate::OrganizationJoined', sys_notice: '你已加入 <b>{organization}</b> 组织', notification_url: '{baseurl}/{login}', email: email_html, email_title: 'GitLink: 你已加入 {organization} 组织') | |||
| email_html = File.read("#{email_template_html_dir}/organization_left.html") | |||
| self.create(type: 'MessageTemplate::OrganizationLeft', sys_notice: '你已被移出 <b>{organization}</b> 组织', notification_url: '', email: email_html, email_title: 'GitLink: 你已被移出 {organization} 组织') | |||
| email_html = File.read("#{email_template_html_dir}/organization_role.html") | |||
| self.create(type: 'MessageTemplate::OrganizationRole', sys_notice: '组织 <b>{organization}</b> 已把你的角色改为 <b>{role}</b>', email: email_html, email_title: 'GitLink: 在 {organization} 组织你的账号有权限变更', notification_url: '{baseurl}/{login}') | |||
| self.create(type: 'MessageTemplate::ProjectDeleted', sys_notice: '你关注的仓库{nickname}/{repository}已被删除', notification_url: '') | |||
| self.create(type: 'MessageTemplate::ProjectFollowed', sys_notice: '<b>{nickname}</b> 关注了你管理的仓库', notification_url: '{baseurl}/{login}') | |||
| self.create(type: 'MessageTemplate::ProjectForked', sys_notice: '<b>{nickname1}</b> 复刻了你管理的仓库{nickname1}/{repository1}到{nickname2}/{repository2}', notification_url: '{baseurl}/{owner}/{identifier}') | |||
| @@ -66,6 +64,10 @@ class MessageTemplate < ApplicationRecord | |||
| self.create(type: 'MessageTemplate::PullRequestJournal', sys_notice: '{nickname}评论合并请求{title}:<b>{notes}</b>', notification_url: '{baseurl}/{owner}/{identifier}/pulls/{id}') | |||
| email_html = File.read("#{email_template_html_dir}/pull_request_merged.html") | |||
| self.create(type: 'MessageTemplate::PullRequestMerged', sys_notice: '你提交的合并请求:{title} <b>已通过</b>', email: email_html, email_title: 'GitLink: 合并请求 {title} 有状态变更', notification_url: '{baseurl}/{owner}/{identifier}/pulls/{id}') | |||
| email_html = File.read("#{email_template_html_dir}/team_joined.html") | |||
| self.create(type: 'MessageTemplate::TeamJoined', sys_notice: '你已被拉入组织 <b>{organization}</b> 的 <b>{team}</b> 团队,拥有 <b>{role}</b>', email: email_html, email_title: 'GitLink: 在 {organization} 组织你的账号有权限变更', notification_url: '{baseurl}/{login}') | |||
| email_html = File.read("#{email_template_html_dir}/team_left.html") | |||
| self.create(type: 'MessageTemplate::TeamLeft', sys_notice: '你已被移出组织 <b>{organization}</b> 的 <b>{team}</b> 团队', email: email_html, email_title: 'GitLink: 在 {organization} 组织你的账号有权限变更', notification_url: '{baseurl}/{login}') | |||
| end | |||
| def self.sys_notice | |||
| @@ -0,0 +1,58 @@ | |||
| # == 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) | |||
| # | |||
| # 账号被拉入组织团队 | |||
| class MessageTemplate::TeamJoined < MessageTemplate | |||
| # MessageTemplate::TeamJoined.get_message_content(User.where(login: 'yystopf'), Organization.last, Organization.last.teams.take) | |||
| def self.get_message_content(receivers, organization, team) | |||
| receivers.each do |receiver| | |||
| if receiver.user_template_message_setting.present? | |||
| receivers = receivers.where.not(id: receiver.id) unless receiver.user_template_message_setting.notification_body["Normal::Permission"] | |||
| end | |||
| end | |||
| return '', '', '' if receivers.blank? | |||
| content = sys_notice.gsub('{organization}', organization&.real_name).gsub('{team}', team&.nickname).gsub('{role}', team&.authorize_name) | |||
| url = notification_url.gsub('{login}', organization&.login) | |||
| return receivers_string(receivers), content, url | |||
| rescue => e | |||
| Rails.logger.info("MessageTemplate::TeamJoined.get_message_content [ERROR] #{e}") | |||
| return '', '', '' | |||
| end | |||
| def self.get_email_message_content(receiver, organization, role) | |||
| if receiver.user_template_message_setting.present? | |||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Permission"] | |||
| title = email_title | |||
| title.gsub!('{organization}', organization&.real_name) | |||
| title.gsub!('{team}', team&.nickname) | |||
| title.gsub!('{role}', team&.authorize_name) | |||
| content = email | |||
| content.gsub!('{receiver}', receiver&.real_name) | |||
| content.gsub!('{baseurl}', base_url) | |||
| content.gsub!('{login}', organization&.login) | |||
| content.gsub!('{organization}', organization&.real_name) | |||
| content.gsub!('{team}', team&.nickname) | |||
| content.gsub!('{role}', team&.authorize_name) | |||
| return receiver&.mail, title, content | |||
| else | |||
| return '', '', '' | |||
| end | |||
| rescue => e | |||
| Rails.logger.info("MessageTemplate::TeamJoined.get_email_message_content [ERROR] #{e}") | |||
| return '', '', '' | |||
| end | |||
| end | |||
| @@ -0,0 +1,58 @@ | |||
| # == 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) | |||
| # | |||
| # 账号被移出组织团队 | |||
| class MessageTemplate::TeamLeft < MessageTemplate | |||
| # MessageTemplate::TeamLeft.get_message_content(User.where(login: 'yystopf'), Organization.last, Organization.last.teams.take) | |||
| def self.get_message_content(receivers, organization, team) | |||
| receivers.each do |receiver| | |||
| if receiver.user_template_message_setting.present? | |||
| receivers = receivers.where.not(id: receiver.id) unless receiver.user_template_message_setting.notification_body["Normal::Permission"] | |||
| end | |||
| end | |||
| return '', '', '' if receivers.blank? | |||
| content = sys_notice.gsub('{organization}', organization&.real_name).gsub('{team}', team&.nickname).gsub('{role}', team&.authorize_name) | |||
| url = notification_url.gsub('{login}', organization&.login) | |||
| return receivers_string(receivers), content, url | |||
| rescue => e | |||
| Rails.logger.info("MessageTemplate::TeamLeft.get_message_content [ERROR] #{e}") | |||
| return '', '', '' | |||
| end | |||
| def self.get_email_message_content(receiver, organization, team) | |||
| if receiver.user_template_message_setting.present? | |||
| return '', '', '' unless receiver.user_template_message_setting.email_body["Normal::Permission"] | |||
| title = email_title | |||
| title.gsub!('{organization}', organization&.real_name) | |||
| title.gsub!('{team}', team&.nickname) | |||
| title.gsub!('{role}', team&.authorize_name) | |||
| content = email | |||
| content.gsub!('{receiver}', receiver&.real_name) | |||
| content.gsub!('{baseurl}', base_url) | |||
| content.gsub!('{login}', organization&.login) | |||
| content.gsub!('{organization}', organization&.real_name) | |||
| content.gsub!('{team}', team&.nickname) | |||
| content.gsub!('{role}', team&.authorize_name) | |||
| return receiver&.mail, title, content | |||
| else | |||
| return '', '', '' | |||
| end | |||
| rescue => e | |||
| Rails.logger.info("MessageTemplate::TeamLeft.get_email_message_content [ERROR] #{e}") | |||
| return '', '', '' | |||
| end | |||
| end | |||
| @@ -56,10 +56,10 @@ class Team < ApplicationRecord | |||
| def authorize_name | |||
| case self.authorize | |||
| when 'read' then '报告者' | |||
| when 'write' then '开发者' | |||
| when 'admin' then '管理员' | |||
| when 'owner' then '拥有者' | |||
| when 'read' then '读取权限' | |||
| when 'write' then '写入权限' | |||
| when 'admin' then '管理员权限' | |||
| when 'owner' then '管理员权限' | |||
| else | |||
| '' | |||
| end | |||
| @@ -0,0 +1,47 @@ | |||
| <html> | |||
| <head> | |||
| <title>被拉入组织团队</title> | |||
| <style type="text/css"> | |||
| body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{ margin:0; padding:0;} | |||
| body,table,input,textarea,select,button { font-family: "微软雅黑","宋体"; font-size:12px;line-height:1.5; background:#eaebec;} | |||
| div,img,tr,td,table{ border:0;} | |||
| table,tr,td{border:0;} | |||
| ol,ul,li{ list-style-type:none} | |||
| .new_content{ background:#fff; width: 100%;} | |||
| .email-page-link{ } | |||
| .email-link-top{ } | |||
| .c_white{ color:#fff;} | |||
| .email-link-con{ } | |||
| .email-link-line{ } | |||
| .email-link-footer{ padding:15px; color:#333; line-height: 1.9; } | |||
| .c_grey02{ color: #888;} | |||
| .fb{ font-weight: normal;} | |||
| .f14{ } | |||
| </style> | |||
| </head> | |||
| <body style="background:#fff;"> | |||
| <div class="new_content"> | |||
| <div style="width: 598px; background:#fff; margin:20px auto;"> | |||
| <div style="height:50px; width: 578px; background:#3b94d6; padding:9px 10px 6px;border:1px solid #ddd; border-bottom:none;"> | |||
| <a href="{baseurl}"><img src="{baseurl}/images/email_logo.png" height="45" ></a> | |||
| <p style="color:#fff; float:right; margin-top:15px;">确实开源,协同创新</p> | |||
| <div style="clear:both; overflow:hidden;"></div> | |||
| </div> | |||
| <div style="width: 558px; border-left:1px solid #ddd;border-right:1px solid #ddd; background:#fff; padding:20px; color:#333; line-height: 1.9;"> | |||
| <p style="font-size: 14px; color:#333;"> | |||
| {receiver},您好!<br/> | |||
| 你已被拉入组织 <a href="{baseurl}/{login}" style="font-weight:bold;color:#3b94d6;">{organization}</a> 的 <a href="{baseurl}/{login}" style="font-weight:bold;color:#3b94d6;">{team}</a> 团队,拥有 {role} | |||
| </p> | |||
| <div style="width: 100%; border-top: 1px solid #ddd; margin:10px 0;"></div> | |||
| </div> | |||
| <div style="padding:20px; color:#333; line-height: 1.9;background: #eee;border:1px solid #ddd; border-top:none; width: 558px;"> | |||
| <p style="color:#888; float:left;">如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见<br/> | |||
| QQ群:1071514693</p> | |||
| <p style="color:#888; float:right;font-weight: bold;font-size: 16px;">GitLink团队</p> | |||
| <div style="clear:both; overflow:hidden;"></div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </body> | |||
| </html> | |||
| @@ -0,0 +1,47 @@ | |||
| <html> | |||
| <head> | |||
| <title>被移出组织团队</title> | |||
| <style type="text/css"> | |||
| body,h1,h2,h3,h4,h5,h6,hr,p,blockquote,dl,dt,dd,ul,ol,li,pre,form,fieldset,legend,button,input,textarea,th,td{ margin:0; padding:0;} | |||
| body,table,input,textarea,select,button { font-family: "微软雅黑","宋体"; font-size:12px;line-height:1.5; background:#eaebec;} | |||
| div,img,tr,td,table{ border:0;} | |||
| table,tr,td{border:0;} | |||
| ol,ul,li{ list-style-type:none} | |||
| .new_content{ background:#fff; width: 100%;} | |||
| .email-page-link{ } | |||
| .email-link-top{ } | |||
| .c_white{ color:#fff;} | |||
| .email-link-con{ } | |||
| .email-link-line{ } | |||
| .email-link-footer{ padding:15px; color:#333; line-height: 1.9; } | |||
| .c_grey02{ color: #888;} | |||
| .fb{ font-weight: normal;} | |||
| .f14{ } | |||
| </style> | |||
| </head> | |||
| <body style="background:#fff;"> | |||
| <div class="new_content"> | |||
| <div style="width: 598px; background:#fff; margin:20px auto;"> | |||
| <div style="height:50px; width: 578px; background:#3b94d6; padding:9px 10px 6px;border:1px solid #ddd; border-bottom:none;"> | |||
| <a href="{baseurl}"><img src="{baseurl}/images/email_logo.png" height="45" ></a> | |||
| <p style="color:#fff; float:right; margin-top:15px;">确实开源,协同创新</p> | |||
| <div style="clear:both; overflow:hidden;"></div> | |||
| </div> | |||
| <div style="width: 558px; border-left:1px solid #ddd;border-right:1px solid #ddd; background:#fff; padding:20px; color:#333; line-height: 1.9;"> | |||
| <p style="font-size: 14px; color:#333;"> | |||
| {receiver},您好!<br/> | |||
| 你已被移出组织 <a href="{baseurl}/{login}" style="font-weight:bold;color:#3b94d6;">{organization}</a> 的 <a href="{baseurl}/{login}" style="font-weight:bold;color:#3b94d6;">{team}</a> 团队 | |||
| </p> | |||
| <div style="width: 100%; border-top: 1px solid #ddd; margin:10px 0;"></div> | |||
| </div> | |||
| <div style="padding:20px; color:#333; line-height: 1.9;background: #eee;border:1px solid #ddd; border-top:none; width: 558px;"> | |||
| <p style="color:#888; float:left;">如果您在使用中有任何的疑问和建议,欢迎您给我们反馈意见<br/> | |||
| QQ群:1071514693</p> | |||
| <p style="color:#888; float:right;font-weight: bold;font-size: 16px;">GitLink团队</p> | |||
| <div style="clear:both; overflow:hidden;"></div> | |||
| </div> | |||
| </div> | |||
| </div> | |||
| </body> | |||
| </html> | |||