send the creation of api-key to zookeeper

This commit is contained in:
Tamo 2023-08-02 13:57:30 +02:00
parent 97e3dfd99d
commit 84d56f3320
5 changed files with 24 additions and 9 deletions

1
Cargo.lock generated
View File

@ -2689,6 +2689,7 @@ dependencies = [
"sha2", "sha2",
"thiserror", "thiserror",
"time", "time",
"tokio",
"uuid 1.3.3", "uuid 1.3.3",
"zookeeper-client", "zookeeper-client",
] ]

View File

@ -23,5 +23,6 @@ serde_json = { version = "1.0.95", features = ["preserve_order"] }
sha2 = "0.10.6" sha2 = "0.10.6"
thiserror = "1.0.40" thiserror = "1.0.40"
time = { version = "0.3.20", features = ["serde-well-known", "formatting", "parsing", "macros"] } time = { version = "0.3.20", features = ["serde-well-known", "formatting", "parsing", "macros"] }
tokio = { version = "1.27.0", features = ["full"] }
uuid = { version = "1.3.1", features = ["serde", "v4"] } uuid = { version = "1.3.1", features = ["serde", "v4"] }
zookeeper-client = "0.4.0" zookeeper-client = "0.4.0"

View File

@ -2,6 +2,7 @@ use std::error::Error;
use meilisearch_types::error::{Code, ErrorCode}; use meilisearch_types::error::{Code, ErrorCode};
use meilisearch_types::internal_error; use meilisearch_types::internal_error;
use zookeeper_client as zk;
pub type Result<T> = std::result::Result<T, AuthControllerError>; pub type Result<T> = std::result::Result<T, AuthControllerError>;
@ -19,6 +20,8 @@ internal_error!(
AuthControllerError: meilisearch_types::milli::heed::Error, AuthControllerError: meilisearch_types::milli::heed::Error,
std::io::Error, std::io::Error,
serde_json::Error, serde_json::Error,
tokio::task::JoinError,
zk::Error,
std::str::Utf8Error std::str::Utf8Error
); );

View File

@ -56,10 +56,24 @@ impl AuthController {
self.store.used_size() self.store.used_size()
} }
pub fn create_key(&self, create_key: CreateApiKey) -> Result<Key> { pub async fn create_key(&self, create_key: CreateApiKey) -> Result<Key> {
match self.store.get_api_key(create_key.uid)? { match self.store.get_api_key(create_key.uid)? {
Some(_) => Err(AuthControllerError::ApiKeyAlreadyExists(create_key.uid.to_string())), Some(_) => Err(AuthControllerError::ApiKeyAlreadyExists(create_key.uid.to_string())),
None => self.store.put_api_key(create_key.to_key()), None => {
let store = self.store.clone();
let key =
tokio::task::spawn_blocking(move || store.put_api_key(create_key.to_key()))
.await??;
if let Some(ref zk) = self.zk {
zk.create(
&format!("/auth/{}", key.uid),
&serde_json::to_vec_pretty(&key)?,
&zk::CreateOptions::new(zk::CreateMode::Persistent, zk::Acl::anyone_all()),
)
.await?;
}
Ok(key)
}
} }
} }

View File

@ -41,14 +41,10 @@ pub async fn create_api_key(
_req: HttpRequest, _req: HttpRequest,
) -> Result<HttpResponse, ResponseError> { ) -> Result<HttpResponse, ResponseError> {
let v = body.into_inner(); let v = body.into_inner();
let res = tokio::task::spawn_blocking(move || -> Result<_, AuthControllerError> { let key = auth_controller.create_key(v).await?;
let key = auth_controller.create_key(v)?; let key = KeyView::from_key(key, &auth_controller);
Ok(KeyView::from_key(key, &auth_controller))
})
.await
.map_err(|e| ResponseError::from_msg(e.to_string(), Code::Internal))??;
Ok(HttpResponse::Created().json(res)) Ok(HttpResponse::Created().json(key))
} }
#[derive(Deserr, Debug, Clone, Copy)] #[derive(Deserr, Debug, Clone, Copy)]