mirror of
https://github.com/meilisearch/meilisearch.git
synced 2024-11-26 12:05:05 +08:00
Merge #3334
3334: Add specific error codes `immutable_...` r=irevoire a=loiclec Add the following error codes: When an immutable field of API key is sent to the `PATCH /keys` route: - `ImmutableApiKeyUid` - `ImmutableApiKeyKey` - `ImmutableApiKeyActions` - `ImmutableApiKeyIndexes` - `ImmutableApiKeyExpiresAt` - `ImmutableApiKeyCreatedAt` - `ImmutableApiKeyUpdatedAt` When an immutable field of Index is sent to the `PATCH /indexes/{uid}` route: - `ImmutableIndexUid` - `ImmutableIndexCreatedAt` - `ImmutableIndexUpdatedAt` Co-authored-by: Loïc Lecrenier <loic.lecrenier@me.com> Co-authored-by: Tamo <tamo@meilisearch.com>
This commit is contained in:
commit
a5c4fbbcea
@ -292,14 +292,14 @@ impl From<v5::ResponseError> for v6::ResponseError {
|
|||||||
"malformed_payload" => v6::Code::MalformedPayload,
|
"malformed_payload" => v6::Code::MalformedPayload,
|
||||||
"missing_payload" => v6::Code::MissingPayload,
|
"missing_payload" => v6::Code::MissingPayload,
|
||||||
"api_key_not_found" => v6::Code::ApiKeyNotFound,
|
"api_key_not_found" => v6::Code::ApiKeyNotFound,
|
||||||
"missing_parameter" => v6::Code::UnretrievableErrorCode,
|
"missing_parameter" => v6::Code::BadRequest,
|
||||||
"invalid_api_key_actions" => v6::Code::InvalidApiKeyActions,
|
"invalid_api_key_actions" => v6::Code::InvalidApiKeyActions,
|
||||||
"invalid_api_key_indexes" => v6::Code::InvalidApiKeyIndexes,
|
"invalid_api_key_indexes" => v6::Code::InvalidApiKeyIndexes,
|
||||||
"invalid_api_key_expires_at" => v6::Code::InvalidApiKeyExpiresAt,
|
"invalid_api_key_expires_at" => v6::Code::InvalidApiKeyExpiresAt,
|
||||||
"invalid_api_key_description" => v6::Code::InvalidApiKeyDescription,
|
"invalid_api_key_description" => v6::Code::InvalidApiKeyDescription,
|
||||||
"invalid_api_key_name" => v6::Code::InvalidApiKeyName,
|
"invalid_api_key_name" => v6::Code::InvalidApiKeyName,
|
||||||
"invalid_api_key_uid" => v6::Code::InvalidApiKeyUid,
|
"invalid_api_key_uid" => v6::Code::InvalidApiKeyUid,
|
||||||
"immutable_field" => v6::Code::ImmutableField,
|
"immutable_field" => v6::Code::BadRequest,
|
||||||
"api_key_already_exists" => v6::Code::ApiKeyAlreadyExists,
|
"api_key_already_exists" => v6::Code::ApiKeyAlreadyExists,
|
||||||
other => {
|
other => {
|
||||||
log::warn!("Unknown error code {}", other);
|
log::warn!("Unknown error code {}", other);
|
||||||
|
@ -181,7 +181,19 @@ DumpAlreadyProcessing , invalid , CONFLICT;
|
|||||||
DumpNotFound , invalid , NOT_FOUND;
|
DumpNotFound , invalid , NOT_FOUND;
|
||||||
DumpProcessFailed , internal , INTERNAL_SERVER_ERROR;
|
DumpProcessFailed , internal , INTERNAL_SERVER_ERROR;
|
||||||
DuplicateIndexFound , invalid , BAD_REQUEST;
|
DuplicateIndexFound , invalid , BAD_REQUEST;
|
||||||
ImmutableField , invalid , BAD_REQUEST;
|
|
||||||
|
ImmutableApiKeyUid , invalid , BAD_REQUEST;
|
||||||
|
ImmutableApiKeyKey , invalid , BAD_REQUEST;
|
||||||
|
ImmutableApiKeyActions , invalid , BAD_REQUEST;
|
||||||
|
ImmutableApiKeyIndexes , invalid , BAD_REQUEST;
|
||||||
|
ImmutableApiKeyExpiresAt , invalid , BAD_REQUEST;
|
||||||
|
ImmutableApiKeyCreatedAt , invalid , BAD_REQUEST;
|
||||||
|
ImmutableApiKeyUpdatedAt , invalid , BAD_REQUEST;
|
||||||
|
|
||||||
|
ImmutableIndexUid , invalid , BAD_REQUEST;
|
||||||
|
ImmutableIndexCreatedAt , invalid , BAD_REQUEST;
|
||||||
|
ImmutableIndexUpdatedAt , invalid , BAD_REQUEST;
|
||||||
|
|
||||||
IndexAlreadyExists , invalid , CONFLICT ;
|
IndexAlreadyExists , invalid , CONFLICT ;
|
||||||
IndexCreationFailed , internal , INTERNAL_SERVER_ERROR;
|
IndexCreationFailed , internal , INTERNAL_SERVER_ERROR;
|
||||||
IndexNotFound , invalid , NOT_FOUND;
|
IndexNotFound , invalid , NOT_FOUND;
|
||||||
|
@ -80,12 +80,12 @@ fn deny_immutable_fields_api_key(
|
|||||||
));
|
));
|
||||||
|
|
||||||
error.code = match field {
|
error.code = match field {
|
||||||
"uid" => Code::ImmutableField,
|
"uid" => Code::ImmutableApiKeyUid,
|
||||||
"actions" => Code::ImmutableField,
|
"actions" => Code::ImmutableApiKeyActions,
|
||||||
"indexes" => Code::ImmutableField,
|
"indexes" => Code::ImmutableApiKeyIndexes,
|
||||||
"expiresAt" => Code::ImmutableField,
|
"expiresAt" => Code::ImmutableApiKeyExpiresAt,
|
||||||
"createdAt" => Code::ImmutableField,
|
"createdAt" => Code::ImmutableApiKeyCreatedAt,
|
||||||
"updatedAt" => Code::ImmutableField,
|
"updatedAt" => Code::ImmutableApiKeyUpdatedAt,
|
||||||
_ => Code::BadRequest,
|
_ => Code::BadRequest,
|
||||||
};
|
};
|
||||||
error
|
error
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
|
use std::convert::Infallible;
|
||||||
|
|
||||||
use actix_web::web::Data;
|
use actix_web::web::Data;
|
||||||
use actix_web::{web, HttpRequest, HttpResponse};
|
use actix_web::{web, HttpRequest, HttpResponse};
|
||||||
use deserr::DeserializeFromValue;
|
use deserr::{DeserializeError, DeserializeFromValue, ValuePointerRef};
|
||||||
use index_scheduler::IndexScheduler;
|
use index_scheduler::IndexScheduler;
|
||||||
use log::debug;
|
use log::debug;
|
||||||
use meilisearch_types::error::deserr_codes::*;
|
use meilisearch_types::error::deserr_codes::*;
|
||||||
use meilisearch_types::error::{DeserrError, ResponseError, TakeErrorMessage};
|
use meilisearch_types::error::{unwrap_any, Code, DeserrError, ResponseError, TakeErrorMessage};
|
||||||
use meilisearch_types::index_uid::IndexUid;
|
use meilisearch_types::index_uid::IndexUid;
|
||||||
use meilisearch_types::milli::{self, FieldDistribution, Index};
|
use meilisearch_types::milli::{self, FieldDistribution, Index};
|
||||||
use meilisearch_types::tasks::KindWithContent;
|
use meilisearch_types::tasks::KindWithContent;
|
||||||
@ -140,8 +142,27 @@ pub async fn create_index(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn deny_immutable_fields_index(
|
||||||
|
field: &str,
|
||||||
|
accepted: &[&str],
|
||||||
|
location: ValuePointerRef,
|
||||||
|
) -> DeserrError {
|
||||||
|
let mut error = unwrap_any(DeserrError::<BadRequest>::error::<Infallible>(
|
||||||
|
None,
|
||||||
|
deserr::ErrorKind::UnknownKey { key: field, accepted },
|
||||||
|
location,
|
||||||
|
));
|
||||||
|
|
||||||
|
error.code = match field {
|
||||||
|
"uid" => Code::ImmutableIndexUid,
|
||||||
|
"createdAt" => Code::ImmutableIndexCreatedAt,
|
||||||
|
"updatedAt" => Code::ImmutableIndexUpdatedAt,
|
||||||
|
_ => Code::BadRequest,
|
||||||
|
};
|
||||||
|
error
|
||||||
|
}
|
||||||
#[derive(DeserializeFromValue, Debug)]
|
#[derive(DeserializeFromValue, Debug)]
|
||||||
#[deserr(error = DeserrError, rename_all = camelCase, deny_unknown_fields)]
|
#[deserr(error = DeserrError, rename_all = camelCase, deny_unknown_fields = deny_immutable_fields_index)]
|
||||||
pub struct UpdateIndexRequest {
|
pub struct UpdateIndexRequest {
|
||||||
#[deserr(error = DeserrError<InvalidIndexPrimaryKey>)]
|
#[deserr(error = DeserrError<InvalidIndexPrimaryKey>)]
|
||||||
primary_key: Option<String>,
|
primary_key: Option<String>,
|
||||||
|
@ -1404,9 +1404,9 @@ async fn error_patch_api_key_indexes() {
|
|||||||
meili_snap::snapshot!(meili_snap::json_string!(response, { ".createdAt" => "[ignored]", ".updatedAt" => "[ignored]" }), @r###"
|
meili_snap::snapshot!(meili_snap::json_string!(response, { ".createdAt" => "[ignored]", ".updatedAt" => "[ignored]" }), @r###"
|
||||||
{
|
{
|
||||||
"message": "Json deserialize error: unknown field `indexes`, expected one of `description`, `name` at ``.",
|
"message": "Json deserialize error: unknown field `indexes`, expected one of `description`, `name` at ``.",
|
||||||
"code": "immutable_field",
|
"code": "immutable_api_key_indexes",
|
||||||
"type": "invalid_request",
|
"type": "invalid_request",
|
||||||
"link": "https://docs.meilisearch.com/errors#immutable-field"
|
"link": "https://docs.meilisearch.com/errors#immutable-api-key-indexes"
|
||||||
}
|
}
|
||||||
"###);
|
"###);
|
||||||
meili_snap::snapshot!(code, @"400 Bad Request");
|
meili_snap::snapshot!(code, @"400 Bad Request");
|
||||||
@ -1481,9 +1481,9 @@ async fn error_patch_api_key_actions() {
|
|||||||
meili_snap::snapshot!(meili_snap::json_string!(response, { ".createdAt" => "[ignored]", ".updatedAt" => "[ignored]" }), @r###"
|
meili_snap::snapshot!(meili_snap::json_string!(response, { ".createdAt" => "[ignored]", ".updatedAt" => "[ignored]" }), @r###"
|
||||||
{
|
{
|
||||||
"message": "Json deserialize error: unknown field `actions`, expected one of `description`, `name` at ``.",
|
"message": "Json deserialize error: unknown field `actions`, expected one of `description`, `name` at ``.",
|
||||||
"code": "immutable_field",
|
"code": "immutable_api_key_actions",
|
||||||
"type": "invalid_request",
|
"type": "invalid_request",
|
||||||
"link": "https://docs.meilisearch.com/errors#immutable-field"
|
"link": "https://docs.meilisearch.com/errors#immutable-api-key-actions"
|
||||||
}
|
}
|
||||||
"###);
|
"###);
|
||||||
meili_snap::snapshot!(code, @"400 Bad Request");
|
meili_snap::snapshot!(code, @"400 Bad Request");
|
||||||
@ -1550,9 +1550,9 @@ async fn error_patch_api_key_expiration_date() {
|
|||||||
meili_snap::snapshot!(meili_snap::json_string!(response, { ".createdAt" => "[ignored]", ".updatedAt" => "[ignored]" }), @r###"
|
meili_snap::snapshot!(meili_snap::json_string!(response, { ".createdAt" => "[ignored]", ".updatedAt" => "[ignored]" }), @r###"
|
||||||
{
|
{
|
||||||
"message": "Json deserialize error: unknown field `expiresAt`, expected one of `description`, `name` at ``.",
|
"message": "Json deserialize error: unknown field `expiresAt`, expected one of `description`, `name` at ``.",
|
||||||
"code": "immutable_field",
|
"code": "immutable_api_key_expires_at",
|
||||||
"type": "invalid_request",
|
"type": "invalid_request",
|
||||||
"link": "https://docs.meilisearch.com/errors#immutable-field"
|
"link": "https://docs.meilisearch.com/errors#immutable-api-key-expires-at"
|
||||||
}
|
}
|
||||||
"###);
|
"###);
|
||||||
meili_snap::snapshot!(code, @"400 Bad Request");
|
meili_snap::snapshot!(code, @"400 Bad Request");
|
||||||
|
Loading…
Reference in New Issue
Block a user