Add error handling

This commit is contained in:
Mubelotix
2025-07-16 15:07:10 +02:00
parent 313d804b62
commit e83a49821a
2 changed files with 43 additions and 18 deletions

View File

@ -417,6 +417,7 @@ InvalidChatCompletionSearchDescriptionPrompt , InvalidRequest , BAD_REQU
InvalidChatCompletionSearchQueryParamPrompt , InvalidRequest , BAD_REQUEST ; InvalidChatCompletionSearchQueryParamPrompt , InvalidRequest , BAD_REQUEST ;
InvalidChatCompletionSearchIndexUidParamPrompt , InvalidRequest , BAD_REQUEST ; InvalidChatCompletionSearchIndexUidParamPrompt , InvalidRequest , BAD_REQUEST ;
InvalidChatCompletionPreQueryPrompt , InvalidRequest , BAD_REQUEST ; InvalidChatCompletionPreQueryPrompt , InvalidRequest , BAD_REQUEST ;
// Render
InvalidRenderTemplate , InvalidRequest , BAD_REQUEST ; InvalidRenderTemplate , InvalidRequest , BAD_REQUEST ;
InvalidRenderTemplateId , InvalidRequest , BAD_REQUEST ; InvalidRenderTemplateId , InvalidRequest , BAD_REQUEST ;
InvalidRenderTemplateInline , InvalidRequest , BAD_REQUEST ; InvalidRenderTemplateInline , InvalidRequest , BAD_REQUEST ;

View File

@ -6,7 +6,7 @@ use index_scheduler::IndexScheduler;
use itertools::structs; use itertools::structs;
use meilisearch_types::deserr::query_params::Param; use meilisearch_types::deserr::query_params::Param;
use meilisearch_types::deserr::{DeserrJsonError, DeserrQueryParamError}; use meilisearch_types::deserr::{DeserrJsonError, DeserrQueryParamError};
use meilisearch_types::error::deserr_codes::*; use meilisearch_types::error::{deserr_codes::*, Code};
use meilisearch_types::error::ResponseError; use meilisearch_types::error::ResponseError;
use meilisearch_types::index_uid::IndexUid; use meilisearch_types::index_uid::IndexUid;
use meilisearch_types::keys::actions; use meilisearch_types::keys::actions;
@ -28,21 +28,19 @@ use crate::search::{
#[derive(OpenApi)] #[derive(OpenApi)]
#[openapi( #[openapi(
paths(render), paths(render_post),
tags( tags((
( name = "Render templates",
name = "Render templates", description = "The /render route allows rendering templates used by Meilisearch.",
description = "The /render route allows rendering templates used by Meilisearch.", external_docs(url = "https://www.meilisearch.com/docs/reference/api/render"),
external_docs(url = "https://www.meilisearch.com/docs/reference/api/render"), )),
),
),
)] )]
pub struct RenderApi; pub struct RenderApi;
pub fn configure(cfg: &mut web::ServiceConfig) { pub fn configure(cfg: &mut web::ServiceConfig) {
cfg.service( cfg.service(
web::resource("") web::resource("")
.route(web::post().to(SeqHandler(render))) .route(web::post().to(SeqHandler(render_post)))
); );
} }
@ -51,7 +49,7 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
post, post,
path = "{indexUid}/render", path = "{indexUid}/render",
tag = "Render templates", tag = "Render templates",
security(("Bearer" = ["templates.render", "*.get", "*"])), security(("Bearer" = ["settings.get", "settings.*", "*.get", "*"])),
params(("indexUid" = String, Path, example = "movies", description = "Index Unique Identifier", nullable = false)), params(("indexUid" = String, Path, example = "movies", description = "Index Unique Identifier", nullable = false)),
request_body = RenderQuery, request_body = RenderQuery,
responses( responses(
@ -78,8 +76,8 @@ pub fn configure(cfg: &mut web::ServiceConfig) {
)), )),
) )
)] )]
pub async fn render( pub async fn render_post(
index_scheduler: GuardedData<ActionPolicy<{ actions::SEARCH }>, Data<IndexScheduler>>, index_scheduler: GuardedData<ActionPolicy<{ actions::SETTINGS_GET }>, Data<IndexScheduler>>,
index_uid: web::Path<String>, index_uid: web::Path<String>,
params: AwebJson<RenderQuery, DeserrJsonError>, params: AwebJson<RenderQuery, DeserrJsonError>,
req: HttpRequest, req: HttpRequest,
@ -92,17 +90,43 @@ pub async fn render(
//let mut aggregate = SimilarAggregator::<SimilarPOST>::from_query(&query); //let mut aggregate = SimilarAggregator::<SimilarPOST>::from_query(&query);
let rendered = RenderResult { let result = render(query).await?;
rendered: String::from("TODO")
};
// if let Ok(similar) = &similar { // if let Ok(similar) = &similar {
// aggregate.succeed(similar); // aggregate.succeed(similar);
// } // }
// analytics.publish(aggregate, &req); // analytics.publish(aggregate, &req);
debug!(returns = ?rendered, "Render template"); debug!(returns = ?result, "Render template");
Ok(HttpResponse::Ok().json(rendered)) Ok(HttpResponse::Ok().json(result))
}
enum RenderError {
TemplateBothInlineAndId,
}
use RenderError::*;
impl From<RenderError> for ResponseError {
fn from(error: RenderError) -> Self {
match error {
TemplateBothInlineAndId => ResponseError::from_msg(
"Cannot provide both an inline template and a template ID.".to_string(),
Code::InvalidRenderTemplate,
)
}
}
}
async fn render(query: RenderQuery) -> Result<RenderResult, RenderError> {
if query.template.inline.is_some() && query.template.id.is_some() {
return Err(TemplateBothInlineAndId);
}
Ok(RenderResult {
rendered: String::from("TODO: Implement render logic here")
})
} }
#[derive(Debug, Clone, PartialEq, Deserr, ToSchema)] #[derive(Debug, Clone, PartialEq, Deserr, ToSchema)]