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