Make set role grants fn async

This commit is contained in:
Jere Vaara
2024-10-16 13:25:19 +03:00
parent d0ca79aeb3
commit b57f2c60f2
2 changed files with 19 additions and 14 deletions

View File

@@ -1369,32 +1369,35 @@ LIMIT 100",
download_size
}
pub fn set_role_grants(
pub async fn set_role_grants(
&self,
db_name: &str,
schema_name: &str,
privileges: &[Privilege],
role_name: &str,
) -> Result<()> {
use tokio_postgres::config::Config;
use tokio_postgres::NoTls;
let mut conf = Config::from_str(self.connstr.as_str()).unwrap();
conf.dbname(db_name);
let mut db_client = conf
let (db_client, conn) = conf
.connect(NoTls)
.await
.context("Failed to connect to the database")?;
tokio::spawn(conn);
// todo: pg_quote
let query = format!(
"GRANT {} ON SCHEMA {} TO {}",
privileges
.iter()
.map(|p| serde_json::to_string(p).unwrap())
.collect::<Vec<String>>()
.join(", "),
privileges.iter().map(|p| p.as_str()).join(", "),
schema_name,
role_name
);
db_client
.simple_query(&query)
.await
.context(format!("Failed to execute query: {}", query))?;
Ok(())

View File

@@ -182,14 +182,16 @@ async fn routes(req: Request<Body>, compute: &Arc<ComputeNode>) -> Response<Body
let request = hyper::body::to_bytes(req.into_body()).await.unwrap();
let request = serde_json::from_slice::<SetRoleGrantsRequest>(&request).unwrap();
let res = compute.set_role_grants(
&request.database,
&request.schema,
&request.privileges,
&request.role,
);
let res = compute
.set_role_grants(
&request.database,
&request.schema,
&request.privileges,
&request.role,
)
.await;
match res {
Ok(_) => render_json(Body::from(
Ok(()) => render_json(Body::from(
serde_json::to_string(&SetRoleGrantsResponse {
database: request.database,
schema: request.schema,