feat(notification): 引入通知授权检查机制

- 在任务服务中集成通知授权工具类
- 实现视频生成通知前的权限校验逻辑- 在下载通知任务中增加授权消费检查- 添加过期提醒及额外下载通知的权限控制
- 完善无授权时的日志记录与处理流程
This commit is contained in:
2025-10-15 17:37:51 +08:00
parent c80086ba69
commit 27f356519e
2 changed files with 42 additions and 8 deletions

View File

@@ -57,6 +57,7 @@ import com.ycwl.basic.task.VideoPieceGetter;
import com.ycwl.basic.repository.TemplateRepository;
import com.ycwl.basic.utils.SnowFlakeUtil;
import com.ycwl.basic.utils.VideoReUploader;
import com.ycwl.basic.utils.NotificationAuthUtils;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
@@ -130,6 +131,8 @@ public class TaskTaskServiceImpl implements TaskService {
private MemberRelationRepository memberRelationRepository;
@Autowired
private ZtMessageProducerService ztMessageProducerService;
@Autowired
private NotificationAuthUtils notificationAuthUtils;
private RenderWorkerEntity getWorker(@NonNull WorkerAuthReqVo req) {
String accessKey = req.getAccessKey();
@@ -642,16 +645,23 @@ public class TaskTaskServiceImpl implements TaskService {
log.warn("未配置视频生成通知模板");
return;
}
// 检查并消费通知授权
if (!notificationAuthUtils.checkAndConsumeAuthorization(memberId, templateId, item.getScenicId())) {
log.debug("用户[memberId={}]对模板[templateId={}]授权不足,跳过视频生成通知", memberId, templateId);
return;
}
ScenicEntity scenic = scenicRepository.getScenic(item.getScenicId());
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(item.getScenicId());
String configTitle = configManager.getString("first_notification_title");
String configContent = configManager.getString("first_notification_content");
if (StringUtils.isBlank(configTitle) || StringUtils.isBlank(configContent)) {
log.info("景区[{}]未配置第一次通知内容,跳过发送通知", scenic.getName());
return;
}
String title = configTitle.replace("【景区】", scenic.getName());
String page;
if (configManager.getBoolean("grouping_enable", false)) {

View File

@@ -17,6 +17,7 @@ import com.ycwl.basic.model.pc.scenic.req.ScenicReqQuery;
import com.ycwl.basic.repository.ScenicRepository;
import com.ycwl.basic.repository.TemplateRepository;
import com.ycwl.basic.integration.common.manager.ScenicConfigManager;
import com.ycwl.basic.utils.NotificationAuthUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -50,6 +51,8 @@ public class DownloadNotificationTasker {
private CouponMapper couponMapper;
@Autowired
private ZtMessageProducerService ztMessageProducerService;
@Autowired
private NotificationAuthUtils notificationAuthUtils;
@Scheduled(cron = "0 0 21 * * *")
public void sendDownloadNotification() {
@@ -75,16 +78,23 @@ public class DownloadNotificationTasker {
log.info("模板消息为空");
return;
}
// 检查并消费通知授权
if (!notificationAuthUtils.checkAndConsumeAuthorization(item.getMemberId(), templateId, item.getScenicId())) {
log.debug("用户[memberId={}]对模板[templateId={}]授权不足,跳过下载通知", item.getMemberId(), templateId);
return;
}
ScenicEntity scenic = scenicRepository.getScenic(item.getScenicId());
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(item.getScenicId());
String configTitle = configManager.getString("second_notification_title");
String configContent = configManager.getString("second_notification_content");
if (StringUtils.isBlank(configTitle) || StringUtils.isBlank(configContent)) {
log.info("景区[{}]未配置第二次通知内容,跳过发送通知", scenic.getName());
return;
}
String title = configTitle.replace("【景区】", scenic.getName());
String page;
if (configManager.getBoolean("grouping_enable", false)) {
@@ -147,16 +157,23 @@ public class DownloadNotificationTasker {
log.info("模板消息为空");
return;
}
// 检查并消费通知授权
if (!notificationAuthUtils.checkAndConsumeAuthorization(item.getMemberId(), templateId, item.getScenicId())) {
log.debug("用户[memberId={}]对模板[templateId={}]授权不足,跳过过期提醒通知", item.getMemberId(), templateId);
return;
}
ScenicEntity scenic = scenicRepository.getScenic(item.getScenicId());
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(item.getScenicId());
String configTitle = configManager.getString("third_notification_title");
String configContent = configManager.getString("third_notification_content");
if (StringUtils.isBlank(configTitle) || StringUtils.isBlank(configContent)) {
log.info("景区[{}]未配置第三次通知内容,跳过发送通知", scenic.getName());
return;
}
String title = configTitle.replace("【景区】", scenic.getName());
String page;
if (configManager.getBoolean("grouping_enable", false)) {
@@ -242,15 +259,22 @@ public class DownloadNotificationTasker {
log.info("模板消息为空");
return;
}
// 检查并消费通知授权
if (!notificationAuthUtils.checkAndConsumeAuthorization(item.getMemberId(), templateId, item.getScenicId())) {
log.debug("用户[memberId={}]对模板[templateId={}]授权不足,跳过额外下载通知", item.getMemberId(), templateId);
return;
}
ScenicConfigManager configManager = scenicRepository.getScenicConfigManager(scenicId);
String configTitle = configManager.getString("second_notification_title");
String configContent = configManager.getString("second_notification_content");
if (StringUtils.isBlank(configTitle) || StringUtils.isBlank(configContent)) {
log.info("景区[{}]未配置第一次通知内容,跳过发送通知", scenic.getName());
return;
}
String title = configTitle.replace("【景区】", scenic.getName());
String page;
if (configManager.getBoolean("grouping_enable", false)) {