Source code for luna_backport3.app.handlers.base_handler

# -*- coding: utf-8 -*-
""" Base handler

Module realize base class for all handlers.
"""
from luna3.accounts.http_objs import TokenPermissions
from luna3.common.exceptions import LunaApiException
from luna3.image_store.image_store import StoreApi
from luna3.lunavl.httpclient import LunaHttpClient
from sanic.response import HTTPResponse

from app.app import Backport3App
from app.handlers.base_request import Backport3Request
from configs.configs.configs.services import SettingsBackport3
from configs.configs.configs.settings.classes import ServiceAddressSettings, ServiceTimeoutsSettings
from crutches_on_wheels.cow.errors.errors import Error
from crutches_on_wheels.cow.errors.exception import VLException
from crutches_on_wheels.cow.web.base_proxy_handler_class import VLBaseProxyHandler
from crutches_on_wheels.cow.web.handlers import BaseHandler as VLBaseHandler
from db.db_context import DBContext

TOKEN_PERMISSIONS = TokenPermissions(
    handler=["creation"],
    token=["creation", "view", "modification", "deletion"],
    attribute=["creation", "view", "modification", "deletion", "matching"],
    face=["creation", "view", "modification", "deletion", "matching"],
    list=["creation", "view", "modification", "deletion"],
    event=["creation", "view", "matching"],
    faceSample=["creation", "view", "deletion"],
    image=["creation", "view", "deletion"],
    resources=["liveness"],
)


[docs]class BaseHandler(VLBaseHandler): """ Base handler for other handlers. """ # backport3 input request (typing for ide) request: Backport3Request def __init__(self, request: Backport3Request): super().__init__(request) self.accountId = request.accountId self.addDataForMonitoring(tags={"account_id": self.accountId}) self.lunaApiClient: LunaHttpClient = request.apiClient self.portraitsStoreClient: StoreApi = request.portraitsClient self.dbContext: DBContext = request.dbContext
[docs] async def checkDescriptor(self, descriptorId: str) -> bool: """ Check descriptor existence Args: descriptorId: descriptor id Returns: True if descriptor exists otherwise False Raises: VLException(statusCode=500, error=Error.UnknownServiceError) if check face is failed """ try: await self.lunaApiClient.checkFace(faceId=descriptorId, raiseError=True) except LunaApiException as exc: if exc.statusCode == 404: return False if exc.body: raise raise VLException( Error.UnknownServiceError.format( "luna-faces", "HEAD", f"{self.lunaApiClient.baseUri}/faces/{descriptorId}" ), statusCode=500, isCriticalError=False, ) return True
[docs] async def options(self, **kwargs) -> HTTPResponse: """ Method "OPTIONS" """ allowHeaders = {"Allow": ", ".join(self.getAllowedMethods())} return self.success(body=None, extraHeaders=allowHeaders)
@property def app(self) -> Backport3App: """ Get running app Returns: app """ return self.request.app @property def config(self) -> SettingsBackport3: """ Get app config Returns: app config """ return self.app.ctx.serviceConfig
[docs]class APIProxyBaseHandler(BaseHandler, VLBaseProxyHandler): """ Class for proxy handlers to luna-api """ @property def serviceAddress(self) -> ServiceAddressSettings: """ Get a image store service address Returns: a image store service address """ return self.config.apiAddress @property def serviceTimeouts(self) -> ServiceTimeoutsSettings: """ Get a image store service timeouts Returns: a image store service timeouts """ return self.config.apiTimeouts
[docs] def prepareHeaders(self) -> dict[str, str]: """ Extends headers with auth """ headers = super().prepareHeaders() headers.update(self.request.apiClient.getAuthHeader()) return headers