hanami / events

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

Introduce typed event payload #64

Open badenkov opened 6 years ago

badenkov commented 6 years ago

Hello!

I found interesting example in presentation of Nikita Shilnikov

module Events
  class PasswordChanged < Dry::Struct
    attribute :user_id, Types::UUID
    attribute :password, Types::String
  end

  class EmailChanged < Dry::Struct
    attribute :user_id, Types::UUID
    attribute :email, Types::String
  end

  Updated = PasswordChanged | EmailChanged
end

What do you think to use Dry::Struct for events?

IMHO it will make an application (where you will use events) more clear, we will see all possible events, and that events will have guaranteed shape.

davydovanton commented 6 years ago

Hello! Yep, I forgot to create issue for this but in future we want to use types for each event and use it like this:

events = Hanami::Events.initialize(:memory_sync)
events.subscribe('user.created') do |event_data|
 event_data # => object
end

Thanks for this issue! 👍

badenkov commented 6 years ago

It's a good news:)

Maybe would better:

module Events
  class UserCreated < Dry::Struct
    attribute :user_id, Types::UUID
    attribute :first_name, Types::String
   attribute :first_name, Types::String
  end
end

events.subscribe(Events::UserCreated) do |event_data|
 event_data # => object
end

What do you think?

davydovanton commented 6 years ago

so, I thought about something like this:

Event

class Users::Events::PasswordChanged < Hanami::Event::Type
  event_name 'user.password_changed'

  attribute :user_id, Types::UUID
  attribute :password, Types::String
end

Broadcaster

password_changed = Users::Events::PasswordChanged.new(payload)
events.broadcast(password_changed)

Subscriber

events.subscribe(Users::Events::PasswordChanged) do |object|
  object # => Users::Events::PasswordChanged
end

But it's just a idea now. Maybe we found better (from code and developer API) way how to build it ¯\_(ツ)_/¯

badenkov commented 6 years ago

That looks good. I liked it. Thanks for answers!

smakagon commented 6 years ago

@davydovanton @badenkov I like the idea of typed events. I've added PR with implementation. Let me know what you guys think about it.