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"})