This commit is contained in:
2026-08-08 14:17:24 +02:00
parent e9fe51363f
commit 0d8c86af16
12 changed files with 835 additions and 151 deletions
+37 -11
View File
@@ -1,21 +1,25 @@
use crate::domain::dto::message::{CreateMessageRequest, MessageQueryParams, MessageResponse, UpdateMessageRequest};
use crate::core::state::AppState;
use crate::domain::dto::message::{
CreateMessageRequest, MessagePageResponse, MessageQueryParams, MessageResponse,
UpdateMessageRequest,
};
use crate::http::context::CurrentUser;
use crate::http::error::HTTPError;
use crate::routes::message::mapper;
use axum::{
Json,
extract::{Path, Query, State},
http::StatusCode,
Json,
};
use uuid::Uuid;
/// Liste tous les messages
/// Liste une fenêtre paginée de messages
#[utoipa::path(
get,
path = "/messages",
responses(
(status = 200, description = "Liste des messages récupérée avec succès", body = [MessageResponse]),
(status = 200, description = "Fenêtre de messages récupérée avec succès", body = MessagePageResponse),
(status = 400, description = "Curseurs incompatibles ou canal manquant"),
(status = 500, description = "Erreur interne du serveur")
),
params(
@@ -26,15 +30,29 @@ use uuid::Uuid;
pub async fn get_all(
State(state): State<AppState>,
Query(filters): Query<MessageQueryParams>,
) -> Result<Json<Vec<MessageResponse>>, HTTPError> {
) -> Result<Json<MessagePageResponse>, HTTPError> {
if filters.before_id.is_some() && filters.after_id.is_some() {
return Err(HTTPError::BadRequest(
"before_id and after_id cannot be used together".to_string(),
));
}
let params = mapper::query_params_to_message_filter(filters);
let messages = state.repositories.message.filter(params).await?;
Ok(Json(
messages
let page = state.repositories.message.filter(params).await?;
let oldest_id = page.messages.first().map(|message| message.id);
let newest_id = page.messages.last().map(|message| message.id);
Ok(Json(MessagePageResponse {
messages: page
.messages
.into_iter()
.map(mapper::message_model_to_message_response)
.collect(),
))
oldest_id,
newest_id,
has_more_before: page.has_more_before,
has_more_after: page.has_more_after,
}))
}
/// Récupère un message par son ID
@@ -105,7 +123,11 @@ pub async fn create(
))?;
}
let message = state.services.message.create_message(payload.channel_id, user.id, payload.content).await?;
let message = state
.services
.message
.create_message(payload.channel_id, user.id, payload.content)
.await?;
Ok((
StatusCode::CREATED,
Json(mapper::message_model_to_message_response(message)),
@@ -150,7 +172,11 @@ pub async fn update(
return Err(HTTPError::Forbidden);
}
let message = state.services.message.update_message(id, payload.content).await?;
let message = state
.services
.message
.update_message(id, payload.content)
.await?;
Ok(Json(mapper::message_model_to_message_response(message)))
}
+4 -3
View File
@@ -1,8 +1,8 @@
use crate::models::message;
use crate::repositories::types::MessageFilter;
use crate::domain::dto::message::{
CreateMessageRequest, MessageQueryParams, MessageResponse, UpdateMessageRequest,
};
use crate::models::message;
use crate::repositories::types::MessageFilter;
use chrono::Utc;
use sea_orm::Set;
use uuid::Uuid;
@@ -48,8 +48,9 @@ pub fn update_request_to_am(
pub fn query_params_to_message_filter(params: MessageQueryParams) -> MessageFilter {
MessageFilter {
channel_id: params.channel_id,
channel_id: Some(params.channel_id),
before_id: params.before_id,
after_id: params.after_id,
limit: params.limit,
}
}