Skip to main content

wowlab_sentinel/http/routes/
work_context.rs

1//! Signed work-context HTTP route.
2
3use 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}