use axum::body::Body;
use axum::extract::{Path, State};
use axum::http::{Response, StatusCode};
use axum::response::{IntoResponse, Redirect};
use axum::Extension;
use super::super::auth;
use super::super::provision_store as store;
use super::ConsoleState;
pub(super) async fn migrate_all(
State(state): State<ConsoleState>,
Extension(op): Extension<auth::Operator>,
) -> Response<Body> {
start(&state, &op, None).await
}
pub(super) async fn migrate_one(
State(state): State<ConsoleState>,
Extension(op): Extension<auth::Operator>,
Path(slug): Path<String>,
) -> Response<Body> {
start(&state, &op, Some(slug)).await
}
async fn start(state: &ConsoleState, op: &auth::Operator, slug: Option<String>) -> Response<Body> {
let Some(provisioner) = state.provisioner.clone() else {
return (
StatusCode::NOT_FOUND,
"this console cannot run migrations".to_owned(),
)
.into_response();
};
let run =
match store::open_migrate_run(&state.registry, slug.as_deref(), Some(&op.username)).await {
Ok(r) => r,
Err(e) => {
return (
StatusCode::INTERNAL_SERVER_ERROR,
format!("could not open a run: {e}"),
)
.into_response();
}
};
let run_id = run.id.get().copied().unwrap_or_default();
tokio::spawn(async move {
let _ = provisioner.migrate_in_run(run_id, slug.as_deref()).await;
});
Redirect::to(&format!("/orgs/provision/{run_id}")).into_response()
}