selfprivacy-rest-api/selfprivacy_api/graphql/subscriptions/jobs.py

77 lines
2.3 KiB
Python
Raw Normal View History

2022-08-02 22:50:16 +03:00
import asyncio
2022-08-02 22:58:39 +03:00
import datetime
2022-08-02 22:50:16 +03:00
from typing import AsyncGenerator
import typing
import strawberry
from selfprivacy_api.graphql import IsAuthenticated
from selfprivacy_api.jobs import Job, Jobs
2022-08-02 23:12:48 +03:00
2022-08-02 22:58:39 +03:00
@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]
2022-08-02 23:12:48 +03:00
2022-08-02 22:50:16 +03:00
@strawberry.type
class JobSubscription:
2022-08-02 23:30:03 +03:00
@strawberry.subscription
async def count(self, target: int = 100) -> AsyncGenerator[int, None]:
for i in range(target):
yield i
await asyncio.sleep(0.5)
2022-08-02 23:08:32 +03:00
@strawberry.subscription()
2022-08-02 22:58:39 +03:00
async def job_subscription(self) -> AsyncGenerator[typing.List[ApiJob], None]:
2022-08-02 22:50:16 +03:00
is_updated = True
2022-08-02 23:12:48 +03:00
2022-08-02 22:50:16 +03:00
def callback(jobs: typing.List[Job]):
nonlocal is_updated
is_updated = True
2022-08-02 23:12:48 +03:00
print("Subscribing to job updates...")
2022-08-02 23:30:03 +03:00
Jobs.get_instance().add_observer(callback)
2022-08-02 23:12:48 +03:00
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,
)
2022-08-02 23:30:03 +03:00
for job in Jobs.get_instance().get_jobs()
2022-08-02 23:12:48 +03:00
]
2022-08-02 23:08:32 +03:00
while True:
if is_updated:
is_updated = False
2022-08-02 23:12:48 +03:00
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,
)
2022-08-02 23:30:03 +03:00
for job in Jobs.get_instance().get_jobs()
2022-08-02 23:12:48 +03:00
]