66 lines
2.7 KiB
Java
66 lines
2.7 KiB
Java
package im.rosetta.service.dispatch.push;
|
||
|
||
import java.util.HashMap;
|
||
import java.util.List;
|
||
import java.util.concurrent.ExecutorService;
|
||
import java.util.concurrent.Executors;
|
||
|
||
import im.rosetta.database.entity.PushToken;
|
||
import im.rosetta.database.repository.PushTokenRepository;
|
||
import im.rosetta.network.enums.TokenType;
|
||
import im.rosetta.service.dispatch.push.dispatchers.FCM;
|
||
import im.rosetta.service.dispatch.push.dispatchers.VoIPApns;
|
||
|
||
public class PushNotifyDispatcher {
|
||
|
||
private final ExecutorService executor = Executors.newFixedThreadPool(10);
|
||
private final PushTokenRepository pushTokenRepository = new PushTokenRepository();
|
||
|
||
private final HashMap<TokenType, Pusher> pushers = new HashMap<>() {{
|
||
put(TokenType.FCM, new FCM());
|
||
put(TokenType.VoIPApns, new VoIPApns());
|
||
}};
|
||
|
||
|
||
private Pusher findPusher(TokenType tokenType){
|
||
return this.pushers.get(tokenType);
|
||
}
|
||
|
||
/**
|
||
* Отправить уведомление пользователю с publicKey, используя все его токены для отправки уведомления, если таковые имеются
|
||
* @param publicKey публичный ключ пользователя, которому нужно отправить уведомление
|
||
* @param data данные уведомления
|
||
*/
|
||
public void sendPush(String publicKey, HashMap<String, String> data) {
|
||
List<PushToken> pushTokens = this.pushTokenRepository.findTokens(publicKey);
|
||
executor.execute(() -> {
|
||
for(PushToken pushToken : pushTokens){
|
||
Pusher pusher = this.findPusher(pushToken.getType());
|
||
if(pusher != null){
|
||
pusher.sendPush(pushToken.getToken(), data);
|
||
}
|
||
}
|
||
});
|
||
}
|
||
|
||
/**
|
||
* Отправить уведомление пользователям с publicKeys, используя все их токены для отправки уведомления, если таковые имеются
|
||
* @param publicKeys список публичных ключей пользователей, которым нужно отправить уведомление
|
||
* @param data данные уведомления
|
||
*/
|
||
public void sendPush(List<String> publicKeys, HashMap<String, String> data) {
|
||
List<PushToken> pushTokens = this.pushTokenRepository.findTokens(publicKeys);
|
||
executor.execute(() -> {
|
||
for(PushToken pushToken : pushTokens){
|
||
Pusher pusher = this.findPusher(pushToken.getType());
|
||
if(pusher != null){
|
||
pusher.sendPush(pushToken.getToken(), data);
|
||
}
|
||
}
|
||
}
|
||
);
|
||
}
|
||
|
||
|
||
}
|