package com.sohu.cache.web.util;
import com.sohu.cache.constant.AppAuditType;
import com.sohu.cache.constant.AppCheckEnum;
import com.sohu.cache.constant.RedisConfigTemplateChangeEnum;
import com.sohu.cache.entity.AppAudit;
import com.sohu.cache.entity.AppDailyData;
import com.sohu.cache.entity.AppDesc;
import com.sohu.cache.entity.AppUser;
import com.sohu.cache.entity.InstanceAlertValueResult;
import com.sohu.cache.entity.InstanceConfig;
import com.sohu.cache.stats.app.AppStatsCenter;
import com.sohu.cache.util.ConstUtils;
import com.sohu.cache.web.component.EmailComponent;
import com.sohu.cache.web.enums.SuccessEnum;
import com.sohu.cache.web.service.UserService;
import com.sohu.cache.web.vo.AppDetailVO;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.velocity.app.VelocityEngine;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
* 邮件通知应用的申请流程(方法内是具体的文案)
*
* @author leifu
* @Time 2014年10月16日
*/
public class AppEmailUtil {
private EmailComponent emailComponent;
private UserService userService;
private VelocityEngine velocityEngine;
private AppStatsCenter appStatsCenter;
private Logger logger = Logger.getLogger(AppEmailUtil.class);
/**
* 应用状态通知
* @param appDesc
* @param appAudit
*/
public void noticeAppResult(AppDesc appDesc, AppAudit appAudit) {
List<String> ccEmailList = getCCEmailList(appDesc, appAudit);
String mailContent = VelocityUtils.createText(velocityEngine, appDesc, appAudit, new AppDailyData(), new ArrayList<InstanceAlertValueResult>(), "appAudit.vm", "UTF-8");
AppUser appUser = userService.get(appDesc.getUserId());
emailComponent.sendMail("【CacheCloud】状态通知", mailContent, Arrays.asList(appUser.getEmail()), ccEmailList);
}
/**
* 重要应用抄送
* @param appDesc
* @param appAudit
* @return
*/
private List<String> getCCEmailList(AppDesc appDesc, AppAudit appAudit) {
Set<String> ccEmailSet = new LinkedHashSet<String>();
for (String email : emailComponent.getAdminEmail().split(ConstUtils.COMMA)) {
ccEmailSet.add(email);
}
//S级别,且是开通邮件
if (appDesc.isSuperImportant() && AppAuditType.APP_AUDIT.getValue() == appAudit.getType()) {
ccEmailSet.addAll(ConstUtils.LEADER_EMAIL_LIST);
}
return new ArrayList<String>(ccEmailSet);
}
/**
* 贡献者通知
* @param groupName
* @param applyReason
* @param appUser
*/
public void noticeBecomeContributor(String groupName, String applyReason, AppUser appUser) {
StringBuffer mailContent = new StringBuffer();
mailContent.append(appUser.getChName() + "(项目组:"+groupName+")申请成为CacheCloud贡献者<br/>");
mailContent.append("申请理由:<br/>" + applyReason);
emailComponent.sendMail("【CacheCloud】状态通知", mailContent.toString(), Arrays.asList(appUser.getEmail()), Arrays.asList(emailComponent.getAdminEmail().split(ConstUtils.COMMA)));
}
/**
* 注册用户通知
* @param appUser
* @param appAudit
*/
public void noticeUserResult(AppUser appUser, AppAudit appAudit) {
if(appAudit == null){
return;
}
StringBuffer mailContent = new StringBuffer();
if (AppCheckEnum.APP_WATING_CHECK.value().equals(appAudit.getStatus())) {
mailContent.append(appUser.getChName() + "申请想成为CacheCloud用户,请管理员帮忙处理!<br/>");
} else if (AppCheckEnum.APP_PASS.value().equals(appAudit.getStatus())) {
mailContent.append("您的用户申请已经审批通过,您可以登录正常Cachecloud了!<br/>");
} else if (AppCheckEnum.APP_REJECT.value().equals(appAudit.getStatus())) {
mailContent.append("您的用户申请被驳回,原因是: " + appAudit.getRefuseReason());
}
emailComponent.sendMail("【CacheCloud】状态通知", mailContent.toString(), Arrays.asList(appUser.getEmail()), Arrays.asList(emailComponent.getAdminEmail().split(ConstUtils.COMMA)));
}
/**
* 下线应用通知
* @param appUser
* @param appId
* @param isSuccess
*/
public void noticeOfflineApp(AppUser appUser, Long appId, boolean isSuccess) {
AppDetailVO appDetailVO = appStatsCenter.getAppDetail(appId);
StringBuilder mailContent = new StringBuilder();
mailContent.append(appUser.getChName()).append(",对应用appid=").append(appId);
mailContent.append("进行下线,操作结果是").append(isSuccess?"成功":"失败");
mailContent.append(",请知晓!");
emailComponent.sendMail("【CacheCloud】状态通知", mailContent.toString(), appDetailVO.getEmailList(), Arrays.asList(emailComponent.getAdminEmail().split(ConstUtils.COMMA)));
}
public void sendRedisConfigTemplateChangeEmail(AppUser appUser, InstanceConfig instanceConfig,
SuccessEnum successEnum, RedisConfigTemplateChangeEnum redisConfigTemplateChangeEnum) {
String mailTitle = "【CacheCloud】-Redis配置模板修改通知";
String mailContent = String.format("%s 对Redis配置模板 进行了%s,操作结果是%s,具体为(key=%s,value=%s,状态为%s)",
appUser.getChName(),
redisConfigTemplateChangeEnum.getInfo(), successEnum.info(), instanceConfig.getConfigKey(),
instanceConfig.getConfigValue(), instanceConfig.getStatusDesc());
emailComponent.sendMail(mailTitle, mailContent.toString(), Arrays.asList(emailComponent.getAdminEmail().split(ConstUtils.COMMA)));
}
public void sendSystemConfigDifEmail(AppUser appUser, Map<String, String> systemDifConfigMap,
SuccessEnum successEnum) {
if (MapUtils.isEmpty(systemDifConfigMap)) {
return;
}
String mailTitle = "【CacheCloud】-系统配置修改通知";
StringBuffer mailContent = new StringBuffer();
mailContent.append(appUser.getChName() + "修改了系统配置,修改结果:" + successEnum.info() + "<br/>");
mailContent.append("具体配置如下:<br/>");
for(Entry<String, String> entry : systemDifConfigMap.entrySet()) {
mailContent.append(entry.getKey() + "-->" + entry.getValue() + "<br/>");
}
emailComponent.sendMail(mailTitle, mailContent.toString(), Arrays.asList(emailComponent.getAdminEmail().split(ConstUtils.COMMA)));
}
/**
* 系统通知
* @param noticeContent
* @return
*/
public boolean noticeAllUser(String noticeContent) {
if (StringUtils.isBlank(noticeContent)) {
return false;
}
try {
String mailTitle = "【CacheCloud】-系统通知";
StringBuffer mailContent = new StringBuffer();
String[] noticeArray = noticeContent.split(ConstUtils.NEXT_LINE);
for(String noticeLine : noticeArray) {
mailContent.append(noticeLine).append("<br/>");
}
List<String> emailList = new ArrayList<String>();
List<AppUser> appUserList = userService.getUserList(null);
if (CollectionUtils.isEmpty(appUserList)) {
return false;
}
for (AppUser appUser: appUserList) {
String email = appUser.getEmail();
if (StringUtils.isBlank(email)) {
continue;
}
emailList.add(email);
}
return emailComponent.sendMail(mailTitle, mailContent.toString(), emailList, Arrays.asList(emailComponent.getAdminEmail().split(ConstUtils.COMMA)));
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
return false;
}
public void setEmailComponent(EmailComponent emailComponent) {
this.emailComponent = emailComponent;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public void setVelocityEngine(VelocityEngine velocityEngine) {
this.velocityEngine = velocityEngine;
}
public void setAppStatsCenter(AppStatsCenter appStatsCenter) {
this.appStatsCenter = appStatsCenter;
}
}