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.errors.errors import Error
from crutches_on_wheels.errors.exception import VLException
from crutches_on_wheels.web.base_proxy_handler_class import VLBaseProxyHandler
from crutches_on_wheels.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