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 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 data) { List 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 publicKeys, HashMap data) { List 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); } } } ); } }