101 lines
4.6 KiB
Java
101 lines
4.6 KiB
Java
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;
|
||
}
|
||
|
||
}
|