# Event subscribers

Events in Guillotina are heavily influenced from zope events with the caveat
in that we support async event handlers.

For our chat application, we want to make sure every user that is part of a
conversation has permission to add new messages and view other messages.

A simple way to do this is with an event handler that modifies permissions.

A an `subscribers.py` file inside your application.


```python
from guillotina import configure
from guillotina.interfaces import (IObjectAddedEvent, IObjectModifiedEvent,
                                   IPrincipalRoleManager)
from guillotina.utils import get_authenticated_user_id

from guillotina_chat.content import IConversation


@configure.subscriber(for_=(IConversation, IObjectAddedEvent))
@configure.subscriber(for_=(IConversation, IObjectModifiedEvent))
async def container_changed(conversation, event):
    user_id = get_authenticated_user_id()
    if user_id not in conversation.users:
        conversation.users.append(user_id)

    manager = IPrincipalRoleManager(conversation)
    for user in conversation.users:
        manager.assign_role_to_principal(
            'guillotina_chat.ConversationParticipant', user)

```


In order for Guillotina to detect your configuration, you'll need to add
a scan call inside your `includeme` function in the `__init__.py` file.


```python
from guillotina import configure
configure.scan('guillotina_chat.subscribers')
```


## Test it out

Using Postman, add a Conversation and then a Message to that conversation
and then use the `@sharing` endpoint to inspect the assigned permissions.
