This commit is contained in:
2026-07-05 20:02:45 +02:00
parent 24d40e4de0
commit 30d928ddde
9 changed files with 145 additions and 28 deletions
+20 -1
View File
@@ -1,6 +1,7 @@
use super::types::MessageFilter;
use crate::models::message;
use crate::repositories::{AnyResult, RepositoryContext};
use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter};
use sea_orm::{ActiveModelTrait, ColumnTrait, EntityTrait, QueryFilter, QueryOrder, QuerySelect};
use std::sync::Arc;
#[derive(Clone, Debug)]
@@ -19,6 +20,24 @@ impl MessageRepository {
.await?)
}
pub async fn filter(&self, filter: MessageFilter) -> AnyResult<Vec<message::Model>> {
let mut query = message::Entity::find();
if let Some(channel_id) = filter.channel_id {
query = query.filter(message::Column::ChannelId.eq(channel_id));
}
if let Some(before_id) = filter.before_id {
query = query.filter(message::Column::Id.lt(before_id));
}
if let Some(limit) = filter.limit {
query = query.order_by_desc(message::Column::Id).limit(limit);
}
Ok(query.all(&self.context.db).await?)
}
pub async fn get_by_channel(&self, channel_id: uuid::Uuid) -> AnyResult<Vec<message::Model>> {
Ok(message::Entity::find()
.filter(message::Column::ChannelId.eq(channel_id))
+7 -1
View File
@@ -17,4 +17,10 @@ impl ServerExplorerItem {
pub struct ServerTree {
pub items: Vec<ServerExplorerItem>,
}
}
pub struct MessageFilter {
pub channel_id: Option<uuid::Uuid>,
pub before_id: Option<uuid::Uuid>,
pub limit: Option<u64>,
}
+13 -1
View File
@@ -27,6 +27,18 @@ pub struct UpdateMessageRequest {
}
#[derive(serde::Deserialize, utoipa::IntoParams)]
pub struct MessageFilters {
pub struct MessageQueryParams {
pub channel_id: Option<uuid::Uuid>,
pub before_id: Option<Uuid>,
pub limit: Option<u64>,
}
impl Default for MessageQueryParams {
fn default() -> Self {
Self {
channel_id: None,
before_id: None,
limit: Some(50),
}
}
}
+5 -12
View File
@@ -1,4 +1,4 @@
use super::dto::{CreateMessageRequest, MessageFilters, MessageResponse, UpdateMessageRequest};
use super::dto::{CreateMessageRequest, MessageQueryParams, MessageResponse, UpdateMessageRequest};
use crate::core::state::AppState;
use crate::http::context::CurrentUser;
use crate::http::error::HTTPError;
@@ -19,23 +19,16 @@ use uuid::Uuid;
(status = 500, description = "Erreur interne du serveur")
),
params(
MessageFilters
MessageQueryParams
),
tag = "Messages"
)]
pub async fn get_all(
State(state): State<AppState>,
Query(filters): Query<MessageFilters>,
Query(filters): Query<MessageQueryParams>,
) -> Result<Json<Vec<MessageResponse>>, HTTPError> {
let messages = if let Some(channel_id) = filters.channel_id {
state
.repositories
.message
.get_by_channel(channel_id)
.await?
} else {
state.repositories.message.get_all().await?
};
let params = mapper::query_params_to_message_filter(filters);
let messages = state.repositories.message.filter(params).await?;
Ok(Json(
messages
.into_iter()
+12 -1
View File
@@ -1,5 +1,8 @@
use crate::models::message;
use crate::routes::message::dto::{CreateMessageRequest, MessageResponse, UpdateMessageRequest};
use crate::repositories::types::MessageFilter;
use crate::routes::message::dto::{
CreateMessageRequest, MessageQueryParams, MessageResponse, UpdateMessageRequest,
};
use chrono::Utc;
use sea_orm::Set;
use uuid::Uuid;
@@ -42,3 +45,11 @@ pub fn update_request_to_am(
reply_to_id: Set(model.reply_to_id),
}
}
pub fn query_params_to_message_filter(params: MessageQueryParams) -> MessageFilter {
MessageFilter {
channel_id: params.channel_id,
before_id: params.before_id,
limit: params.limit,
}
}