Add get_all_tasks() endpoint

This commit is contained in:
Guozao Meng
2025-03-08 22:53:22 +04:00
parent cd0cbc8061
commit 91e9f3900d
2 changed files with 51 additions and 0 deletions

View File

@@ -15,12 +15,23 @@ class BaseState(ABC):
def get_task(self, task_id: str):
pass
@abstractmethod
def get_all_tasks(self, page: int, page_size: int):
pass
# Memory state management
class MemoryState(BaseState):
def __init__(self):
self._tasks = {}
def get_all_tasks(self, page: int, page_size: int):
start = (page - 1) * page_size
end = start + page_size
tasks = list(self._tasks.values())
total = len(tasks)
return tasks[start:end], total
def update_task(
self,
task_id: str,
@@ -33,6 +44,7 @@ class MemoryState(BaseState):
progress = 100
self._tasks[task_id] = {
"task_id": task_id,
"state": state,
"progress": progress,
**kwargs,
@@ -53,6 +65,28 @@ class RedisState(BaseState):
self._redis = redis.StrictRedis(host=host, port=port, db=db, password=password)
def get_all_tasks(self, page: int, page_size: int):
start = (page - 1) * page_size
end = start + page_size
tasks = []
cursor = 0
total = 0
while True:
cursor, keys = self._redis.scan(cursor, count=page_size)
total += len(keys)
if total > start:
for key in keys[max(0, start - total):end - total]:
task_data = self._redis.hgetall(key)
task = {
k.decode("utf-8"): self._convert_to_original_type(v) for k, v in task_data.items()
}
tasks.append(task)
if len(tasks) >= page_size:
break
if cursor == 0 or len(tasks) >= page_size:
break
return tasks, total
def update_task(
self,
task_id: str,
@@ -65,6 +99,7 @@ class RedisState(BaseState):
progress = 100
fields = {
"task_id": task_id,
"state": state,
"progress": progress,
**kwargs,