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