init
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user