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::SetRoleGrantsRequest;
6 : use compute_api::responses::{ComputeStatus, SetRoleGrantsResponse};
7 : use http::StatusCode;
8 :
9 : use crate::compute::ComputeNode;
10 : use crate::http::JsonResponse;
11 : use crate::http::extract::Json;
12 :
13 : /// Add grants for a role.
14 0 : pub(in crate::http) async fn add_grant(
15 0 : State(compute): State<Arc<ComputeNode>>,
16 0 : request: Json<SetRoleGrantsRequest>,
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 : .set_role_grants(
25 0 : &request.database,
26 0 : &request.schema,
27 0 : &request.privileges,
28 0 : &request.role,
29 0 : )
30 0 : .await
31 : {
32 0 : Ok(()) => JsonResponse::success(
33 0 : StatusCode::CREATED,
34 0 : Some(SetRoleGrantsResponse {
35 0 : database: request.database.clone(),
36 0 : schema: request.schema.clone(),
37 0 : role: request.role.clone(),
38 0 : privileges: request.privileges.clone(),
39 0 : }),
40 0 : ),
41 0 : Err(e) => JsonResponse::error(
42 0 : StatusCode::INTERNAL_SERVER_ERROR,
43 0 : format!("failed to grant role privileges to the schema: {e}"),
44 0 : ),
45 : }
46 0 : }
|