Source code for luna_tasks.app.handlers.results_proxy_handler
from luna3.common.exceptions import LunaApiException
from sanic.response import HTTPResponse
from app.handlers.base_handler import BaseRequestHandler
from crutches_on_wheels.cow.enums.tasks import TaskStatus
from crutches_on_wheels.cow.errors.errors import Error
from crutches_on_wheels.cow.errors.exception import VLException
from crutches_on_wheels.cow.web.query_getters import uriParamIntGetter, uuidGetter
[docs]class TaskResultHandler(BaseRequestHandler):
    """
    Task result handler.
    """
[docs]    async def get(self, taskId: str) -> HTTPResponse:
        """
        Get error, see `spec`_
        .. _spec:
            _static/api.html#operation/getTaskResult
        Returns:
            response with result and "Content-Disposition" header
        """
        taskId = uriParamIntGetter(taskId, Error.PageNotFoundError)
        accountId = self.getQueryParam("account_id", uuidGetter)
        task = await self.dbContext.getTask(taskId=taskId, accountId=accountId)
        resultId = task["result_id"]
        if task["task_status"] in (TaskStatus.cancelled.value, TaskStatus.failed.value):
            error = Error.ImpossibleGetTaskResult.format(taskId, task["task_status"])
            raise VLException(error, 400, isCriticalError=False)
        if resultId is None:
            error = Error.TaskDoesNotHaveResultYet.format(taskId)
            raise VLException(error, 404, isCriticalError=False)
        try:
            resultResponse = await self.luna3Client.lunaTasksResultsStore.getObject(
                self.config.taskResultStorage.bucket, objectId=resultId, raiseError=True
            )
        except LunaApiException as e:
            if e.statusCode == 404:
                error = Error.TaskResultNotFound.format(taskId)
                self.logger.warning(f"result of task {taskId} with result id {resultId} not found")
                return self.error(404, error)
            raise
        extension = resultResponse.contentType.split("/")[-1]
        filename = f"task_{taskId}.{extension}"
        return self.success(
            200,
            resultResponse.body,
            contentType=resultResponse.contentType,
            extraHeaders={"Content-Disposition": f"attachment; filename={filename}"},
        )