use std::collections::HashMap;
use async_trait::async_trait;
use modkit_db::secure::DBRunner;
use modkit_macros::domain_model;
use modkit_security::AccessScope;
use uuid::Uuid;
use crate::domain::error::DomainError;
use crate::domain::models::ReactionKind;
use crate::infra::db::entity::message_reaction::Model as ReactionModel;
#[domain_model]
pub struct UpsertReactionParams {
pub id: Uuid,
pub tenant_id: Uuid,
pub message_id: Uuid,
pub user_id: Uuid,
pub reaction: ReactionKind,
}
#[async_trait]
pub trait ReactionRepository: Send + Sync {
async fn upsert<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
params: UpsertReactionParams,
) -> Result<ReactionModel, DomainError>;
async fn batch_by_user<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
message_ids: &[Uuid],
user_id: Uuid,
) -> Result<HashMap<Uuid, ReactionKind>, DomainError>;
async fn delete_by_message_and_user<C: DBRunner>(
&self,
runner: &C,
scope: &AccessScope,
message_id: Uuid,
user_id: Uuid,
) -> Result<bool, DomainError>;
}