mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-12-03 02:25:10 +08:00
78ffa00f98
And make index_not_found error asynchronous, since we can't know whether the index will exist by the time the index swap task is processed. Improve the index-swap test to verify that future tasks are not swapped and to test the new error messages that were introduced.
49 lines
1.8 KiB
Rust
49 lines
1.8 KiB
Rust
use actix_web::web::Data;
|
|
use actix_web::{web, HttpResponse};
|
|
use index_scheduler::IndexScheduler;
|
|
use meilisearch_types::error::ResponseError;
|
|
use meilisearch_types::tasks::{IndexSwap, KindWithContent};
|
|
use serde::Deserialize;
|
|
|
|
use super::SummarizedTaskView;
|
|
use crate::error::MeilisearchHttpError;
|
|
use crate::extractors::authentication::policies::*;
|
|
use crate::extractors::authentication::{AuthenticationError, GuardedData};
|
|
use crate::extractors::sequential_extractor::SeqHandler;
|
|
|
|
pub fn configure(cfg: &mut web::ServiceConfig) {
|
|
cfg.service(web::resource("").route(web::post().to(SeqHandler(swap_indexes))));
|
|
}
|
|
#[derive(Deserialize, Debug, Clone, PartialEq, Eq)]
|
|
#[serde(rename_all = "camelCase", deny_unknown_fields)]
|
|
pub struct SwapIndexesPayload {
|
|
indexes: Vec<String>,
|
|
}
|
|
|
|
pub async fn swap_indexes(
|
|
index_scheduler: GuardedData<ActionPolicy<{ actions::INDEXES_SWAP }>, Data<IndexScheduler>>,
|
|
params: web::Json<Vec<SwapIndexesPayload>>,
|
|
) -> Result<HttpResponse, ResponseError> {
|
|
let search_rules = &index_scheduler.filters().search_rules;
|
|
|
|
let mut swaps = vec![];
|
|
for SwapIndexesPayload { indexes } in params.into_inner().into_iter() {
|
|
let (lhs, rhs) = match indexes.as_slice() {
|
|
[lhs, rhs] => (lhs, rhs),
|
|
_ => {
|
|
return Err(MeilisearchHttpError::SwapIndexPayloadWrongLength(indexes).into());
|
|
}
|
|
};
|
|
if !search_rules.is_index_authorized(lhs) || !search_rules.is_index_authorized(rhs) {
|
|
return Err(AuthenticationError::InvalidToken.into());
|
|
}
|
|
swaps.push(IndexSwap { indexes: (lhs.clone(), rhs.clone()) });
|
|
}
|
|
|
|
let task = KindWithContent::IndexSwap { swaps };
|
|
|
|
let task = index_scheduler.register(task)?;
|
|
let task: SummarizedTaskView = task.into();
|
|
Ok(HttpResponse::Accepted().json(task))
|
|
}
|