wowlab_sentinel/http/routes/
work_context.rs1use std::sync::Arc;
4
5use axum::{
6 Extension, Json, Router,
7 extract::{Path, Query, State},
8 routing::get,
9};
10use serde::Deserialize;
11use uuid::Uuid;
12use wowlab_common::node_http::NodeWorkContextResponse;
13
14use crate::{
15 http::{
16 api_error::ApiError,
17 auth::VerifiedNode,
18 services::work_context::{WorkContextInput, WorkContextLookup},
19 },
20 state::ServerState,
21};
22
23pub(super) fn router() -> Router<Arc<ServerState>> {
24 Router::new().route("/jobs/{job_id}/work_context", get(work_context))
25}
26
27#[derive(Debug, Deserialize)]
28struct ContextQuery {
29 hash: String,
30 claim_token: String,
31}
32
33async fn work_context(
34 State(state): State<Arc<ServerState>>,
35 Extension(node): Extension<VerifiedNode>,
36 Path(job_id): Path<Uuid>,
37 Query(query): Query<ContextQuery>,
38) -> Result<Json<NodeWorkContextResponse>, ApiError> {
39 let input = WorkContextInput::parse(job_id, &query.hash, query.claim_token, &node.public_key)?;
40 let response = WorkContextLookup::new(&state.runtime).fetch(input).await?;
41
42 Ok(Json(response))
43}