From dfce52067fdbe1c7f59764ef4cd3fb2bfc056cc4 Mon Sep 17 00:00:00 2001 From: Dennis Fink Date: Wed, 19 Aug 2026 19:52:28 +0200 Subject: chore(core): format database migrations Apply the project formatting rules to the Alembic environment and existing migration files. Give the Webmention sender migration a descriptive filename and message. --- .../versions/681a2a9a1bc0_webmention_sender.py | 82 ++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 migrations/versions/681a2a9a1bc0_webmention_sender.py (limited to 'migrations/versions/681a2a9a1bc0_webmention_sender.py') diff --git a/migrations/versions/681a2a9a1bc0_webmention_sender.py b/migrations/versions/681a2a9a1bc0_webmention_sender.py new file mode 100644 index 0000000..29142af --- /dev/null +++ b/migrations/versions/681a2a9a1bc0_webmention_sender.py @@ -0,0 +1,82 @@ +"""Webmention sender + +Revision ID: 681a2a9a1bc0 +Revises: f63641044cc1 +Create Date: 2026-08-14 13:40:55.149604 + +""" + +import sqlalchemy as sa +from alembic import op + +# revision identifiers, used by Alembic. +revision = "681a2a9a1bc0" +down_revision = "f63641044cc1" +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.create_table( + "sources", + sa.Column("uuid", sa.Uuid(), nullable=False), + sa.Column("path", sa.Text(), nullable=False), + sa.Column("url", sa.Text(), nullable=False), + sa.Column("content_hash", sa.String(length=32), nullable=False), + sa.Column("revision", sa.Integer(), nullable=False), + sa.Column("last_seen_at", sa.DateTime(timezone=True), nullable=False), + sa.Column("revised_at", sa.DateTime(timezone=True), nullable=False), + sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True), + sa.PrimaryKeyConstraint("uuid"), + sa.UniqueConstraint("path"), + sa.UniqueConstraint("url"), + ) + op.create_table( + "sent_webmentions", + sa.Column("uuid", sa.Uuid(), nullable=False), + sa.Column("source_id", sa.Uuid(), nullable=False), + sa.Column("target", sa.Text(), nullable=False), + sa.Column("active", sa.Boolean(), nullable=False), + sa.Column("desired_revision", sa.Integer(), nullable=False), + sa.Column("processed_revision", sa.Integer(), nullable=True), + sa.Column("sent_revision", sa.Integer(), nullable=True), + sa.Column( + "status", + sa.Enum( + "sent", + "unsupported", + "failed", + name="sent_webmention_status", + native_enum=False, + ), + nullable=True, + ), + sa.Column("failure_reason", sa.Text(), nullable=True), + sa.Column("endpoint", sa.Text(), nullable=True), + sa.Column("response_status", sa.Integer(), nullable=True), + sa.Column("status_url", sa.Text(), nullable=True), + sa.Column("last_attempted_at", sa.DateTime(timezone=True), nullable=True), + sa.Column("last_sent_at", sa.DateTime(timezone=True), nullable=True), + sa.ForeignKeyConstraint(["source_id"], ["sources.uuid"], ondelete="CASCADE"), + sa.PrimaryKeyConstraint("uuid"), + sa.UniqueConstraint( + "source_id", "target", name="uq_sent_webmention_source_target" + ), + ) + with op.batch_alter_table("sent_webmentions", schema=None) as batch_op: + batch_op.create_index( + batch_op.f("ix_sent_webmentions_source_id"), ["source_id"], unique=False + ) + + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("sent_webmentions", schema=None) as batch_op: + batch_op.drop_index(batch_op.f("ix_sent_webmentions_source_id")) + + op.drop_table("sent_webmentions") + op.drop_table("sources") + # ### end Alembic commands ### -- cgit v1.3.1