This commit is contained in:
2026-08-17 01:12:07 +02:00
parent 07f8d5fe73
commit 429d82e64c
21 changed files with 733 additions and 6 deletions
+97 -3
View File
@@ -3,6 +3,7 @@ use crate::domain::dto::message::{
CreateMessageRequest, MessagePageResponse, MessageQueryParams, MessageResponse,
UpdateMessageRequest,
};
use crate::domain::dto::reaction::{CreateReactionRequest, DeleteReactionQuery, ReactionResponse};
use crate::http::context::CurrentUser;
use crate::http::error::HTTPError;
use crate::routes::message::mapper;
@@ -39,6 +40,12 @@ pub async fn get_all(
let params = mapper::query_params_to_message_filter(filters);
let page = state.repositories.message.filter(params).await?;
let message_ids: Vec<_> = page.messages.iter().map(|message| message.id).collect();
let mut reactions = state
.services
.message_reaction
.grouped_for_messages(&message_ids)
.await?;
let oldest_id = page.messages.first().map(|message| message.id);
let newest_id = page.messages.last().map(|message| message.id);
@@ -46,7 +53,10 @@ pub async fn get_all(
messages: page
.messages
.into_iter()
.map(mapper::message_model_to_message_response)
.map(|message| {
let groups = reactions.remove(&message.id).unwrap_or_default();
mapper::message_model_to_message_response_with_reactions(message, None, groups)
})
.collect(),
oldest_id,
newest_id,
@@ -80,7 +90,17 @@ pub async fn get_by_id(
.await?
.ok_or(HTTPError::NotFound)?;
Ok(Json(mapper::message_model_to_message_response(message)))
let reactions = state
.services
.message_reaction
.grouped_for_messages(&[id])
.await?
.remove(&id)
.unwrap_or_default();
Ok(Json(
mapper::message_model_to_message_response_with_reactions(message, None, reactions),
))
}
/// Crée un nouveau message
@@ -181,7 +201,81 @@ pub async fn update(
.update_message(id, payload.content)
.await?;
Ok(Json(mapper::message_model_to_message_response(message)))
let reactions = state
.services
.message_reaction
.grouped_for_messages(&[id])
.await?
.remove(&id)
.unwrap_or_default();
Ok(Json(
mapper::message_model_to_message_response_with_reactions(message, None, reactions),
))
}
#[utoipa::path(
post,
path = "/messages/{message_id}/reactions",
request_body = CreateReactionRequest,
responses(
(status = 201, description = "Réaction ajoutée", body = ReactionResponse),
(status = 200, description = "Réaction déjà présente", body = ReactionResponse),
(status = 400, description = "Emoji ou ton invalide"),
(status = 404, description = "Message non trouvé")
),
params(("message_id" = Uuid, Path)),
tag = "Messages",
security(("bearerAuth" = []))
)]
pub async fn add_reaction(
user: CurrentUser,
State(state): State<AppState>,
Path(message_id): Path<Uuid>,
Json(payload): Json<CreateReactionRequest>,
) -> Result<(StatusCode, Json<ReactionResponse>), HTTPError> {
let (reaction, created) = state
.services
.message_reaction
.add(message_id, user.id, payload.emoji_id, payload.skin_tone)
.await?;
Ok((
if created {
StatusCode::CREATED
} else {
StatusCode::OK
},
Json(mapper::reaction_model_to_response(reaction)),
))
}
#[utoipa::path(
delete,
path = "/messages/{message_id}/reactions/{emoji_id}",
responses(
(status = 204, description = "Réaction supprimée"),
(status = 400, description = "Emoji ou ton invalide"),
(status = 404, description = "Réaction non trouvée")
),
params(
("message_id" = Uuid, Path),
("emoji_id" = Uuid, Path),
DeleteReactionQuery
),
tag = "Messages",
security(("bearerAuth" = []))
)]
pub async fn remove_reaction(
user: CurrentUser,
State(state): State<AppState>,
Path((message_id, emoji_id)): Path<(Uuid, Uuid)>,
Query(query): Query<DeleteReactionQuery>,
) -> Result<StatusCode, HTTPError> {
state
.services
.message_reaction
.remove(message_id, user.id, emoji_id, query.skin_tone)
.await?;
Ok(StatusCode::NO_CONTENT)
}
/// Supprime un message