package im.rosetta.service.services; import java.util.HashSet; import java.util.List; import im.rosetta.client.tags.ECIAuthentificate; import im.rosetta.client.tags.ECIDevice; import im.rosetta.database.entity.Device; import im.rosetta.database.entity.User; import im.rosetta.database.repository.DeviceRepository; import im.rosetta.service.Service; import io.orprotocol.client.Client; public class DeviceService extends Service { public DeviceService(DeviceRepository repository) { super(repository); } /** * Проверяет, верифицировано ли устройство с deviceId для пользователя user * @param deviceId ID устройства * @param user пользователь * @return true если устройство верифицировано, иначе false */ public boolean isDeviceVerifiedByUser(String deviceId, User user) { List devices = this.getRepository().findAll(user); if(devices.size() == 0) { /** * Если у пользователя нет устройств, значит текущее устройство верифицировано * такого быть не может, это избыточная проверка */ return true; } for(Device device : devices) { if(device.getDeviceId().equals(deviceId)) { return true; } } return false; } /** * Получить список устройств для публичного ключа * @param publicKey публичный ключ пользователя, для которого нужно получить список устройств * @return список устройств для публичного ключа */ public List getDevicesByPK(String publicKey) { return this.getRepository().findAllByField("publicKey", publicKey); } /** * Получает время последней синхронизации устройства, для корректной работы синхронизации сообщений * @param client клиент для которого нужно получить время последней синхронизации устройства * @return время последней синхронизации устройства, или 0 если устройство не найдено, * или клиент не авторизован, таким образом вызывающий код синхронизирует все сообщения */ public long getLastSyncTime(Client client){ ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class); if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()){ /** * Если клиент не авторизован, возвращаем 0, такого быть не должно */ return 0; } ECIDevice eciDevice = client.getTag(ECIDevice.class); if(eciDevice == null){ /** * Если у клиента нет тега устройства, возвращаем 0, такого быть не должно, но на всякий случай */ return 0; } Device device = this.getRepository().findByField(new java.util.HashMap(){{ put("deviceId", eciDevice.getDeviceId()); put("publicKey", eciAuthentificate.getPublicKey()); }}); if(device == null){ /** * Если устройство не найдено, возвращаем 0, значит это устройство новое */ return 0; } return device.getSyncTime(); } /** * Получить публичные ключи пользователей, которые связаны с данным deviceId * @param deviceId ID устройства * @return набор публичных ключей пользователей, которые связаны с данным deviceId */ public HashSet getPublicKeysByDeviceId(String deviceId) { List devices = this.getRepository().findAllByField("deviceId", deviceId); HashSet publicKeys = new HashSet<>(); for(Device device : devices) { publicKeys.add(device.getPublicKey()); } return publicKeys; } }