use crate::{AppState, Now};
use axum::{Json, extract::State, http::StatusCode};
use fts_core::{
models::AuctionSolveRequest,
ports::{AuctionRepository, MarketRepository},
};
use tracing::{Level, event};
#[utoipa::path(
post,
path = "/admin/auctions/solve",
request_body = AuctionSolveRequest,
responses(
(status = ACCEPTED, description = "Auction(s) initiated"),
(status = BAD_REQUEST, description = "Invalid datetime range"),
(status = INTERNAL_SERVER_ERROR)
),
tags = ["admin"]
)]
pub async fn solve_auctions<T: MarketRepository>(
State(state): State<AppState<T>>,
Now(now): Now,
Json(auction): Json<AuctionSolveRequest>,
) -> StatusCode {
let inputs =
AuctionRepository::prepare(&state.market, auction.from, auction.thru, auction.by, now)
.await;
match inputs {
Ok(Some(auctions)) => {
for auction in auctions {
match state.solve_queue.send(auction).await {
Ok(_) => {}
Err(e) => {
event!(Level::ERROR, error = ?e);
return StatusCode::INTERNAL_SERVER_ERROR;
}
}
}
StatusCode::ACCEPTED
}
Ok(None) => StatusCode::BAD_REQUEST,
Err(e) => {
event!(Level::ERROR, error = ?e);
StatusCode::INTERNAL_SERVER_ERROR
}
}
}