package com.ruoyi.message.wechat;
import com.ruoyi.message.SendException;
import com.ruoyi.message.SendResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
/**
* 微信公众号发送方工厂:按 key 路由到一个具体实现。
*
* 注意:公众号通道的 key 与短信通道的 key 可以同名(例如 {@code hzszlyy} 既有短信发送方
* 也有公众号发送方),因此两个工厂各自维护自己的注册表,互不干扰。
*/
@Slf4j
@Component
public class WechatSenderFactory {
private final Map senders = new LinkedHashMap<>();
public WechatSenderFactory(List senderList) {
for (WechatSender sender : senderList) {
WechatSender exists = senders.put(sender.key(), sender);
if (exists != null) {
throw new IllegalStateException("公众号发送方 key 重复:" + sender.key()
+ ",冲突实现:" + exists.getClass().getName() + " 与 " + sender.getClass().getName());
}
}
log.info("【WechatSenderFactory】已注册公众号发送方:{}", senders.keySet());
}
/**
* 按 key 获取发送方
*
* @param key 渠道 key(即 {@code spring.profiles.active} 取值)
* @throws SendException 找不到对应实现时抛出
*/
public WechatSender get(String key) {
WechatSender sender = key == null ? null : senders.get(key);
if (sender == null) {
throw new SendException("未找到公众号发送方,key=" + key + ",已注册:" + senders.keySet());
}
return sender;
}
/**
* 按 key 获取发送方,找不到返回 {@code null}
*/
public WechatSender getOrNull(String key) {
return key == null ? null : senders.get(key);
}
/**
* 按 key 发送公众号消息
*/
public SendResult send(String key, WechatSendRequest request) {
return get(key).send(request);
}
/**
* 判断是否存在该 key 的发送方
*/
public boolean supports(String key) {
return getOrNull(key) != null;
}
/**
* 已注册的渠道 key
*/
public Set keys() {
return new TreeSet<>(senders.keySet());
}
}