Source code for luna_admin.app.handlers.search
from luna3.common.exceptions import LunaApiException
from vlutils.helpers import isUUID
from app.handlers.base_handler import BaseHandler
[docs]class SearchHandler(BaseHandler):
"""
Search objects handler.
"""
@property
def MapColumnGetter(self) -> dict:
"""
Returns MAP_COLUMN_GETTER
"""
return {
"list_id": {"getter": self.objectGetters.getListInfo, "name": "list"},
"account_id": {"getter": self.objectGetters.getAccountInfo, "name": "account"},
"face_id": {"getter": self.objectGetters.getFaceInfo, "name": "face"},
"attribute_id": {"getter": self.objectGetters.getAttributesInfo, "name": "attribute"},
}
[docs] async def getElementByIdAndColumn(self, column: str, elementId: str) -> dict:
"""
Get element by id from column.
Args:
column: column name
elementId: element id
Returns:
dict with element and element type
"""
data = await self.MapColumnGetter[column]["getter"](elementId)
return {"data": data, "type": self.MapColumnGetter[column]["name"]}
[docs] async def get(self):
"""
Search element by id or email. See `spec_search`_.
.. _spec_search:
_static/api.html#operation/search
Returns:
response with element info
"""
searchParam = self.getQueryParam("q")
if isUUID(searchParam):
for column in self.MapColumnGetter:
try:
element = await self.getElementByIdAndColumn(column, searchParam)
except LunaApiException as e:
if e.statusCode == 404:
continue
raise
if element["data"] is not None:
return self.success(200, outputJson=element)
return self.success(200, outputJson={"data": None, "type": None})
else:
accounts = (await self.luna3Client.lunaAccounts.getAccounts(login=searchParam, raiseError=True)).json[
"accounts"
]
if not accounts:
return self.success(200, outputJson={"data": None, "type": None})
stats = await self.objectGetters.getAccountStats(accounts[0]["account_id"])
account = {
"info": {
"account_id": accounts[0]["account_id"],
"account_type": accounts[0]["account_type"],
"email": accounts[0]["login"],
"login": accounts[0]["login"],
"organization_name": accounts[0]["description"],
"description": accounts[0]["description"],
},
"stats": stats,
}
return self.success(200, outputJson={"data": account, "type": "account"})