mirror of
https://github.com/meilisearch/MeiliSearch
synced 2024-11-26 14:54:27 +01:00
New route to set some experimental features
This commit is contained in:
parent
dac77dfd14
commit
eef9293630
102
meilisearch/src/routes/features.rs
Normal file
102
meilisearch/src/routes/features.rs
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
use actix_web::web::{self, Data};
|
||||||
|
use actix_web::{HttpRequest, HttpResponse};
|
||||||
|
use deserr::actix_web::AwebJson;
|
||||||
|
use deserr::Deserr;
|
||||||
|
use index_scheduler::IndexScheduler;
|
||||||
|
use log::debug;
|
||||||
|
use meilisearch_types::deserr::DeserrJsonError;
|
||||||
|
use meilisearch_types::error::ResponseError;
|
||||||
|
use meilisearch_types::keys::actions;
|
||||||
|
use serde_json::json;
|
||||||
|
|
||||||
|
use crate::analytics::Analytics;
|
||||||
|
use crate::extractors::authentication::policies::ActionPolicy;
|
||||||
|
use crate::extractors::authentication::GuardedData;
|
||||||
|
use crate::extractors::sequential_extractor::SeqHandler;
|
||||||
|
|
||||||
|
pub fn configure(cfg: &mut web::ServiceConfig) {
|
||||||
|
cfg.service(
|
||||||
|
web::resource("")
|
||||||
|
.route(web::get().to(SeqHandler(get_features)))
|
||||||
|
.route(web::patch().to(SeqHandler(patch_features)))
|
||||||
|
.route(web::delete().to(SeqHandler(delete_features)))
|
||||||
|
.route(web::post().to(SeqHandler(post_features))),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn get_features(
|
||||||
|
index_scheduler: GuardedData<
|
||||||
|
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_GET }>,
|
||||||
|
Data<IndexScheduler>,
|
||||||
|
>,
|
||||||
|
req: HttpRequest,
|
||||||
|
analytics: Data<dyn Analytics>,
|
||||||
|
) -> Result<HttpResponse, ResponseError> {
|
||||||
|
let features = index_scheduler.features()?;
|
||||||
|
|
||||||
|
analytics.publish("Experimental features Seen".to_string(), json!(null), Some(&req));
|
||||||
|
debug!("returns: {:?}", features.runtime_features());
|
||||||
|
Ok(HttpResponse::Ok().json(features.runtime_features()))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, Deserr)]
|
||||||
|
#[deserr(error = DeserrJsonError, rename_all = camelCase, deny_unknown_fields)]
|
||||||
|
pub struct RuntimeTogglableFeatures {
|
||||||
|
#[deserr(default)]
|
||||||
|
pub score_details: Option<bool>,
|
||||||
|
#[deserr(default)]
|
||||||
|
pub vector_store: Option<bool>,
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn patch_features(
|
||||||
|
index_scheduler: GuardedData<
|
||||||
|
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_UPDATE }>,
|
||||||
|
Data<IndexScheduler>,
|
||||||
|
>,
|
||||||
|
new_features: AwebJson<RuntimeTogglableFeatures, DeserrJsonError>,
|
||||||
|
analytics: Data<dyn Analytics>,
|
||||||
|
) -> Result<HttpResponse, ResponseError> {
|
||||||
|
let features = index_scheduler.features()?;
|
||||||
|
|
||||||
|
let old_features = features.runtime_features();
|
||||||
|
|
||||||
|
let new_features = meilisearch_types::features::RuntimeTogglableFeatures {
|
||||||
|
score_details: new_features.0.score_details.unwrap_or(old_features.score_details),
|
||||||
|
vector_store: new_features.0.vector_store.unwrap_or(old_features.vector_store),
|
||||||
|
};
|
||||||
|
|
||||||
|
analytics.publish("Experimental features PATCH".to_string(), json!(new_features), None);
|
||||||
|
index_scheduler.put_runtime_features(new_features)?;
|
||||||
|
Ok(HttpResponse::Ok().json(new_features))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn post_features(
|
||||||
|
index_scheduler: GuardedData<
|
||||||
|
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_UPDATE }>,
|
||||||
|
Data<IndexScheduler>,
|
||||||
|
>,
|
||||||
|
new_features: AwebJson<RuntimeTogglableFeatures, DeserrJsonError>,
|
||||||
|
analytics: Data<dyn Analytics>,
|
||||||
|
) -> Result<HttpResponse, ResponseError> {
|
||||||
|
let new_features = meilisearch_types::features::RuntimeTogglableFeatures {
|
||||||
|
score_details: new_features.0.score_details.unwrap_or(false),
|
||||||
|
vector_store: new_features.0.vector_store.unwrap_or(false),
|
||||||
|
};
|
||||||
|
|
||||||
|
analytics.publish("Experimental features POST".to_string(), json!(new_features), None);
|
||||||
|
index_scheduler.put_runtime_features(new_features)?;
|
||||||
|
Ok(HttpResponse::Ok().json(new_features))
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn delete_features(
|
||||||
|
index_scheduler: GuardedData<
|
||||||
|
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_UPDATE }>,
|
||||||
|
Data<IndexScheduler>,
|
||||||
|
>,
|
||||||
|
analytics: Data<dyn Analytics>,
|
||||||
|
) -> Result<HttpResponse, ResponseError> {
|
||||||
|
let deleted_features = Default::default();
|
||||||
|
analytics.publish("Experimental features DELETE".to_string(), json!(null), None);
|
||||||
|
index_scheduler.put_runtime_features(deleted_features)?;
|
||||||
|
Ok(HttpResponse::Ok().json(deleted_features))
|
||||||
|
}
|
@ -20,6 +20,7 @@ const PAGINATION_DEFAULT_LIMIT: usize = 20;
|
|||||||
|
|
||||||
mod api_key;
|
mod api_key;
|
||||||
mod dump;
|
mod dump;
|
||||||
|
pub mod features;
|
||||||
pub mod indexes;
|
pub mod indexes;
|
||||||
mod metrics;
|
mod metrics;
|
||||||
mod multi_search;
|
mod multi_search;
|
||||||
@ -35,7 +36,8 @@ pub fn configure(cfg: &mut web::ServiceConfig, enable_metrics: bool) {
|
|||||||
.service(web::resource("/version").route(web::get().to(get_version)))
|
.service(web::resource("/version").route(web::get().to(get_version)))
|
||||||
.service(web::scope("/indexes").configure(indexes::configure))
|
.service(web::scope("/indexes").configure(indexes::configure))
|
||||||
.service(web::scope("/multi-search").configure(multi_search::configure))
|
.service(web::scope("/multi-search").configure(multi_search::configure))
|
||||||
.service(web::scope("/swap-indexes").configure(swap_indexes::configure));
|
.service(web::scope("/swap-indexes").configure(swap_indexes::configure))
|
||||||
|
.service(web::scope("/experimental-features").configure(features::configure));
|
||||||
|
|
||||||
if enable_metrics {
|
if enable_metrics {
|
||||||
cfg.service(web::scope("/metrics").configure(metrics::configure));
|
cfg.service(web::scope("/metrics").configure(metrics::configure));
|
||||||
|
Loading…
Reference in New Issue
Block a user