hanami / events

[Experimental] Events framework for Hanami
MIT License
43 stars 7 forks source link

Transport library for events #18

Open davydovanton opened 7 years ago

davydovanton commented 7 years ago
class WebHandler < Hanami::Events::Handler
  on('user.created') { |payload| UserRepository.new.create(payload) }
  on('user.updated') { |payload| payload }
end

class AnaliticHandler < Hanami::Events::Handler
  on('*', AnaliticSender)
  on('user.*') { |payload| payload }
  on('user.signup') { |payload| payload }
end

class NotificationHandler < Hanami::Events::Handler
  on('user.created') { |payload| payload }
  on('post.created') { |payload| payload }
end

class UserEventRouting < Hanami::Events::Routing
  mount UserHandler
  mount AnaliticHandler
  mount NotificationHandler
end

class PostEventRouting < Hanami::Events::Routing
  mount UserHandler
  mount AnaliticHandler
  mount NotificationHandler
end

events = Hanami::Events.new(:kafka)
events.subscribe('user.*') { |event, payload| UserEventRouting.new(event, payload) }
events.subscribe('post.*') { |event, payload| PostEventRouting.new(event, payload) }
davydovanton commented 6 years ago

Just for idea,

maybe it will be better to make something like this:

events = Hanami::Events.initialize(:redis, redis: redis, logger: Logger.new(STDOUT))
class NotificationRunner < Hanami::Events::Runner
  on('user.created') { |payload| logger.info "Create user: #{payload}" }
  on('user.created') { |payload| logger.info "Send notification to user: #{payload}" }
  on('user.deleted') { |payload| logger.info 'start deleting'; sleep(10); logger.info "Delete user: #{payload}" }

  # or callable object
  on('user.updated', Container['notifications.user.updated'])
end

NotificationRunner.new(events).start