use serde::{Deserialize, Serialize};
use crate::service::moments::models::{
CommentEvent, PostEvent, PostStatisticsEvent, ReactionEvent,
};
pub struct EventsService {
}
impl EventsService {
pub fn new() -> Self {
Self {}
}
}
impl Default for EventsService {
fn default() -> Self {
Self::new()
}
}
pub trait PostEventHandler {
fn handle_post_created(&self, event: PostEvent);
fn handle_post_deleted(&self, event: PostEvent);
}
pub trait CommentEventHandler {
fn handle_comment_created(&self, event: CommentEvent);
fn handle_comment_deleted(&self, event: CommentEvent);
}
pub trait ReactionEventHandler {
fn handle_reaction_created(&self, event: ReactionEvent);
fn handle_reaction_deleted(&self, event: ReactionEvent);
}
pub trait PostStatisticsEventHandler {
fn handle_post_statistics_updated(&self, event: PostStatisticsEvent);
}
pub trait MomentsEventHandler:
PostEventHandler + CommentEventHandler + ReactionEventHandler + PostStatisticsEventHandler
{
fn get_handler_name(&self) -> &str {
"MomentsEventHandler"
}
}
#[derive(Debug, Serialize, Deserialize)]
pub enum MomentsEventType {
PostCreated,
PostDeleted,
CommentCreated,
CommentDeleted,
ReactionCreated,
ReactionDeleted,
PostStatisticsUpdated,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "event_type")]
pub enum MomentsEvent {
#[serde(rename = "post_created")]
PostCreated { event: PostEvent },
#[serde(rename = "post_deleted")]
PostDeleted { event: PostEvent },
#[serde(rename = "comment_created")]
CommentCreated { event: CommentEvent },
#[serde(rename = "comment_deleted")]
CommentDeleted { event: CommentEvent },
#[serde(rename = "reaction_created")]
ReactionCreated { event: ReactionEvent },
#[serde(rename = "reaction_deleted")]
ReactionDeleted { event: ReactionEvent },
#[serde(rename = "post_statistics_updated")]
PostStatisticsUpdated { event: PostStatisticsEvent },
}
pub struct MomentsEventDispatcher<H>
where
H: MomentsEventHandler,
{
handler: H,
}
impl<H> MomentsEventDispatcher<H>
where
H: MomentsEventHandler,
{
pub fn new(handler: H) -> Self {
Self { handler }
}
pub fn dispatch_event(&self, event: MomentsEvent) {
match event {
MomentsEvent::PostCreated { event } => {
self.handler.handle_post_created(event);
}
MomentsEvent::PostDeleted { event } => {
self.handler.handle_post_deleted(event);
}
MomentsEvent::CommentCreated { event } => {
self.handler.handle_comment_created(event);
}
MomentsEvent::CommentDeleted { event } => {
self.handler.handle_comment_deleted(event);
}
MomentsEvent::ReactionCreated { event } => {
self.handler.handle_reaction_created(event);
}
MomentsEvent::ReactionDeleted { event } => {
self.handler.handle_reaction_deleted(event);
}
MomentsEvent::PostStatisticsUpdated { event } => {
self.handler.handle_post_statistics_updated(event);
}
}
}
pub fn get_handler(&self) -> &H {
&self.handler
}
}
pub struct DefaultMomentsEventHandler {
pub name: String,
}
impl DefaultMomentsEventHandler {
pub fn new(name: String) -> Self {
Self { name }
}
}
impl PostEventHandler for DefaultMomentsEventHandler {
fn handle_post_created(&self, event: PostEvent) {
log::info!(
"[{}] 处理帖子发布事件: post_id={:?}, author_id={:?}",
self.name,
event.post.as_ref().and_then(|p| p.post_id.as_ref()),
event.post.as_ref().and_then(|p| p.author_id.as_ref())
);
}
fn handle_post_deleted(&self, event: PostEvent) {
log::info!(
"[{}] 处理帖子删除事件: post_id={:?}, operator_id={:?}",
self.name,
event.post.as_ref().and_then(|p| p.post_id.as_ref()),
event.operator_id
);
}
}
impl CommentEventHandler for DefaultMomentsEventHandler {
fn handle_comment_created(&self, event: CommentEvent) {
log::info!(
"[{}] 处理评论发布事件: comment_id={:?}, post_id={:?}",
self.name,
event.comment.as_ref().and_then(|c| c.comment_id.as_ref()),
event.comment.as_ref().and_then(|c| c.post_id.as_ref())
);
}
fn handle_comment_deleted(&self, event: CommentEvent) {
log::info!(
"[{}] 处理评论删除事件: comment_id={:?}, operator_id={:?}",
self.name,
event.comment.as_ref().and_then(|c| c.comment_id.as_ref()),
event.operator_id
);
}
}
impl ReactionEventHandler for DefaultMomentsEventHandler {
fn handle_reaction_created(&self, event: ReactionEvent) {
log::info!(
"[{}] 处理表情互动事件: reaction_type={:?}, post_id={:?}",
self.name,
event
.reaction
.as_ref()
.and_then(|r| r.reaction_type.as_ref()),
event.reaction.as_ref().and_then(|r| r.post_id.as_ref())
);
}
fn handle_reaction_deleted(&self, event: ReactionEvent) {
log::info!(
"[{}] 处理取消表情互动事件: reaction_type={:?}, post_id={:?}",
self.name,
event
.reaction
.as_ref()
.and_then(|r| r.reaction_type.as_ref()),
event.reaction.as_ref().and_then(|r| r.post_id.as_ref())
);
}
}
impl PostStatisticsEventHandler for DefaultMomentsEventHandler {
fn handle_post_statistics_updated(&self, event: PostStatisticsEvent) {
log::info!(
"[{}] 处理帖子统计数据变更事件: post_id={:?}",
self.name,
event.post_id
);
}
}
impl MomentsEventHandler for DefaultMomentsEventHandler {
fn get_handler_name(&self) -> &str {
&self.name
}
}