diff --git a/reauth_after_risk_event/README.md b/reauth_after_risk_event/README.md new file mode 100644 index 000000000..e69de29bb diff --git a/reauth_after_risk_event/starter.py b/reauth_after_risk_event/starter.py new file mode 100644 index 000000000..be684078d --- /dev/null +++ b/reauth_after_risk_event/starter.py @@ -0,0 +1,19 @@ +import asyncio +from datetime import timedelta +from temporalio.client import Client + +async def main(): + client = await Client.connect("localhost:7233") + + result = await client.start_workflow( + "ReauthenticationAfterRiskEventWorkflow", + "user-123", # user_id + id="reauth-workflow-user-123", + task_queue="reauth-task-queue", + run_timeout=timedelta(minutes=1), # Correct timeout usage + ) + + print(f"Started workflow. Run ID: {result.id}") + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/reauth_after_risk_event/worker.py b/reauth_after_risk_event/worker.py new file mode 100644 index 000000000..c2f2f54a9 --- /dev/null +++ b/reauth_after_risk_event/worker.py @@ -0,0 +1,17 @@ +import asyncio +from temporalio.worker import Worker +from temporalio.client import Client +from workflow import ReauthenticationAfterRiskEventWorkflow + +async def main(): + client = await Client.connect("localhost:7233") + worker = Worker( + client, + task_queue="reauth-task-queue", + workflows=[ReauthenticationAfterRiskEventWorkflow], + ) + print("Worker started.") + await worker.run() + +if __name__ == "__main__": + asyncio.run(main()) diff --git a/reauth_after_risk_event/workflow.py b/reauth_after_risk_event/workflow.py new file mode 100644 index 000000000..9dd393f50 --- /dev/null +++ b/reauth_after_risk_event/workflow.py @@ -0,0 +1,29 @@ +from datetime import timedelta +from temporalio import workflow + +# Signal to be sent when user completes reauthentication +@workflow.defn +class ReauthenticationAfterRiskEventWorkflow: + def __init__(self): + self.reauthenticated = False + + @workflow.signal + async def complete_reauthentication(self): + self.reauthenticated = True + + @workflow.run + async def run(self, user_id: str, timeout_minutes: int = 10) -> str: + workflow.logger.info(f"Started reauth workflow for user: {user_id}") + + # Wait for signal or timeout + try: + await workflow.wait_condition( + lambda: self.reauthenticated, + timeout=timedelta(minutes=timeout_minutes) + ) + except TimeoutError: + workflow.logger.warn("Timeout waiting for reauthentication") + return "failed_timeout" + + workflow.logger.info("User successfully reauthenticated") + return "success"