|
|
|
@ -3,16 +3,56 @@ from pymongo.asynchronous.database import AsyncDatabase |
|
|
|
from typing import List |
|
|
|
from entities.PacketGroup import PacketGroup |
|
|
|
from entities.PacketSignal import PacketSignal |
|
|
|
from pymongo import DESCENDING |
|
|
|
|
|
|
|
class NodeDbService: |
|
|
|
class MultiDeviceDbSupport: |
|
|
|
def __init__(self, dbStore, core): |
|
|
|
self.dbStore:AsyncDatabase = dbStore |
|
|
|
self.core = core |
|
|
|
#self.core.defaultDeviceUUID |
|
|
|
|
|
|
|
async def listOfNodes(self): |
|
|
|
#return {"$or": [{"device_uuid": value}]} |
|
|
|
def deviceHash2Match(self, devices_hashes = []): |
|
|
|
if devices_hashes == None: |
|
|
|
devices_hashes = [self.core.defaultDeviceUUID] |
|
|
|
elif (type(devices_hashes) == list): |
|
|
|
if devices_hashes.__len__() == 0: |
|
|
|
devices_hashes = [self.core.defaultDeviceUUID] |
|
|
|
else: |
|
|
|
devices_hashes = [devices_hashes] |
|
|
|
|
|
|
|
orPart = [] |
|
|
|
for hash in devices_hashes: |
|
|
|
uuid = self.core.devicesUuidHashToUuid.get(hash, "") |
|
|
|
if uuid: |
|
|
|
if uuid == self.core.defaultDeviceUUID: |
|
|
|
orPart.append({"device_uuid", None}) |
|
|
|
orPart.append({"device_uuid": uuid}) |
|
|
|
return orPart#-->{"$or": orPart} |
|
|
|
|
|
|
|
class MessageDbService(MultiDeviceDbSupport): |
|
|
|
def __init__(self, dbStore, core): |
|
|
|
super().__init__(dbStore, core) |
|
|
|
|
|
|
|
async def listOfMessage(self, limit:int, offset:int, after: float, before: float, devices = []): |
|
|
|
collection = self.dbStore['packet'] |
|
|
|
|
|
|
|
payload = { |
|
|
|
"to": int(self.core.PUB_CH), |
|
|
|
"portnum":self.MESSAGE_PORTNUM, |
|
|
|
"ts":{'$gt': after, "$lt": before}, |
|
|
|
"$or": self.deviceHash2Match(devices) |
|
|
|
} |
|
|
|
|
|
|
|
c = collection.find(payload).sort("ts", DESCENDING).skip(offset).limit(limit) |
|
|
|
return await c.to_list() |
|
|
|
|
|
|
|
class NodeDbService(MultiDeviceDbSupport): |
|
|
|
def __init__(self, dbStore, core): |
|
|
|
super().__init__(dbStore, core) |
|
|
|
|
|
|
|
async def listOfNodes(self, devices = []): |
|
|
|
pipeline = [ #ai slooop |
|
|
|
{"$match": {"device_uuid": self.core.defaultDeviceUUID}}, |
|
|
|
{"$match": {"$or": self.deviceHash2Match(devices)}}, |
|
|
|
# Сортировка для каждого num по убыванию ts |
|
|
|
{"$sort": {"num": 1, "ts": -1}}, |
|
|
|
# Группировка по num и взятие первого (последнего) документа |
|
|
|
@ -30,9 +70,9 @@ class NodeDbService: |
|
|
|
c = await collection.aggregate(pipeline) |
|
|
|
return await c.to_list() |
|
|
|
|
|
|
|
async def listOfDirectNodes(self): |
|
|
|
async def listOfDirectNodes(self, devices = []): |
|
|
|
pipeline = [ #ai slooop |
|
|
|
{"$match": {"hops_away": 0, "device_uuid": self.core.defaultDeviceUUID}}, # Фильтруем по списку |
|
|
|
{"$match": {"hops_away": 0, "$or": self.deviceHash2Match(devices)}}, # Фильтруем по списку |
|
|
|
# Сортировка для каждого num по убыванию ts |
|
|
|
{"$sort": {"num": 1, "ts": -1}}, |
|
|
|
# Группировка по num и взятие первого (последнего) документа |
|
|
|
@ -50,17 +90,17 @@ class NodeDbService: |
|
|
|
c = await collection.aggregate(pipeline) |
|
|
|
return await c.to_list() |
|
|
|
|
|
|
|
async def oneNode(self, num: int): |
|
|
|
async def oneNode(self, num: int, devices = []): |
|
|
|
collection = self.dbStore['node_info'] |
|
|
|
c = await collection.find_one( |
|
|
|
{"num":int(num), "device_uuid": self.core.defaultDeviceUUID}, |
|
|
|
{"num":int(num), "$or": self.deviceHash2Match(devices)}, |
|
|
|
sort=[("ts", -1)] |
|
|
|
) |
|
|
|
return c |
|
|
|
|
|
|
|
async def listOfSelectedNodes(self, nums: List[int]): |
|
|
|
async def listOfSelectedNodes(self, nums: List[int], devices = []): |
|
|
|
pipeline = [ |
|
|
|
{"$match": {"num": {"$in": nums}, "device_uuid": self.core.defaultDeviceUUID}}, # Фильтруем по списку |
|
|
|
{"$match": {"num": {"$in": nums}, "$or": self.deviceHash2Match(devices)}}, # Фильтруем по списку |
|
|
|
{"$sort": {"num": 1, "ts": -1}}, # Сортируем по num и ts (по убыванию) |
|
|
|
{ |
|
|
|
"$group": { |
|
|
|
@ -75,9 +115,9 @@ class NodeDbService: |
|
|
|
c = await collection.aggregate(pipeline) |
|
|
|
return await c.to_list() |
|
|
|
|
|
|
|
async def listOfFindLikeName(self, long_name): |
|
|
|
async def listOfFindLikeName(self, long_name, devices = []): |
|
|
|
pipeline = [ |
|
|
|
{"$match": {"long_name": {"$regex":long_name ,'$options' : 'i'}, "device_uuid": self.core.defaultDeviceUUID}}, # Фильтруем по списку |
|
|
|
{"$match": {"long_name": {"$regex":long_name ,'$options' : 'i'}, "$or": self.deviceHash2Match(devices)}}, # Фильтруем по списку |
|
|
|
{"$sort": {"num": 1, "ts": -1}}, # Сортируем по num и ts (по убыванию) |
|
|
|
{ |
|
|
|
"$group": { |
|
|
|
@ -92,17 +132,17 @@ class NodeDbService: |
|
|
|
c = await collection.aggregate(pipeline) |
|
|
|
return await c.to_list() |
|
|
|
|
|
|
|
class PacketDbService: |
|
|
|
class PacketDbService(MultiDeviceDbSupport): |
|
|
|
def __init__(self, dbStore, core): |
|
|
|
self.dbStore:AsyncDatabase = dbStore |
|
|
|
self.core = core |
|
|
|
super().__init__(dbStore, core) |
|
|
|
|
|
|
|
async def findPacketsSignals(self, |
|
|
|
after: float = -1, |
|
|
|
before: float = -1, |
|
|
|
nums: List[int] = []): |
|
|
|
nums: List[int] = [], |
|
|
|
devices = []): |
|
|
|
pipeline = [] |
|
|
|
match = {"device_uuid": self.core.defaultDeviceUUID} |
|
|
|
match = {"$or": self.deviceHash2Match(devices)} |
|
|
|
if after != -1 or before != -1: |
|
|
|
match["ts"] = {} |
|
|
|
if after != -1: |
|
|
|
@ -127,10 +167,11 @@ class PacketDbService: |
|
|
|
nums: List[int] = [], |
|
|
|
portnums: List[int] = [], |
|
|
|
packetsPerNode = False, |
|
|
|
packetsSumNode = False): |
|
|
|
packetsSumNode = False, |
|
|
|
devices = []): |
|
|
|
pipeline = [] |
|
|
|
|
|
|
|
match = {} |
|
|
|
match = {"$or": self.deviceHash2Match(devices)} |
|
|
|
if after != -1 or before != -1: |
|
|
|
match["ts"] = {} |
|
|
|
if after != -1: |
|
|
|
@ -149,7 +190,6 @@ class PacketDbService: |
|
|
|
match["portnums"] = {"$in":portnums} |
|
|
|
|
|
|
|
if match: |
|
|
|
match.update({"device_uuid": self.core.defaultDeviceUUID}) |
|
|
|
pipeline.append({"$match":match}) |
|
|
|
|
|
|
|
#групировка по количеству на выхлопе _id номер портнума и count число его юзов |
|
|
|
@ -175,8 +215,9 @@ class PacketDbService: |
|
|
|
l = await c.to_list() |
|
|
|
return [PacketGroup(p, packetsPerNode, packetsSumNode) for p in l] |
|
|
|
|
|
|
|
class DbService(NodeDbService, PacketDbService): |
|
|
|
class DbService(NodeDbService, PacketDbService, MessageDbService): |
|
|
|
def __init__(self, dbStore, core): |
|
|
|
NodeDbService.__init__(self, dbStore, core) |
|
|
|
PacketDbService.__init__(self, dbStore, core) |
|
|
|
MessageDbService.__init__(self, dbStore, core) |
|
|
|
|