creation projection workinggg

This commit is contained in:
counterweight 2025-06-15 00:56:00 +02:00
parent 35f551949e
commit e2850da787
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
3 changed files with 61 additions and 4 deletions

View file

@ -30,7 +30,7 @@ def upgrade() -> None:
),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("deleted_at", sa.DateTime(timezone=True)),
sa.Column("last_event_id", sa.UUID(as_uuid=True), nullable=False, unique=True),
sa.Column(
"last_event_sequence",
@ -45,6 +45,61 @@ def upgrade() -> None:
sa.PrimaryKeyConstraint("id"),
)
op.execute(
"""
create or replace function fn_project_user_created(event_id uuid, event_sequence integer, event_timestamp timestamptz, event jsonb) returns uuid
security definer
language plpgsql as $$
declare result uuid;
begin
insert into users(
id,
created_at,
updated_at,
last_event_id,
last_event_sequence,
name,
age,
hair_color
)
values(
cast(event->'event_payload'->>'id' as UUID),
event_timestamp,
event_timestamp,
event_id,
event_sequence,
event->'event_payload'->>'name',
cast(event->'event_payload'->>'age' as INTEGER),
event->'event_payload'->>'hair_color'
)
returning id into result;
return result;
end;
$$;
create or replace function fn_trigger_user_created() returns trigger
security definer
language plpgsql
as $$
begin
perform fn_project_user_created(
new.id,
new.sequence,
new.created_at,
new.event_payload
);
return new;
end;
$$;
create trigger event_insert_user_created
after insert on user_events
for each row
when ((new.event_payload->>'event_type') = 'user_created')
execute procedure fn_trigger_user_created();
"""
)
def downgrade() -> None:
"""Downgrade schema."""

View file

@ -65,7 +65,7 @@ class CreateUserEvent:
return json.dumps(
{
"event_type": "user_created",
"payload": {
"event_payload": {
"id": self._user.id,
"name": self._user.name,
"age": self._user.age,
@ -84,7 +84,7 @@ class UpdateUserEvent:
return json.dumps(
{
"event_type": "user_updated",
"payload": {
"event_payload": {
"id": self._user.id,
"name": self._user.name,
"age": self._user.age,
@ -103,7 +103,7 @@ class DeleteUserEvent:
return json.dumps(
{
"event_type": "user_deleted",
"payload": {"id": self._user.id},
"event_payload": {"id": self._user.id},
},
default=str,
)

View file

@ -1,5 +1,7 @@
docker compose down
docker compose up -d
sleep 2s
echo "Running migrations"
alembic upgrade head
echo "Creating events"
python3 create_events.py