2020-04-22 17:43:51 +02:00
|
|
|
use actix_web::{web, HttpResponse};
|
2020-09-12 04:29:17 +02:00
|
|
|
use actix_web::{delete, get, post, put};
|
2019-11-19 17:39:30 +01:00
|
|
|
use chrono::{DateTime, Utc};
|
2019-11-20 17:28:46 +01:00
|
|
|
use log::error;
|
2019-11-19 16:07:24 +01:00
|
|
|
use rand::seq::SliceRandom;
|
|
|
|
use serde::{Deserialize, Serialize};
|
2019-10-31 15:00:36 +01:00
|
|
|
|
2020-05-22 12:03:57 +02:00
|
|
|
use crate::error::{Error, ResponseError};
|
2020-04-22 17:43:51 +02:00
|
|
|
use crate::helpers::Authentication;
|
2020-04-09 11:11:48 +02:00
|
|
|
use crate::routes::IndexParam;
|
2020-04-10 19:05:05 +02:00
|
|
|
use crate::Data;
|
2019-10-31 15:00:36 +01:00
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
pub fn services(cfg: &mut web::ServiceConfig) {
|
|
|
|
cfg.service(list_indexes)
|
|
|
|
.service(get_index)
|
|
|
|
.service(create_index)
|
|
|
|
.service(update_index)
|
|
|
|
.service(delete_index)
|
|
|
|
.service(get_update_status)
|
|
|
|
.service(get_all_updates_status);
|
|
|
|
}
|
|
|
|
|
2019-11-19 16:07:24 +01:00
|
|
|
fn generate_uid() -> String {
|
|
|
|
let mut rng = rand::thread_rng();
|
2019-11-19 17:42:47 +01:00
|
|
|
let sample = b"abcdefghijklmnopqrstuvwxyz0123456789";
|
2019-11-19 16:07:24 +01:00
|
|
|
sample
|
|
|
|
.choose_multiple(&mut rng, 8)
|
|
|
|
.map(|c| *c as char)
|
|
|
|
.collect()
|
|
|
|
}
|
|
|
|
|
2020-04-08 14:13:45 +02:00
|
|
|
#[derive(Debug, Serialize)]
|
|
|
|
#[serde(rename_all = "camelCase")]
|
2020-04-22 17:43:51 +02:00
|
|
|
struct IndexResponse {
|
2020-04-08 14:13:45 +02:00
|
|
|
name: String,
|
|
|
|
uid: String,
|
|
|
|
created_at: DateTime<Utc>,
|
|
|
|
updated_at: DateTime<Utc>,
|
|
|
|
primary_key: Option<String>,
|
|
|
|
}
|
2019-11-20 11:24:08 +01:00
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
#[get("/indexes", wrap = "Authentication::Private")]
|
2020-05-22 12:03:57 +02:00
|
|
|
async fn list_indexes(data: web::Data<Data>) -> Result<HttpResponse, ResponseError> {
|
2020-04-17 14:52:13 +02:00
|
|
|
let reader = data.db.main_read_txn()?;
|
2020-05-22 12:03:57 +02:00
|
|
|
let mut indexes = Vec::new();
|
2019-11-20 09:57:27 +01:00
|
|
|
|
2020-04-08 14:13:45 +02:00
|
|
|
for index_uid in data.db.indexes_uids() {
|
|
|
|
let index = data.db.open_index(&index_uid);
|
2019-11-20 17:28:46 +01:00
|
|
|
|
|
|
|
match index {
|
|
|
|
Some(index) => {
|
2020-05-19 18:20:29 +02:00
|
|
|
let name = index.main.name(&reader)?.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the name of an index",
|
2020-04-17 14:52:13 +02:00
|
|
|
))?;
|
2020-04-10 19:05:05 +02:00
|
|
|
let created_at = index
|
|
|
|
.main
|
2020-04-17 14:52:13 +02:00
|
|
|
.created_at(&reader)?
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the create date of an index",
|
2020-04-10 19:05:05 +02:00
|
|
|
))?;
|
|
|
|
let updated_at = index
|
|
|
|
.main
|
2020-04-17 14:52:13 +02:00
|
|
|
.updated_at(&reader)?
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the last update date of an index",
|
2020-04-10 19:05:05 +02:00
|
|
|
))?;
|
2019-11-20 17:28:46 +01:00
|
|
|
|
2020-03-09 18:40:49 +01:00
|
|
|
let primary_key = match index.main.schema(&reader) {
|
|
|
|
Ok(Some(schema)) => match schema.primary_key() {
|
|
|
|
Some(primary_key) => Some(primary_key.to_owned()),
|
2020-03-10 11:29:56 +01:00
|
|
|
None => None,
|
2020-03-05 18:29:10 +01:00
|
|
|
},
|
2020-02-26 18:49:17 +01:00
|
|
|
_ => None,
|
2020-02-12 17:00:14 +01:00
|
|
|
};
|
|
|
|
|
2019-12-19 10:32:17 +01:00
|
|
|
let index_response = IndexResponse {
|
2019-11-20 17:28:46 +01:00
|
|
|
name,
|
|
|
|
uid: index_uid,
|
|
|
|
created_at,
|
|
|
|
updated_at,
|
2020-03-09 18:40:49 +01:00
|
|
|
primary_key,
|
2019-11-20 17:28:46 +01:00
|
|
|
};
|
2020-05-22 12:03:57 +02:00
|
|
|
indexes.push(index_response);
|
2019-11-20 17:28:46 +01:00
|
|
|
}
|
|
|
|
None => error!(
|
|
|
|
"Index {} is referenced in the indexes list but cannot be found",
|
|
|
|
index_uid
|
|
|
|
),
|
|
|
|
}
|
2019-11-20 09:57:27 +01:00
|
|
|
}
|
|
|
|
|
2020-05-22 12:03:57 +02:00
|
|
|
Ok(HttpResponse::Ok().json(indexes))
|
2019-11-19 17:38:02 +01:00
|
|
|
}
|
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
#[get("/indexes/{index_uid}", wrap = "Authentication::Private")]
|
|
|
|
async fn get_index(
|
2020-04-08 14:13:45 +02:00
|
|
|
data: web::Data<Data>,
|
2020-04-09 11:11:48 +02:00
|
|
|
path: web::Path<IndexParam>,
|
2020-05-22 12:03:57 +02:00
|
|
|
) -> Result<HttpResponse, ResponseError> {
|
2020-04-10 19:05:05 +02:00
|
|
|
let index = data
|
|
|
|
.db
|
2020-04-17 14:52:13 +02:00
|
|
|
.open_index(&path.index_uid)
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::index_not_found(&path.index_uid))?;
|
2019-11-19 17:38:02 +01:00
|
|
|
|
2020-04-17 14:52:13 +02:00
|
|
|
let reader = data.db.main_read_txn()?;
|
2020-05-19 18:20:29 +02:00
|
|
|
let name = index.main.name(&reader)?.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the name of an index",
|
2020-04-17 14:52:13 +02:00
|
|
|
))?;
|
2020-04-10 19:05:05 +02:00
|
|
|
let created_at = index
|
|
|
|
.main
|
2020-04-17 14:52:13 +02:00
|
|
|
.created_at(&reader)?
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the create date of an index",
|
2020-04-10 19:05:05 +02:00
|
|
|
))?;
|
|
|
|
let updated_at = index
|
|
|
|
.main
|
2020-04-17 14:52:13 +02:00
|
|
|
.updated_at(&reader)?
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the last update date of an index",
|
2020-04-10 19:05:05 +02:00
|
|
|
))?;
|
2019-11-19 17:38:02 +01:00
|
|
|
|
2020-03-09 18:40:49 +01:00
|
|
|
let primary_key = match index.main.schema(&reader) {
|
|
|
|
Ok(Some(schema)) => match schema.primary_key() {
|
|
|
|
Some(primary_key) => Some(primary_key.to_owned()),
|
2020-03-10 11:29:56 +01:00
|
|
|
None => None,
|
2020-03-05 18:29:10 +01:00
|
|
|
},
|
2020-02-26 18:49:17 +01:00
|
|
|
_ => None,
|
2020-02-12 17:00:14 +01:00
|
|
|
};
|
2020-05-22 12:03:57 +02:00
|
|
|
let index_response = IndexResponse {
|
2019-11-19 17:38:02 +01:00
|
|
|
name,
|
2020-04-09 11:11:48 +02:00
|
|
|
uid: path.index_uid.clone(),
|
2019-11-19 17:38:02 +01:00
|
|
|
created_at,
|
|
|
|
updated_at,
|
2020-03-09 18:40:49 +01:00
|
|
|
primary_key,
|
2020-05-22 12:03:57 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
Ok(HttpResponse::Ok().json(index_response))
|
2019-11-19 17:38:02 +01:00
|
|
|
}
|
|
|
|
|
2019-11-20 17:28:46 +01:00
|
|
|
#[derive(Debug, Deserialize)]
|
2019-11-19 16:07:24 +01:00
|
|
|
#[serde(rename_all = "camelCase", deny_unknown_fields)]
|
2020-04-22 17:43:51 +02:00
|
|
|
struct IndexCreateRequest {
|
2020-01-15 17:11:10 +01:00
|
|
|
name: Option<String>,
|
2019-11-22 11:18:46 +01:00
|
|
|
uid: Option<String>,
|
2020-03-09 18:40:49 +01:00
|
|
|
primary_key: Option<String>,
|
2019-11-19 16:07:24 +01:00
|
|
|
}
|
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
#[post("/indexes", wrap = "Authentication::Private")]
|
|
|
|
async fn create_index(
|
2020-04-08 14:13:45 +02:00
|
|
|
data: web::Data<Data>,
|
2020-04-10 19:05:05 +02:00
|
|
|
body: web::Json<IndexCreateRequest>,
|
2020-05-22 12:03:57 +02:00
|
|
|
) -> Result<HttpResponse, ResponseError> {
|
2020-01-15 17:11:10 +01:00
|
|
|
if let (None, None) = (body.name.clone(), body.uid.clone()) {
|
2020-05-19 18:20:29 +02:00
|
|
|
return Err(Error::bad_request(
|
2020-04-17 14:52:13 +02:00
|
|
|
"Index creation must have an uid",
|
2020-05-22 12:03:57 +02:00
|
|
|
).into());
|
2020-01-15 17:11:10 +01:00
|
|
|
}
|
|
|
|
|
2020-04-24 15:00:52 +02:00
|
|
|
let uid = match &body.uid {
|
2020-03-05 11:44:30 +01:00
|
|
|
Some(uid) => {
|
2020-03-10 11:29:56 +01:00
|
|
|
if uid
|
|
|
|
.chars()
|
|
|
|
.all(|x| x.is_ascii_alphanumeric() || x == '-' || x == '_')
|
|
|
|
{
|
2020-04-24 15:00:52 +02:00
|
|
|
uid.to_owned()
|
2020-03-05 11:44:30 +01:00
|
|
|
} else {
|
2020-05-22 12:03:57 +02:00
|
|
|
return Err(Error::InvalidIndexUid.into());
|
2020-03-05 11:44:30 +01:00
|
|
|
}
|
2020-03-10 11:29:56 +01:00
|
|
|
}
|
2019-11-22 11:18:46 +01:00
|
|
|
None => loop {
|
|
|
|
let uid = generate_uid();
|
2020-04-08 14:13:45 +02:00
|
|
|
if data.db.open_index(&uid).is_none() {
|
2019-11-22 11:18:46 +01:00
|
|
|
break uid;
|
|
|
|
}
|
|
|
|
},
|
2019-11-22 11:08:29 +01:00
|
|
|
};
|
|
|
|
|
2020-04-10 19:05:05 +02:00
|
|
|
let created_index = data
|
|
|
|
.db
|
|
|
|
.create_index(&uid)
|
2020-05-29 16:25:39 +02:00
|
|
|
.map_err(|e| match e {
|
|
|
|
meilisearch_core::Error::IndexAlreadyExists => e.into(),
|
|
|
|
_ => ResponseError::from(Error::create_index(e))
|
|
|
|
})?;
|
2020-04-08 14:13:45 +02:00
|
|
|
|
2020-05-22 12:03:57 +02:00
|
|
|
let index_response = data.db.main_write::<_, _, ResponseError>(|mut writer| {
|
|
|
|
let name = body.name.as_ref().unwrap_or(&uid);
|
|
|
|
created_index.main.put_name(&mut writer, name)?;
|
|
|
|
|
|
|
|
let created_at = created_index
|
|
|
|
.main
|
|
|
|
.created_at(&writer)?
|
|
|
|
.ok_or(Error::internal("Impossible to read created at"))?;
|
|
|
|
|
|
|
|
let updated_at = created_index
|
|
|
|
.main
|
|
|
|
.updated_at(&writer)?
|
|
|
|
.ok_or(Error::internal("Impossible to read updated at"))?;
|
|
|
|
|
|
|
|
if let Some(id) = body.primary_key.clone() {
|
|
|
|
if let Some(mut schema) = created_index.main.schema(&writer)? {
|
|
|
|
schema
|
|
|
|
.set_primary_key(&id)
|
|
|
|
.map_err(Error::bad_request)?;
|
|
|
|
created_index.main.put_schema(&mut writer, &schema)?;
|
|
|
|
}
|
2020-03-05 18:29:10 +01:00
|
|
|
}
|
2020-05-22 12:03:57 +02:00
|
|
|
let index_response = IndexResponse {
|
|
|
|
name: name.to_string(),
|
|
|
|
uid,
|
|
|
|
created_at,
|
|
|
|
updated_at,
|
|
|
|
primary_key: body.primary_key.clone(),
|
|
|
|
};
|
|
|
|
Ok(index_response)
|
|
|
|
})?;
|
|
|
|
|
|
|
|
Ok(HttpResponse::Created().json(index_response))
|
2019-10-31 15:00:36 +01:00
|
|
|
}
|
|
|
|
|
2019-11-20 17:28:46 +01:00
|
|
|
#[derive(Debug, Deserialize)]
|
2019-11-20 15:00:06 +01:00
|
|
|
#[serde(rename_all = "camelCase", deny_unknown_fields)]
|
2020-04-22 17:43:51 +02:00
|
|
|
struct UpdateIndexRequest {
|
2020-02-12 17:00:14 +01:00
|
|
|
name: Option<String>,
|
2020-03-09 18:40:49 +01:00
|
|
|
primary_key: Option<String>,
|
2019-11-20 15:00:06 +01:00
|
|
|
}
|
|
|
|
|
2019-11-20 17:28:46 +01:00
|
|
|
#[derive(Debug, Serialize)]
|
|
|
|
#[serde(rename_all = "camelCase")]
|
2020-04-22 17:43:51 +02:00
|
|
|
struct UpdateIndexResponse {
|
2019-11-20 15:00:06 +01:00
|
|
|
name: String,
|
|
|
|
uid: String,
|
|
|
|
created_at: DateTime<Utc>,
|
|
|
|
updated_at: DateTime<Utc>,
|
2020-03-09 18:40:49 +01:00
|
|
|
primary_key: Option<String>,
|
2019-11-20 15:00:06 +01:00
|
|
|
}
|
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
#[put("/indexes/{index_uid}", wrap = "Authentication::Private")]
|
|
|
|
async fn update_index(
|
2020-04-08 14:13:45 +02:00
|
|
|
data: web::Data<Data>,
|
2020-04-09 11:11:48 +02:00
|
|
|
path: web::Path<IndexParam>,
|
2020-04-10 19:05:05 +02:00
|
|
|
body: web::Json<IndexCreateRequest>,
|
2020-05-22 12:03:57 +02:00
|
|
|
) -> Result<HttpResponse, ResponseError> {
|
2020-04-10 19:05:05 +02:00
|
|
|
let index = data
|
|
|
|
.db
|
2020-04-17 14:52:13 +02:00
|
|
|
.open_index(&path.index_uid)
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::index_not_found(&path.index_uid))?;
|
2019-11-20 15:00:06 +01:00
|
|
|
|
2020-05-28 16:12:24 +02:00
|
|
|
data.db.main_write::<_, _, ResponseError>(|writer| {
|
2020-05-22 12:03:57 +02:00
|
|
|
if let Some(name) = &body.name {
|
2020-05-28 16:12:24 +02:00
|
|
|
index.main.put_name(writer, name)?;
|
2020-05-22 12:03:57 +02:00
|
|
|
}
|
2020-01-16 16:58:57 +01:00
|
|
|
|
2020-05-22 12:03:57 +02:00
|
|
|
if let Some(id) = body.primary_key.clone() {
|
2020-05-28 16:12:24 +02:00
|
|
|
if let Some(mut schema) = index.main.schema(writer)? {
|
2020-06-22 15:16:18 +02:00
|
|
|
schema.set_primary_key(&id)?;
|
|
|
|
index.main.put_schema(writer, &schema)?;
|
2020-03-05 18:29:10 +01:00
|
|
|
}
|
2020-02-12 17:00:14 +01:00
|
|
|
}
|
2020-05-28 16:12:24 +02:00
|
|
|
index.main.put_updated_at(writer)?;
|
2020-05-22 12:03:57 +02:00
|
|
|
Ok(())
|
|
|
|
})?;
|
2020-01-16 16:58:57 +01:00
|
|
|
|
2020-04-17 14:52:13 +02:00
|
|
|
let reader = data.db.main_read_txn()?;
|
2020-05-19 18:20:29 +02:00
|
|
|
let name = index.main.name(&reader)?.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the name of an index",
|
2020-04-17 14:52:13 +02:00
|
|
|
))?;
|
2020-04-10 19:05:05 +02:00
|
|
|
let created_at = index
|
|
|
|
.main
|
2020-04-17 14:52:13 +02:00
|
|
|
.created_at(&reader)?
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the create date of an index",
|
2020-04-10 19:05:05 +02:00
|
|
|
))?;
|
|
|
|
let updated_at = index
|
|
|
|
.main
|
2020-04-17 14:52:13 +02:00
|
|
|
.updated_at(&reader)?
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::internal(
|
2020-05-22 12:03:57 +02:00
|
|
|
"Impossible to get the last update date of an index",
|
2020-04-10 19:05:05 +02:00
|
|
|
))?;
|
2019-11-20 15:00:06 +01:00
|
|
|
|
2020-03-09 18:40:49 +01:00
|
|
|
let primary_key = match index.main.schema(&reader) {
|
2020-03-10 11:29:56 +01:00
|
|
|
Ok(Some(schema)) => match schema.primary_key() {
|
|
|
|
Some(primary_key) => Some(primary_key.to_owned()),
|
|
|
|
None => None,
|
2020-03-05 18:29:10 +01:00
|
|
|
},
|
2020-02-26 18:49:17 +01:00
|
|
|
_ => None,
|
2020-02-12 17:00:14 +01:00
|
|
|
};
|
|
|
|
|
2020-05-22 12:03:57 +02:00
|
|
|
let index_response = IndexResponse {
|
2020-02-12 17:00:14 +01:00
|
|
|
name,
|
2020-04-09 11:11:48 +02:00
|
|
|
uid: path.index_uid.clone(),
|
2019-11-20 15:00:06 +01:00
|
|
|
created_at,
|
|
|
|
updated_at,
|
2020-03-09 18:40:49 +01:00
|
|
|
primary_key,
|
2020-05-22 12:03:57 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
Ok(HttpResponse::Ok().json(index_response))
|
2019-11-20 15:00:06 +01:00
|
|
|
}
|
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
#[delete("/indexes/{index_uid}", wrap = "Authentication::Private")]
|
|
|
|
async fn delete_index(
|
2020-04-08 14:13:45 +02:00
|
|
|
data: web::Data<Data>,
|
2020-04-09 11:11:48 +02:00
|
|
|
path: web::Path<IndexParam>,
|
2020-05-22 12:03:57 +02:00
|
|
|
) -> Result<HttpResponse, ResponseError> {
|
2020-06-05 11:33:59 +02:00
|
|
|
if data.db.delete_index(&path.index_uid)? {
|
|
|
|
Ok(HttpResponse::NoContent().finish())
|
|
|
|
} else {
|
|
|
|
Err(Error::index_not_found(&path.index_uid).into())
|
|
|
|
}
|
2019-10-31 15:00:36 +01:00
|
|
|
}
|
2020-04-09 10:39:34 +02:00
|
|
|
|
2020-04-24 15:00:52 +02:00
|
|
|
#[derive(Deserialize)]
|
2020-04-22 17:43:51 +02:00
|
|
|
struct UpdateParam {
|
2020-04-09 11:11:48 +02:00
|
|
|
index_uid: String,
|
2020-04-10 19:05:05 +02:00
|
|
|
update_id: u64,
|
2020-04-09 11:11:48 +02:00
|
|
|
}
|
2020-04-09 10:39:34 +02:00
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
#[get(
|
|
|
|
"/indexes/{index_uid}/updates/{update_id}",
|
|
|
|
wrap = "Authentication::Private"
|
|
|
|
)]
|
|
|
|
async fn get_update_status(
|
2020-04-09 10:39:34 +02:00
|
|
|
data: web::Data<Data>,
|
2020-04-09 11:11:48 +02:00
|
|
|
path: web::Path<UpdateParam>,
|
2020-05-22 12:03:57 +02:00
|
|
|
) -> Result<HttpResponse, ResponseError> {
|
2020-04-10 19:05:05 +02:00
|
|
|
let index = data
|
|
|
|
.db
|
2020-04-17 14:52:13 +02:00
|
|
|
.open_index(&path.index_uid)
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::index_not_found(&path.index_uid))?;
|
2020-04-09 10:39:34 +02:00
|
|
|
|
2020-04-17 14:52:13 +02:00
|
|
|
let reader = data.db.update_read_txn()?;
|
2020-04-09 10:39:34 +02:00
|
|
|
|
2020-04-17 14:52:13 +02:00
|
|
|
let status = index.update_status(&reader, path.update_id)?;
|
2020-04-09 10:39:34 +02:00
|
|
|
|
|
|
|
match status {
|
2020-04-16 11:09:47 +02:00
|
|
|
Some(status) => Ok(HttpResponse::Ok().json(status)),
|
2020-05-19 18:20:29 +02:00
|
|
|
None => Err(Error::NotFound(format!(
|
2020-06-06 09:04:17 +02:00
|
|
|
"Update {}",
|
2020-04-17 14:52:13 +02:00
|
|
|
path.update_id
|
2020-05-22 12:03:57 +02:00
|
|
|
)).into()),
|
2020-04-09 10:39:34 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-04-22 17:43:51 +02:00
|
|
|
#[get("/indexes/{index_uid}/updates", wrap = "Authentication::Private")]
|
|
|
|
async fn get_all_updates_status(
|
2020-04-09 10:39:34 +02:00
|
|
|
data: web::Data<Data>,
|
2020-04-09 11:11:48 +02:00
|
|
|
path: web::Path<IndexParam>,
|
2020-05-22 12:03:57 +02:00
|
|
|
) -> Result<HttpResponse, ResponseError> {
|
2020-04-10 19:05:05 +02:00
|
|
|
let index = data
|
|
|
|
.db
|
2020-04-17 14:52:13 +02:00
|
|
|
.open_index(&path.index_uid)
|
2020-05-19 18:20:29 +02:00
|
|
|
.ok_or(Error::index_not_found(&path.index_uid))?;
|
2020-04-09 10:39:34 +02:00
|
|
|
|
2020-04-17 14:52:13 +02:00
|
|
|
let reader = data.db.update_read_txn()?;
|
2020-04-09 10:39:34 +02:00
|
|
|
|
2020-04-17 14:52:13 +02:00
|
|
|
let response = index.all_updates_status(&reader)?;
|
2020-04-09 10:39:34 +02:00
|
|
|
|
2020-04-16 11:09:47 +02:00
|
|
|
Ok(HttpResponse::Ok().json(response))
|
2020-04-09 10:39:34 +02:00
|
|
|
}
|