This commit is contained in:
Inex Code 2022-08-02 22:58:39 +03:00
parent d8d3cd2068
commit 8ea0d89d71

View file

@ -1,4 +1,5 @@
import asyncio import asyncio
import datetime
from typing import AsyncGenerator from typing import AsyncGenerator
import typing import typing
@ -7,10 +8,23 @@ from selfprivacy_api.graphql import IsAuthenticated
from selfprivacy_api.jobs import Job, Jobs from selfprivacy_api.jobs import Job, Jobs
@strawberry.type
class ApiJob:
name: str
description: str
status: str
status_text: typing.Optional[str]
progress: typing.Optional[int]
created_at: datetime.datetime
updated_at: datetime.datetime
finished_at: typing.Optional[datetime.datetime]
error: typing.Optional[str]
result: typing.Optional[str]
@strawberry.type @strawberry.type
class JobSubscription: class JobSubscription:
@strawberry.subscription(permission_classes=[IsAuthenticated]) @strawberry.subscription(permission_classes=[IsAuthenticated])
async def job_subscription(self) -> AsyncGenerator[typing.List[Job], None]: async def job_subscription(self) -> AsyncGenerator[typing.List[ApiJob], None]:
is_updated = True is_updated = True
def callback(jobs: typing.List[Job]): def callback(jobs: typing.List[Job]):
nonlocal is_updated nonlocal is_updated
@ -20,7 +34,18 @@ class JobSubscription:
while True: while True:
if is_updated: if is_updated:
is_updated = False is_updated = False
yield Jobs().jobs yield [ ApiJob(
name=job.name,
description=job.description,
status=job.status.name,
status_text=job.status_text,
progress=job.progress,
created_at=job.created_at,
updated_at=job.updated_at,
finished_at=job.finished_at,
error=job.error,
result=job.result,
) for job in Jobs().get_jobs() ]
except GeneratorExit: except GeneratorExit:
Jobs().remove_observer(callback) Jobs().remove_observer(callback)
return return