Files
rosetta-wss/src/main/java/im/rosetta/service/services/DeviceService.java

101 lines
4.6 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<DeviceRepository> {
public DeviceService(DeviceRepository repository) {
super(repository);
}
/**
* Проверяет, верифицировано ли устройство с deviceId для пользователя user
* @param deviceId ID устройства
* @param user пользователь
* @return true если устройство верифицировано, иначе false
*/
public boolean isDeviceVerifiedByUser(String deviceId, User user) {
List<Device> 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<Device> 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<String, Object>(){{
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<String> getPublicKeysByDeviceId(String deviceId) {
List<Device> devices = this.getRepository().findAllByField("deviceId", deviceId);
HashSet<String> publicKeys = new HashSet<>();
for(Device device : devices) {
publicKeys.add(device.getPublicKey());
}
return publicKeys;
}
}