From 9b24616c5cdfbf53465a1c89abe0ceaa123118d4 Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 9 Jul 2024 16:53:32 +0200 Subject: [PATCH 1/4] feat: get user tasks --- autotx/db.py | 12 ++++++++++++ autotx/models.py | 1 + autotx/server.py | 11 +++++++++++ 3 files changed, 24 insertions(+) diff --git a/autotx/db.py b/autotx/db.py index a4932ae..1f1de3f 100644 --- a/autotx/db.py +++ b/autotx/db.py @@ -64,6 +64,7 @@ def start(self, prompt: str, address: str, chain_id: int, app_user_id: str, prev return models.Task( id=result.data[0]["id"], + app_user_id=app_user_id, prompt=prompt, address=address, chain_id=chain_id, @@ -129,6 +130,7 @@ def get(self, task_id: str) -> models.Task | None: return models.Task( id=task_data["id"], + app_user_id=task_data["app_user_id"], prompt=task_data["prompt"], address=task_data["address"], chain_id=task_data["chain_id"], @@ -154,6 +156,7 @@ def get_all(self) -> list[models.Task]: tasks.append( models.Task( id=task_data["id"], + app_user_id=task_data["app_user_id"], prompt=task_data["prompt"], address=task_data["address"], chain_id=task_data["chain_id"], @@ -288,7 +291,16 @@ def get_transactions(app_id: str, app_user_id: str, task_id: str, address: str, [TransactionBase(**tx) for tx in json.loads(result.data[0]["transactions"])], result.data[0]["task_id"] ) + +def get_transactions_from_task(task_id: str): + client = get_db_client("public") + result = client.table("submitted_batches").select("transactions, task_id").eq("task_id", task_id).execute() + + if len(result.data) == 0: + return [] + return [TransactionBase(**tx) for tx in json.loads(result.data[0]["transactions"])] + def submit_transactions(app_id: str, app_user_id: str, submitted_batch_id: str) -> None: client = get_db_client("public") diff --git a/autotx/models.py b/autotx/models.py index 3f23f71..f912ccb 100644 --- a/autotx/models.py +++ b/autotx/models.py @@ -11,6 +11,7 @@ class TaskLog(BaseModel): class Task(BaseModel): id: str + app_user_id: str prompt: str address: str chain_id: int diff --git a/autotx/server.py b/autotx/server.py index 64c751a..fee76d7 100644 --- a/autotx/server.py +++ b/autotx/server.py @@ -294,6 +294,17 @@ def get_task(task_id: str, authorization: Annotated[str | None, Header()] = None task = get_task_or_404(task_id, tasks) return task +@app_router.get("/api/v1/tasks/user/{user_id}") +def get_user_tasks( + user_id: str, authorization: Annotated[str | None, Header()] = None +) -> str: + (_, app_user) = authorize_app_and_user(authorization, user_id) + return [ + {**task, "transactions": db.get_transactions_from_task(task.id)} + for task in db.TasksRepository().get_all() + if task.app_user_id == app_user.id + ] + @app_router.get("/api/v1/tasks/{task_id}/intents", response_model=List[Intent]) def get_intents(task_id: str, authorization: Annotated[str | None, Header()] = None) -> Any: app = authorize(authorization) From 2641ad970ba2ac1169d41dcd797ab8d0e4eb5d05 Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 9 Jul 2024 18:07:32 +0200 Subject: [PATCH 2/4] chore: retrieve submitted transactions from user --- autotx/db.py | 10 +++++++--- autotx/models.py | 1 + autotx/server.py | 23 ++++++++++++++++++----- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/autotx/db.py b/autotx/db.py index 1f1de3f..1b28f76 100644 --- a/autotx/db.py +++ b/autotx/db.py @@ -292,14 +292,18 @@ def get_transactions(app_id: str, app_user_id: str, task_id: str, address: str, result.data[0]["task_id"] ) -def get_transactions_from_task(task_id: str): +def get_submitted_transactions_from_user(app_user_id: str) -> list[list[TransactionBase]]: client = get_db_client("public") - result = client.table("submitted_batches").select("transactions, task_id").eq("task_id", task_id).execute() + result = client.table("submitted_batches").select("transactions").eq("app_user_id", app_user_id).not_.is_("submitted_on", "null").execute() if len(result.data) == 0: return [] - return [TransactionBase(**tx) for tx in json.loads(result.data[0]["transactions"])] + submitted_batches = [] + for batch in result.data: + submitted_batches.append([TransactionBase(**tx) for tx in json.loads(batch["transactions"])]) + + return submitted_batches def submit_transactions(app_id: str, app_user_id: str, submitted_batch_id: str) -> None: client = get_db_client("public") diff --git a/autotx/models.py b/autotx/models.py index f912ccb..71acb3c 100644 --- a/autotx/models.py +++ b/autotx/models.py @@ -3,6 +3,7 @@ from datetime import datetime from autotx.intents import Intent +from autotx.transactions import TransactionBase class TaskLog(BaseModel): type: str diff --git a/autotx/server.py b/autotx/server.py index fee76d7..a559167 100644 --- a/autotx/server.py +++ b/autotx/server.py @@ -297,13 +297,26 @@ def get_task(task_id: str, authorization: Annotated[str | None, Header()] = None @app_router.get("/api/v1/tasks/user/{user_id}") def get_user_tasks( user_id: str, authorization: Annotated[str | None, Header()] = None -) -> str: - (_, app_user) = authorize_app_and_user(authorization, user_id) - return [ - {**task, "transactions": db.get_transactions_from_task(task.id)} - for task in db.TasksRepository().get_all() +) -> dict[str, list[Any]]: + (app, app_user) = authorize_app_and_user(authorization, user_id) + tasks = db.TasksRepository(app_id=app.id).get_all() + user_tasks = [ + { + "id": task.id, + "prompt": task.prompt, + "address": task.address, + "chain_id": task.chain_id, + "intents": task.intents, + } + for task in tasks if task.app_user_id == app_user.id ] + user_submitted_transactions = [ + batch for batch in db.get_submitted_transactions_from_user(app_user.id) + ] + + return { "tasks": user_tasks, "submitted_transactions": user_submitted_transactions } + @app_router.get("/api/v1/tasks/{task_id}/intents", response_model=List[Intent]) def get_intents(task_id: str, authorization: Annotated[str | None, Header()] = None) -> Any: From ae0939403f7412798b5ca718c1cd9073360c657b Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 9 Jul 2024 18:42:03 +0200 Subject: [PATCH 3/4] chore: pass `app_id` to get submitted tx method --- autotx/db.py | 20 ++++++++++++++++---- autotx/server.py | 2 +- autotx/tests/api/test_send_transactions.py | 4 ++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/autotx/db.py b/autotx/db.py index 1b28f76..6a3ec0b 100644 --- a/autotx/db.py +++ b/autotx/db.py @@ -292,16 +292,28 @@ def get_transactions(app_id: str, app_user_id: str, task_id: str, address: str, result.data[0]["task_id"] ) -def get_submitted_transactions_from_user(app_user_id: str) -> list[list[TransactionBase]]: +def get_submitted_transactions_from_user( + app_id: str, + app_user_id: str, +) -> list[list[TransactionBase]]: client = get_db_client("public") - result = client.table("submitted_batches").select("transactions").eq("app_user_id", app_user_id).not_.is_("submitted_on", "null").execute() + result = ( + client.table("submitted_batches") + .select("transactions") + .eq("app_id", app_id) + .eq("app_user_id", app_user_id) + .not_.is_("submitted_on", "null") + .execute() + ) if len(result.data) == 0: return [] - + submitted_batches = [] for batch in result.data: - submitted_batches.append([TransactionBase(**tx) for tx in json.loads(batch["transactions"])]) + submitted_batches.append( + [TransactionBase(**tx) for tx in json.loads(batch["transactions"])] + ) return submitted_batches diff --git a/autotx/server.py b/autotx/server.py index a559167..3b5720b 100644 --- a/autotx/server.py +++ b/autotx/server.py @@ -312,7 +312,7 @@ def get_user_tasks( if task.app_user_id == app_user.id ] user_submitted_transactions = [ - batch for batch in db.get_submitted_transactions_from_user(app_user.id) + batch for batch in db.get_submitted_transactions_from_user(app.id, app_user.id) ] return { "tasks": user_tasks, "submitted_transactions": user_submitted_transactions } diff --git a/autotx/tests/api/test_send_transactions.py b/autotx/tests/api/test_send_transactions.py index 19fbbbf..3914a9f 100644 --- a/autotx/tests/api/test_send_transactions.py +++ b/autotx/tests/api/test_send_transactions.py @@ -182,10 +182,10 @@ def test_send_transactions(): assert batches[1].created_at is not None assert batches[1].submitted_on is None - assert batch1["batch_id"] == batches[0].id + assert batch1["batch_id"] in [batch.id for batch in batches] assert len(batch1["transactions"]) == 1 - assert batch2["batch_id"] == batches[1].id + assert batch2["batch_id"] in [batch.id for batch in batches] assert len(batch2["transactions"]) == 1 response = client.post(f"/api/v1/tasks/{task_id}/transactions", params={ From 7c23118596bb322144a07561e9cb0e099d561117 Mon Sep 17 00:00:00 2001 From: Cesar Date: Tue, 9 Jul 2024 18:55:31 +0200 Subject: [PATCH 4/4] chore: create method to get tasks from user --- autotx/db.py | 30 ++++++++++++++++++++++++++++-- autotx/models.py | 2 -- autotx/server.py | 3 +-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/autotx/db.py b/autotx/db.py index 6a3ec0b..5b69712 100644 --- a/autotx/db.py +++ b/autotx/db.py @@ -64,7 +64,6 @@ def start(self, prompt: str, address: str, chain_id: int, app_user_id: str, prev return models.Task( id=result.data[0]["id"], - app_user_id=app_user_id, prompt=prompt, address=address, chain_id=chain_id, @@ -130,7 +129,6 @@ def get(self, task_id: str) -> models.Task | None: return models.Task( id=task_data["id"], - app_user_id=task_data["app_user_id"], prompt=task_data["prompt"], address=task_data["address"], chain_id=task_data["chain_id"], @@ -152,6 +150,34 @@ def get_all(self) -> list[models.Task]: tasks = [] + for task_data in result.data: + tasks.append( + models.Task( + id=task_data["id"], + prompt=task_data["prompt"], + address=task_data["address"], + chain_id=task_data["chain_id"], + created_at=task_data["created_at"], + updated_at=task_data["updated_at"], + running=task_data["running"], + error=task_data["error"], + messages=json.loads(task_data["messages"]), + logs=[models.TaskLog(**log) for log in json.loads(task_data["logs"])] if task_data["logs"] else None, + intents=[load_intent(intent) for intent in json.loads(task_data["intents"])], + previous_task_id=task_data["previous_task_id"], + feedback=task_data["feedback"] + ) + ) + + return tasks + + def get_from_user(self, app_user_id: str) -> list[models.Task]: + client = get_db_client("public") + + result = client.table("tasks").select("*").eq("app_id", self.app_id).eq("app_user_id", app_user_id).execute() + + tasks = [] + for task_data in result.data: tasks.append( models.Task( diff --git a/autotx/models.py b/autotx/models.py index 71acb3c..3f23f71 100644 --- a/autotx/models.py +++ b/autotx/models.py @@ -3,7 +3,6 @@ from datetime import datetime from autotx.intents import Intent -from autotx.transactions import TransactionBase class TaskLog(BaseModel): type: str @@ -12,7 +11,6 @@ class TaskLog(BaseModel): class Task(BaseModel): id: str - app_user_id: str prompt: str address: str chain_id: int diff --git a/autotx/server.py b/autotx/server.py index 3b5720b..3c95cf0 100644 --- a/autotx/server.py +++ b/autotx/server.py @@ -299,7 +299,7 @@ def get_user_tasks( user_id: str, authorization: Annotated[str | None, Header()] = None ) -> dict[str, list[Any]]: (app, app_user) = authorize_app_and_user(authorization, user_id) - tasks = db.TasksRepository(app_id=app.id).get_all() + tasks = db.TasksRepository(app_id=app.id).get_from_user(app_user.id) user_tasks = [ { "id": task.id, @@ -309,7 +309,6 @@ def get_user_tasks( "intents": task.intents, } for task in tasks - if task.app_user_id == app_user.id ] user_submitted_transactions = [ batch for batch in db.get_submitted_transactions_from_user(app.id, app_user.id)