Skip to content

use middleware to intercept event handlers (global event, database management, ...)#471

Merged
ramedina86 merged 7 commits intowriter:devfrom
FabienArcellier:50-use-middleware-to-intercept-event-handlers-for-database-session-management
Jun 24, 2024
Merged

use middleware to intercept event handlers (global event, database management, ...)#471
ramedina86 merged 7 commits intowriter:devfrom
FabienArcellier:50-use-middleware-to-intercept-event-handlers-for-database-session-management

Conversation

@FabienArcellier
Copy link
Contributor

@FabienArcellier FabienArcellier commented Jun 19, 2024

This PR implements the concept of middleware. Middleware is a function that intercepts all events. You can use it to implement session management for a database, code an extension to streamsync which globally modifies the operation of certain events, ...

Peek 2024-06-19 23-20

# MIDDLEWARES
@wf.middleware()
def count_events(state):
    state['counter_event'] += 1
    yield

@wf.middleware()
def count_specific_events(state, context):
    event_type = context.get('event')
    if event_type == 'wf-click':
        state['counter_event_click'] += 1

    if event_type == 'wf-option-change':
        state['counter_event_select'] += 1

    yield

Usecase

middleware facilitates cross-functional operations such as database transaction management. Opening a session at the start of a query is a pattern that improves the use of a database. The session links the transaction to the request. If processing fails, the transaction is rolled back. If it succeeds, the transaction is successful.

import writer as wf

engine = sa.create_engine("postgresql://admin:admin@localhost/Adventureworks", echo=True)
Session = sessionmaker(engine)

@wf.middleware
def manage_sqlalchemy_session():
    with Session() as session:
        session.begin()
        try:
            yield
            session.commit()
        except:
            session.rollback()
            raise

middleware facilitates cross-functional operations such as exception tracking.

import writer as wf

@wf.middleware
def manage_sentry_capture(state, payload):
    with sentry_sdk.configure_scope() as scope:
        scope.set_tag("site", state['site'])
        try:
            yield
        except Exception as exception:
            sentry_sdk.capture(exception)
            raise
        finally:
            scope.clear()

…gement, ...)

* refact: build fixture to init session
* refact: add load ability on setup_app_runner
…gement, ...)

* refact: extract execute handler
…gement, ...)

* feat: implement middleware execution
…gement, ...)

* feat: implement event type in context
@FabienArcellier FabienArcellier force-pushed the 50-use-middleware-to-intercept-event-handlers-for-database-session-management branch from 192ea64 to 13ac109 Compare June 24, 2024 13:41
@FabienArcellier FabienArcellier force-pushed the 50-use-middleware-to-intercept-event-handlers-for-database-session-management branch from 13ac109 to b1a1bed Compare June 24, 2024 14:04
…gement, ...)

* feat: use pattern to handle exceptions
* feat: allow middleware without yield
@FabienArcellier FabienArcellier force-pushed the 50-use-middleware-to-intercept-event-handlers-for-database-session-management branch 2 times, most recently from 6c854f2 to 76c8781 Compare June 24, 2024 15:04
…gement, ...)

* feat: use pattern to handle exceptions
* feat: allow middleware without yield
* docs: describe the implementation of middlewares
@FabienArcellier FabienArcellier force-pushed the 50-use-middleware-to-intercept-event-handlers-for-database-session-management branch from 76c8781 to b7caf3d Compare June 24, 2024 15:07
@ramedina86 ramedina86 merged commit 74eef7e into writer:dev Jun 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants