Add specific immutable_field error codes

This commit is contained in:
Loïc Lecrenier 2023-01-12 09:35:56 +01:00 committed by Tamo
parent 2bc60c29fc
commit 7f80b116bc
No known key found for this signature in database
GPG Key ID: 20CD8020AFA88D69
5 changed files with 51 additions and 18 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -1,9 +1,11 @@
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::*, unwrap_any, Code};
use meilisearch_types::error::{DeserrError, ResponseError, TakeErrorMessage}; use meilisearch_types::error::{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};
@ -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>,

View File

@ -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");