aboutsummaryrefslogtreecommitdiff
path: root/jb/views/common.py
diff options
context:
space:
mode:
authorMax Nanis2026-09-13 19:03:55 +0000
committerMax Nanis2026-09-13 19:03:55 +0000
commit8fbe8d439b418796932aaa88297e006c714e4d13 (patch)
tree6c800476edc1e771fc570b559d483df8d59d4324 /jb/views/common.py
parent12f6fee851b68e86af658dfa17e4a0daed457dd1 (diff)
parent2c94f248d2438071a918fa9a30bf114ef9aa29b4 (diff)
downloadamt-jb-8fbe8d439b418796932aaa88297e006c714e4d13.tar.gz
amt-jb-8fbe8d439b418796932aaa88297e006c714e4d13.zip
Merges pull request #3
Off of Amazon!!!
Diffstat (limited to 'jb/views/common.py')
-rw-r--r--jb/views/common.py68
1 files changed, 36 insertions, 32 deletions
diff --git a/jb/views/common.py b/jb/views/common.py
index 7011557..9eee453 100644
--- a/jb/views/common.py
+++ b/jb/views/common.py
@@ -1,19 +1,19 @@
import json
-from typing import Dict, Any
+from typing import Annotated, Any
import requests
-from fastapi import Request, APIRouter, HTTPException
+from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import HTMLResponse
+from generalresearch.redis_helper import RedisConfig
from starlette.responses import RedirectResponse
-from jb.config import settings, JB_EVENTS_STREAM
-from jb.decorators import REDIS, HM
-from jb.flow.monitoring import emit_assignment_event, emit_mturk_notification_event
-from jb.models.definitions import AssignmentStatus
+from jb.api.auth import get_authenticated_user
+from jb.config import JB_EVENTS_STREAM, settings
+from jb.decorators import get_redis_config
+from jb.flow.monitoring import emit_mturk_notification_event
+from jb.models.auth import User
from jb.models.event import MTurkEvent
from jb.settings import BASE_HTML
-from jb.config import settings
-from jb.views.tasks import process_request
common_router = APIRouter(prefix="", tags=["API"], include_in_schema=True)
@@ -29,37 +29,24 @@ async def work(request: Request):
amt_hit_id = request.query_params.get("hitId", None)
print(f"work: {amt_assignment_id=} {worker_id=} {amt_hit_id=}")
- if not worker_id:
+ if (
+ not worker_id
+ or not amt_assignment_id
+ or amt_assignment_id == "ASSIGNMENT_ID_NOT_AVAILABLE"
+ ):
return RedirectResponse(
url=f"/preview/?{request.url.query}" if request.url.query else "/preview/",
status_code=302,
)
- if amt_assignment_id is None or amt_assignment_id == "ASSIGNMENT_ID_NOT_AVAILABLE":
- # Worker is previewing the HIT
- amt_hit_type_id = "unknown"
- if amt_hit_id:
- hit = HM.get_from_amt_id(amt_hit_id=amt_hit_id)
- amt_hit_type_id = hit.amt_hit_type_id
- emit_assignment_event(
- status=AssignmentStatus.PreviewState, amt_hit_type_id=amt_hit_type_id
- )
- return RedirectResponse(
- url=f"/preview/?{request.url.query}" if request.url.query else "/preview/",
- status_code=302,
- )
+ return HTMLResponse(BASE_HTML)
- try:
- # The Worker has accepted the HIT
- process_request(request)
- except Exception:
- raise HTTPException(status_code=500, detail="Error processing request")
- return HTMLResponse(BASE_HTML)
+RedisConfigDep = Annotated[RedisConfig, Depends(get_redis_config)]
@common_router.post(path=f"/{settings.sns_path}/", include_in_schema=False)
-async def mturk_notifications(request: Request):
+async def mturk_notifications(request: Request, redis_config: RedisConfigDep):
"""
Our SNS topic will POST to this endpoint whenever we get a new message
"""
@@ -77,7 +64,7 @@ async def mturk_notifications(request: Request):
case "Notification":
msg = json.loads(message["Message"])
print("Received MTurk event:", msg)
- enqueue_mturk_notifications(msg)
+ enqueue_mturk_notifications(msg=msg, redis_config=redis_config)
case _:
raise HTTPException(status_code=500, detail="Invalid JSON")
@@ -85,10 +72,27 @@ async def mturk_notifications(request: Request):
return {"status": "ok"}
-def enqueue_mturk_notifications(msg: Dict[str, Any]) -> None:
+def enqueue_mturk_notifications(msg: dict[str, Any], redis_config: RedisConfig) -> None:
+ redis_client = redis_config.create_redis_client()
+
for evt in msg["Events"]:
event = MTurkEvent.from_sns(evt)
emit_mturk_notification_event(
event_type=event.event_type, amt_hit_type_id=event.amt_hit_type_id
)
- REDIS.xadd(JB_EVENTS_STREAM, {"data": event.model_dump_json()})
+
+ print("enqueue_mturk_notifications", event.model_dump_json())
+ redis_client.xadd(JB_EVENTS_STREAM, {"data": event.model_dump_json()})
+
+
+@common_router.get(path="/work/direct/", response_class=HTMLResponse)
+async def work_direct(
+ request: Request,
+ user: Annotated[User, Depends(get_authenticated_user)],
+):
+ """
+ View for direct work (not on AMT).
+ Makes sure user is authenticated.
+ """
+ # todo: emit event
+ return HTMLResponse(BASE_HTML)