use std::sync::Arc;
use async_trait::async_trait;
use backbone_core::trigger::{
ActionExecutor, TriggerContext, TriggerContextMut, TriggerEvent, TriggerHandler, TriggerRegistry,
};
use crate::domain::entity::UserQuota;
pub type UserQuotaTriggerEvent = TriggerEvent;
pub type UserQuotaTriggerContext = TriggerContext<UserQuota>;
pub type UserQuotaTriggerContextMut = TriggerContextMut<UserQuota>;
pub type UserQuotaActionExecutor = ActionExecutor;
pub type UserQuotaTriggerRegistry = TriggerRegistry<UserQuota>;
pub type UserQuotaTriggerHandlerObj =
dyn TriggerHandler<TriggerContext<UserQuota>, TriggerEvent>;
pub struct UserQuotaBeforeCreateHandler1 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaBeforeCreateHandler1 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaBeforeCreateHandler1 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::BeforeCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct UserQuotaAfterCreateHandler2 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler2 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler2 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
if let Some(publisher) = &self.event_publisher {
publisher.publish_created(ctx.entity.clone(), ctx.user_id.clone()).await?;
}
Ok(())
}
}
pub struct UserQuotaAfterCreateHandler3 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler3 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler3 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct UserQuotaAfterCreateHandler4 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler4 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler4 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(executor) = &self.action_executor {
executor.send_email(ctx, "default").await?;
}
if let Some(executor) = &self.action_executor {
executor.notify(ctx, "default").await?;
}
tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
if let Some(_publisher) = &self.event_publisher {
}
Ok(())
}
}
pub struct UserQuotaAfterCreateHandler5 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler5 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler5 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct UserQuotaAfterCreateHandler6 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler6 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler6 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct UserQuotaAfterCreateHandler7 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler7 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler7 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct UserQuotaAfterCreateHandler8 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler8 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler8 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct UserQuotaAfterCreateHandler9 {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaAfterCreateHandler9 {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
pub fn with_event_publisher(mut self, publisher: Arc<crate::domain::event::UserQuotaEventPublisher>) -> Self {
self.event_publisher = Some(publisher);
self
}
pub fn with_action_executor(mut self, executor: Arc<UserQuotaActionExecutor>) -> Self {
self.action_executor = Some(executor);
self
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaAfterCreateHandler9 {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::AfterCreate]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; Ok(())
}
}
pub struct UserQuotaOnEnterNormalHandler {}
impl UserQuotaOnEnterNormalHandler {
pub fn new() -> Self { Self {} }
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaOnEnterNormalHandler {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::OnEnterState("normal".to_string())]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
Ok(())
}
}
pub struct UserQuotaOnEnterExceededHandler {
pub event_publisher: Option<Arc<crate::domain::event::UserQuotaEventPublisher>>,
pub action_executor: Option<Arc<UserQuotaActionExecutor>>,
}
impl UserQuotaOnEnterExceededHandler {
pub fn new() -> Self {
Self {
event_publisher: None,
action_executor: None,
}
}
}
#[async_trait]
impl TriggerHandler<UserQuotaTriggerContext, UserQuotaTriggerEvent> for UserQuotaOnEnterExceededHandler {
fn events(&self) -> Vec<UserQuotaTriggerEvent> {
vec![TriggerEvent::OnEnterState("exceeded".to_string())]
}
async fn handle(&self, ctx: &UserQuotaTriggerContext) -> anyhow::Result<()> {
let _ = &ctx; if let Some(executor) = &self.action_executor {
executor.notify(ctx, "default").await?;
}
if let Some(executor) = &self.action_executor {
executor.send_email(ctx, "default").await?;
}
tracing::info!("Trigger executed for entity: {:?}", ctx.entity.id);
if let Some(_publisher) = &self.event_publisher {
}
Ok(())
}
}
pub fn user_quota_trigger_registry() -> UserQuotaTriggerRegistry {
TriggerRegistry::build(|r| {
r.register(Arc::new(UserQuotaBeforeCreateHandler1::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler2::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler3::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler4::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler5::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler6::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler7::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler8::new()));
r.register(Arc::new(UserQuotaAfterCreateHandler9::new()));
r.register(Arc::new(UserQuotaOnEnterNormalHandler::new()));
r.register(Arc::new(UserQuotaOnEnterExceededHandler::new()));
})
}