Line data Source code
1 : use std::sync::Arc;
2 :
3 : use axum::extract::State;
4 : use axum::response::Response;
5 : use compute_api::requests::ExtensionInstallRequest;
6 : use compute_api::responses::{ComputeStatus, ExtensionInstallResponse};
7 : use http::StatusCode;
8 :
9 : use crate::compute::ComputeNode;
10 : use crate::http::JsonResponse;
11 : use crate::http::extract::Json;
12 :
13 : /// Install a extension.
14 0 : pub(in crate::http) async fn install_extension(
15 0 : State(compute): State<Arc<ComputeNode>>,
16 0 : request: Json<ExtensionInstallRequest>,
17 0 : ) -> Response {
18 0 : let status = compute.get_status();
19 0 : if status != ComputeStatus::Running {
20 0 : return JsonResponse::invalid_status(status);
21 0 : }
22 0 :
23 0 : match compute
24 0 : .install_extension(
25 0 : &request.extension,
26 0 : &request.database,
27 0 : request.version.to_string(),
28 0 : )
29 0 : .await
30 : {
31 0 : Ok(version) => JsonResponse::success(
32 0 : StatusCode::CREATED,
33 0 : Some(ExtensionInstallResponse {
34 0 : extension: request.extension.clone(),
35 0 : version,
36 0 : }),
37 0 : ),
38 0 : Err(e) => JsonResponse::error(
39 0 : StatusCode::INTERNAL_SERVER_ERROR,
40 0 : format!("failed to install extension: {e}"),
41 0 : ),
42 : }
43 0 : }
|