40 lines
1.4 KiB
Rust
40 lines
1.4 KiB
Rust
use crate::AgentError;
|
|
use models::Expr;
|
|
use models::rooms::room_message::{
|
|
Column as RmCol, Entity as RoomMessage, Model as RoomMessageModel,
|
|
};
|
|
use sea_orm::*;
|
|
|
|
impl super::CompactService {
|
|
pub async fn fetch_room_messages_secure(
|
|
&self,
|
|
room_id: uuid::Uuid,
|
|
requester_id: uuid::Uuid,
|
|
) -> Result<Vec<RoomMessageModel>, AgentError> {
|
|
use models::rooms::{RoomAccess, RoomUserState};
|
|
|
|
RoomMessage::find()
|
|
.filter(RmCol::Room.eq(room_id))
|
|
.filter(
|
|
Condition::any()
|
|
.add(Expr::exists(
|
|
RoomUserState::find()
|
|
.filter(models::rooms::room_user_state::Column::Room.eq(room_id))
|
|
.filter(models::rooms::room_user_state::Column::User.eq(requester_id))
|
|
.into_query(),
|
|
))
|
|
.add(Expr::exists(
|
|
RoomAccess::find()
|
|
.filter(models::rooms::room_access::Column::Room.eq(room_id))
|
|
.filter(models::rooms::room_access::Column::User.eq(requester_id))
|
|
.into_query(),
|
|
)),
|
|
)
|
|
.order_by_asc(RmCol::Seq)
|
|
.limit(10000)
|
|
.all(&self.db)
|
|
.await
|
|
.map_err(|e| AgentError::Internal(e.to_string()))
|
|
}
|
|
}
|