project.py
def loki(service: str) -> LokiLogs:
return LokiLogs(LokiConfig(selector=f'{{service="{service}"}}'), url_env='LOKI_URL', token_env='LOKI_TOKEN')
project = Project('production', state_path='/state/kinro.db')
project.service('orders', loki('orders'), keys={'order': Field('uid', normalize=str.lower)}, redact=['email'])
project.service('shipping', loki('shipping'))
project.db('orders_db', url_env='ORDERS_DB_URL', pgbouncer=True)
CREATED = on('orders', 'order.created')
PAID = on('billing', 'payment.captured')
SHIPPED = on('shipping', 'shipment.created')
project.add(
chain('order_flow', key='order', steps=[CREATED, PAID, SHIPPED], within=timedelta(minutes=30)),
no_duplicates('single_payment', key='order', trigger=PAID, within=timedelta(hours=1)),
ordering('paid_before_shipped', key='order', first=PAID, then=SHIPPED),
status_desync('order_status_in_db', key='order', trigger=on('orders', 'order.status_changed'),
field='status', db='orders_db', settle=timedelta(seconds=60),
lookup='SELECT uid AS key, status, updated_at FROM orders WHERE uid = ANY(:keys)'),
)