krz/hutch-stats

Server-side utility for calculating contributions for sourcehut users.

clone: git clone https://gitbay.org/krz/hutch-stats.git

main: alembic/versions/20260411_0003_backfill_state.py · raw

 1"""actor and service backfill state"""
 2
 3from __future__ import annotations
 4
 5from alembic import op
 6import sqlalchemy as sa
 7from sqlalchemy import inspect
 8
 9
10revision = "20260411_0003"
11down_revision = "20260411_0002"
12branch_labels = None
13depends_on = None
14
15
16def _table_names() -> set[str]:
17    return set(inspect(op.get_bind()).get_table_names())
18
19
20def _column_names(table_name: str) -> set[str]:
21    return {column["name"] for column in inspect(op.get_bind()).get_columns(table_name)}
22
23
24def upgrade() -> None:
25    if "tracked_actors" in _table_names():
26        columns = _column_names("tracked_actors")
27        if "backfill_status" not in columns:
28            op.add_column("tracked_actors", sa.Column("backfill_status", sa.String(length=32), nullable=True))
29            op.execute(sa.text("UPDATE tracked_actors SET backfill_status = 'pending' WHERE backfill_status IS NULL"))
30        if "backfill_started_at" not in columns:
31            op.add_column("tracked_actors", sa.Column("backfill_started_at", sa.DateTime(timezone=True), nullable=True))
32        if "backfill_completed_at" not in columns:
33            op.add_column("tracked_actors", sa.Column("backfill_completed_at", sa.DateTime(timezone=True), nullable=True))
34        if "last_backfill_error" not in columns:
35            op.add_column("tracked_actors", sa.Column("last_backfill_error", sa.Text(), nullable=True))
36
37    if "service_backfill_states" not in _table_names():
38        op.create_table(
39            "service_backfill_states",
40            sa.Column("id", sa.Integer(), primary_key=True),
41            sa.Column("actor", sa.String(length=255), nullable=False),
42            sa.Column("service", sa.String(length=32), nullable=False),
43            sa.Column("cursor_json", sa.JSON(), nullable=True),
44            sa.Column("status", sa.String(length=32), nullable=False),
45            sa.Column("started_at", sa.DateTime(timezone=True), nullable=True),
46            sa.Column("completed_at", sa.DateTime(timezone=True), nullable=True),
47            sa.Column("last_error", sa.Text(), nullable=True),
48            sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
49            sa.UniqueConstraint("actor", "service", name="uq_service_backfill_state_actor_service"),
50        )
51
52
53def downgrade() -> None:
54    if "service_backfill_states" in _table_names():
55        op.drop_table("service_backfill_states")