mirror of
https://github.com/meilisearch/MeiliSearch
synced 2025-01-09 13:04:30 +01:00
add the experimental features route
This commit is contained in:
parent
e2686c0fce
commit
8a2a1e4d27
@ -8,12 +8,27 @@ use meilisearch_types::error::ResponseError;
|
|||||||
use meilisearch_types::keys::actions;
|
use meilisearch_types::keys::actions;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
use utoipa::{OpenApi, ToSchema};
|
||||||
|
|
||||||
use crate::analytics::{Aggregate, Analytics};
|
use crate::analytics::{Aggregate, Analytics};
|
||||||
use crate::extractors::authentication::policies::ActionPolicy;
|
use crate::extractors::authentication::policies::ActionPolicy;
|
||||||
use crate::extractors::authentication::GuardedData;
|
use crate::extractors::authentication::GuardedData;
|
||||||
use crate::extractors::sequential_extractor::SeqHandler;
|
use crate::extractors::sequential_extractor::SeqHandler;
|
||||||
|
|
||||||
|
#[derive(OpenApi)]
|
||||||
|
#[openapi(
|
||||||
|
paths(get_features),
|
||||||
|
tags((
|
||||||
|
name = "Experimental features",
|
||||||
|
description = "The `/experimental-features` route allows you to activate or deactivate some of Meilisearch's experimental features.
|
||||||
|
|
||||||
|
This route is **synchronous**. This means that no task object will be returned, and any activated or deactivated features will be made available or unavailable immediately.",
|
||||||
|
external_docs(url = "https://www.meilisearch.com/docs/reference/api/experimental_features"),
|
||||||
|
|
||||||
|
)),
|
||||||
|
)]
|
||||||
|
pub struct ExperimentalFeaturesApi;
|
||||||
|
|
||||||
pub fn configure(cfg: &mut web::ServiceConfig) {
|
pub fn configure(cfg: &mut web::ServiceConfig) {
|
||||||
cfg.service(
|
cfg.service(
|
||||||
web::resource("")
|
web::resource("")
|
||||||
@ -22,6 +37,32 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get all experimental features
|
||||||
|
///
|
||||||
|
/// Get a list of all experimental features that can be activated via the /experimental-features route and whether or not they are currently activated.
|
||||||
|
#[utoipa::path(
|
||||||
|
post,
|
||||||
|
path = "/",
|
||||||
|
tag = "Experimental features",
|
||||||
|
security(("Bearer" = ["experimental_features.get", "experimental_features.*", "*"])),
|
||||||
|
responses(
|
||||||
|
(status = OK, description = "Experimental features are returned", body = RuntimeTogglableFeatures, content_type = "application/json", example = json!(
|
||||||
|
{
|
||||||
|
"metrics": false,
|
||||||
|
"logsRoute": true,
|
||||||
|
"vectorSearch": false,
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
(status = 401, description = "The authorization header is missing", body = ResponseError, content_type = "application/json", example = json!(
|
||||||
|
{
|
||||||
|
"message": "The Authorization header is missing. It must use the bearer authorization method.",
|
||||||
|
"code": "missing_authorization_header",
|
||||||
|
"type": "auth",
|
||||||
|
"link": "https://docs.meilisearch.com/errors#missing_authorization_header"
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
)]
|
||||||
async fn get_features(
|
async fn get_features(
|
||||||
index_scheduler: GuardedData<
|
index_scheduler: GuardedData<
|
||||||
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_GET }>,
|
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_GET }>,
|
||||||
@ -35,8 +76,9 @@ async fn get_features(
|
|||||||
HttpResponse::Ok().json(features)
|
HttpResponse::Ok().json(features)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Deserr)]
|
#[derive(Debug, Deserr, ToSchema)]
|
||||||
#[deserr(error = DeserrJsonError, rename_all = camelCase, deny_unknown_fields)]
|
#[deserr(error = DeserrJsonError, rename_all = camelCase, deny_unknown_fields)]
|
||||||
|
#[schema(rename_all = "camelCase")]
|
||||||
pub struct RuntimeTogglableFeatures {
|
pub struct RuntimeTogglableFeatures {
|
||||||
#[deserr(default)]
|
#[deserr(default)]
|
||||||
pub vector_store: Option<bool>,
|
pub vector_store: Option<bool>,
|
||||||
@ -79,6 +121,32 @@ impl Aggregate for PatchExperimentalFeatureAnalytics {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Configure experimental features
|
||||||
|
///
|
||||||
|
/// Activate or deactivate experimental features.
|
||||||
|
#[utoipa::path(
|
||||||
|
patch,
|
||||||
|
path = "/",
|
||||||
|
tag = "Experimental features",
|
||||||
|
security(("Bearer" = ["experimental_features.update", "experimental_features.*", "*"])),
|
||||||
|
responses(
|
||||||
|
(status = OK, description = "Experimental features are returned", body = RuntimeTogglableFeatures, content_type = "application/json", example = json!(
|
||||||
|
{
|
||||||
|
"metrics": false,
|
||||||
|
"logsRoute": true,
|
||||||
|
"vectorSearch": false,
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
(status = 401, description = "The authorization header is missing", body = ResponseError, content_type = "application/json", example = json!(
|
||||||
|
{
|
||||||
|
"message": "The Authorization header is missing. It must use the bearer authorization method.",
|
||||||
|
"code": "missing_authorization_header",
|
||||||
|
"type": "auth",
|
||||||
|
"link": "https://docs.meilisearch.com/errors#missing_authorization_header"
|
||||||
|
}
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
)]
|
||||||
async fn patch_features(
|
async fn patch_features(
|
||||||
index_scheduler: GuardedData<
|
index_scheduler: GuardedData<
|
||||||
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_UPDATE }>,
|
ActionPolicy<{ actions::EXPERIMENTAL_FEATURES_UPDATE }>,
|
||||||
|
@ -2,6 +2,7 @@ use std::collections::BTreeMap;
|
|||||||
|
|
||||||
use crate::extractors::authentication::policies::*;
|
use crate::extractors::authentication::policies::*;
|
||||||
use crate::extractors::authentication::GuardedData;
|
use crate::extractors::authentication::GuardedData;
|
||||||
|
use crate::routes::features::RuntimeTogglableFeatures;
|
||||||
use crate::routes::indexes::documents::DocumentEditionByFunction;
|
use crate::routes::indexes::documents::DocumentEditionByFunction;
|
||||||
use crate::routes::multi_search::SearchResults;
|
use crate::routes::multi_search::SearchResults;
|
||||||
use crate::routes::swap_indexes::SwapIndexesPayload;
|
use crate::routes::swap_indexes::SwapIndexesPayload;
|
||||||
@ -72,13 +73,14 @@ pub mod tasks;
|
|||||||
(path = "/logs", api = logs::LogsApi),
|
(path = "/logs", api = logs::LogsApi),
|
||||||
(path = "/multi-search", api = multi_search::MultiSearchApi),
|
(path = "/multi-search", api = multi_search::MultiSearchApi),
|
||||||
(path = "/swap-indexes", api = swap_indexes::SwapIndexesApi),
|
(path = "/swap-indexes", api = swap_indexes::SwapIndexesApi),
|
||||||
|
(path = "/experimental-features", api = features::ExperimentalFeaturesApi),
|
||||||
),
|
),
|
||||||
paths(get_health, get_version, get_stats),
|
paths(get_health, get_version, get_stats),
|
||||||
tags(
|
tags(
|
||||||
(name = "Stats", description = "Stats gives extended information and metrics about indexes and the Meilisearch database."),
|
(name = "Stats", description = "Stats gives extended information and metrics about indexes and the Meilisearch database."),
|
||||||
),
|
),
|
||||||
modifiers(&OpenApiAuth),
|
modifiers(&OpenApiAuth),
|
||||||
components(schemas(SwapIndexesPayload, DocumentEditionByFunction, MergeFacets, FederationOptions, SearchQueryWithIndex, Federation, FederatedSearch, FederatedSearchResult, SearchResults, SearchResultWithIndex, SimilarQuery, SimilarResult, PaginationView<serde_json::Value>, BrowseQuery, UpdateIndexRequest, IndexUid, IndexCreateRequest, KeyView, Action, CreateApiKey, UpdateStderrLogs, LogMode, GetLogs, IndexStats, Stats, HealthStatus, HealthResponse, VersionResponse, Code, ErrorType, AllTasks, TaskView, Status, DetailsView, ResponseError, Settings<Unchecked>, Settings<Checked>, TypoSettings, MinWordSizeTyposSetting, FacetingSettings, PaginationSettings, SummarizedTaskView, Kind))
|
components(schemas(RuntimeTogglableFeatures, SwapIndexesPayload, DocumentEditionByFunction, MergeFacets, FederationOptions, SearchQueryWithIndex, Federation, FederatedSearch, FederatedSearchResult, SearchResults, SearchResultWithIndex, SimilarQuery, SimilarResult, PaginationView<serde_json::Value>, BrowseQuery, UpdateIndexRequest, IndexUid, IndexCreateRequest, KeyView, Action, CreateApiKey, UpdateStderrLogs, LogMode, GetLogs, IndexStats, Stats, HealthStatus, HealthResponse, VersionResponse, Code, ErrorType, AllTasks, TaskView, Status, DetailsView, ResponseError, Settings<Unchecked>, Settings<Checked>, TypoSettings, MinWordSizeTyposSetting, FacetingSettings, PaginationSettings, SummarizedTaskView, Kind))
|
||||||
)]
|
)]
|
||||||
pub struct MeilisearchApi;
|
pub struct MeilisearchApi;
|
||||||
|
|
||||||
@ -99,7 +101,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
|
|||||||
.service(web::resource("/version").route(web::get().to(get_version))) // done
|
.service(web::resource("/version").route(web::get().to(get_version))) // done
|
||||||
.service(web::scope("/indexes").configure(indexes::configure)) // done
|
.service(web::scope("/indexes").configure(indexes::configure)) // done
|
||||||
.service(web::scope("/multi-search").configure(multi_search::configure)) // done
|
.service(web::scope("/multi-search").configure(multi_search::configure)) // done
|
||||||
.service(web::scope("/swap-indexes").configure(swap_indexes::configure)) // TODO
|
.service(web::scope("/swap-indexes").configure(swap_indexes::configure)) // done
|
||||||
.service(web::scope("/metrics").configure(metrics::configure)) // done
|
.service(web::scope("/metrics").configure(metrics::configure)) // done
|
||||||
.service(web::scope("/experimental-features").configure(features::configure));
|
.service(web::scope("/experimental-features").configure(features::configure));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user