intermittent commit

This commit is contained in:
2026-07-14 13:22:09 +02:00
parent 420120af2f
commit f19350e65d
32 changed files with 11772 additions and 11 deletions

View File

@@ -0,0 +1,2 @@
"""Address module migration package."""

View File

@@ -0,0 +1,2 @@
"""Address module Alembic revisions."""

View File

@@ -0,0 +1,169 @@
"""v0.1.8 addresses baseline
Revision ID: b8c9d0e1f2a3
Revises: None
Create Date: 2026-07-13 00:00:00.000000
"""
from __future__ import annotations
from alembic import op
import sqlalchemy as sa
revision = "b8c9d0e1f2a3"
down_revision = None
branch_labels = None
depends_on = "4f2a9c8e7b6d"
def upgrade() -> None:
op.create_table(
"addresses_address_books",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("tenant_id", sa.String(length=36), nullable=True),
sa.Column("scope_type", sa.String(length=20), nullable=False),
sa.Column("scope_id", sa.String(length=36), nullable=True),
sa.Column("name", sa.String(length=255), nullable=False),
sa.Column("description", sa.Text(), nullable=True),
sa.Column("source_kind", sa.String(length=30), nullable=False),
sa.Column("source_ref", sa.String(length=1000), nullable=True),
sa.Column("read_only", sa.Boolean(), nullable=False),
sa.Column("sync_status", sa.String(length=30), nullable=True),
sa.Column("sync_error", sa.Text(), nullable=True),
sa.Column("created_by_account_id", sa.String(length=36), nullable=True),
sa.Column("updated_by_account_id", sa.String(length=36), nullable=True),
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_address_books")),
)
op.create_index(op.f("ix_addresses_address_books_created_by_account_id"), "addresses_address_books", ["created_by_account_id"], unique=False)
op.create_index(op.f("ix_addresses_address_books_deleted_at"), "addresses_address_books", ["deleted_at"], unique=False)
op.create_index("ix_addresses_address_books_scope", "addresses_address_books", ["tenant_id", "scope_type", "scope_id"], unique=False)
op.create_index(op.f("ix_addresses_address_books_scope_id"), "addresses_address_books", ["scope_id"], unique=False)
op.create_index(op.f("ix_addresses_address_books_scope_type"), "addresses_address_books", ["scope_type"], unique=False)
op.create_index(op.f("ix_addresses_address_books_source_kind"), "addresses_address_books", ["source_kind"], unique=False)
op.create_index(op.f("ix_addresses_address_books_tenant_id"), "addresses_address_books", ["tenant_id"], unique=False)
op.create_index(op.f("ix_addresses_address_books_updated_by_account_id"), "addresses_address_books", ["updated_by_account_id"], unique=False)
op.create_index(
"uq_addresses_address_books_active_name",
"addresses_address_books",
["tenant_id", "scope_type", "scope_id", "name"],
unique=True,
sqlite_where=sa.text("deleted_at IS NULL"),
postgresql_where=sa.text("deleted_at IS NULL"),
)
op.create_table(
"addresses_contacts",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("tenant_id", sa.String(length=36), nullable=True),
sa.Column("address_book_id", sa.String(length=36), nullable=False),
sa.Column("display_name", sa.String(length=255), nullable=False),
sa.Column("given_name", sa.String(length=255), nullable=True),
sa.Column("family_name", sa.String(length=255), nullable=True),
sa.Column("organization", sa.String(length=255), nullable=True),
sa.Column("role_title", sa.String(length=255), nullable=True),
sa.Column("note", sa.Text(), nullable=True),
sa.Column("tags", sa.JSON(), nullable=False),
sa.Column("source_kind", sa.String(length=30), nullable=False),
sa.Column("source_ref", sa.String(length=1000), nullable=True),
sa.Column("provenance", sa.JSON(), nullable=False),
sa.Column("created_by_account_id", sa.String(length=36), nullable=True),
sa.Column("updated_by_account_id", sa.String(length=36), nullable=True),
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["address_book_id"],
["addresses_address_books.id"],
name=op.f("fk_addresses_contacts_address_book_id_addresses_address_books"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_contacts")),
)
op.create_index(op.f("ix_addresses_contacts_address_book_id"), "addresses_contacts", ["address_book_id"], unique=False)
op.create_index("ix_addresses_contacts_book_name", "addresses_contacts", ["address_book_id", "display_name"], unique=False)
op.create_index(op.f("ix_addresses_contacts_created_by_account_id"), "addresses_contacts", ["created_by_account_id"], unique=False)
op.create_index(op.f("ix_addresses_contacts_deleted_at"), "addresses_contacts", ["deleted_at"], unique=False)
op.create_index(op.f("ix_addresses_contacts_display_name"), "addresses_contacts", ["display_name"], unique=False)
op.create_index(op.f("ix_addresses_contacts_organization"), "addresses_contacts", ["organization"], unique=False)
op.create_index(op.f("ix_addresses_contacts_source_kind"), "addresses_contacts", ["source_kind"], unique=False)
op.create_index(op.f("ix_addresses_contacts_tenant_id"), "addresses_contacts", ["tenant_id"], unique=False)
op.create_index("ix_addresses_contacts_tenant_name", "addresses_contacts", ["tenant_id", "display_name"], unique=False)
op.create_index(op.f("ix_addresses_contacts_updated_by_account_id"), "addresses_contacts", ["updated_by_account_id"], unique=False)
op.create_table(
"addresses_contact_emails",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("contact_id", sa.String(length=36), nullable=False),
sa.Column("label", sa.String(length=80), nullable=True),
sa.Column("email", sa.String(length=320), nullable=False),
sa.Column("is_primary", sa.Boolean(), nullable=False),
sa.Column("order_index", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(["contact_id"], ["addresses_contacts.id"], name=op.f("fk_addresses_contact_emails_contact_id_addresses_contacts"), ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_contact_emails")),
)
op.create_index(op.f("ix_addresses_contact_emails_contact_id"), "addresses_contact_emails", ["contact_id"], unique=False)
op.create_index("ix_addresses_contact_emails_contact_primary", "addresses_contact_emails", ["contact_id", "is_primary"], unique=False)
op.create_index(op.f("ix_addresses_contact_emails_email"), "addresses_contact_emails", ["email"], unique=False)
op.create_index("ix_addresses_contact_emails_lookup", "addresses_contact_emails", ["email"], unique=False)
op.create_table(
"addresses_contact_phones",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("contact_id", sa.String(length=36), nullable=False),
sa.Column("label", sa.String(length=80), nullable=True),
sa.Column("phone", sa.String(length=100), nullable=False),
sa.Column("is_primary", sa.Boolean(), nullable=False),
sa.Column("order_index", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(["contact_id"], ["addresses_contacts.id"], name=op.f("fk_addresses_contact_phones_contact_id_addresses_contacts"), ondelete="CASCADE"),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_contact_phones")),
)
op.create_index(op.f("ix_addresses_contact_phones_contact_id"), "addresses_contact_phones", ["contact_id"], unique=False)
op.create_index("ix_addresses_contact_phones_contact_primary", "addresses_contact_phones", ["contact_id", "is_primary"], unique=False)
op.create_table(
"addresses_contact_postal_addresses",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("contact_id", sa.String(length=36), nullable=False),
sa.Column("label", sa.String(length=80), nullable=True),
sa.Column("street", sa.String(length=500), nullable=True),
sa.Column("postal_code", sa.String(length=40), nullable=True),
sa.Column("locality", sa.String(length=255), nullable=True),
sa.Column("region", sa.String(length=255), nullable=True),
sa.Column("country", sa.String(length=255), nullable=True),
sa.Column("is_primary", sa.Boolean(), nullable=False),
sa.Column("order_index", sa.Integer(), nullable=False),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["contact_id"],
["addresses_contacts.id"],
name=op.f("fk_addresses_contact_postal_addresses_contact_id_addresses_contacts"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_contact_postal_addresses")),
)
op.create_index(op.f("ix_addresses_contact_postal_addresses_contact_id"), "addresses_contact_postal_addresses", ["contact_id"], unique=False)
op.create_index(
"ix_addresses_contact_postal_addresses_contact_primary",
"addresses_contact_postal_addresses",
["contact_id", "is_primary"],
unique=False,
)
def downgrade() -> None:
op.drop_table("addresses_contact_postal_addresses")
op.drop_table("addresses_contact_phones")
op.drop_table("addresses_contact_emails")
op.drop_table("addresses_contacts")
op.drop_table("addresses_address_books")

View File

@@ -0,0 +1,32 @@
"""v0.1.9 addresses source payload metadata
Revision ID: c9d0e1f2a4b
Revises: b8c9d0e1f2a3
Create Date: 2026-07-13 00:00:00.000000
"""
from __future__ import annotations
from alembic import op
import sqlalchemy as sa
revision = "c9d0e1f2a4b"
down_revision = "b8c9d0e1f2a3"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.add_column("addresses_contacts", sa.Column("source_payload_kind", sa.String(length=40), nullable=True))
op.add_column("addresses_contacts", sa.Column("source_payload_raw", sa.Text(), nullable=True))
op.add_column("addresses_contacts", sa.Column("source_revision", sa.String(length=255), nullable=True))
op.create_index(op.f("ix_addresses_contacts_source_payload_kind"), "addresses_contacts", ["source_payload_kind"], unique=False)
op.create_index(op.f("ix_addresses_contacts_source_revision"), "addresses_contacts", ["source_revision"], unique=False)
def downgrade() -> None:
op.drop_index(op.f("ix_addresses_contacts_source_revision"), table_name="addresses_contacts")
op.drop_index(op.f("ix_addresses_contacts_source_payload_kind"), table_name="addresses_contacts")
op.drop_column("addresses_contacts", "source_revision")
op.drop_column("addresses_contacts", "source_payload_raw")
op.drop_column("addresses_contacts", "source_payload_kind")

View File

@@ -0,0 +1,115 @@
"""addresses address lists
Revision ID: d0e1f2a4b5c
Revises: c9d0e1f2a4b
Create Date: 2026-07-13 00:00:00.000000
"""
from __future__ import annotations
from alembic import op
import sqlalchemy as sa
revision = "d0e1f2a4b5c"
down_revision = "c9d0e1f2a4b"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"addresses_address_lists",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("tenant_id", sa.String(length=36), nullable=True),
sa.Column("address_book_id", sa.String(length=36), nullable=False),
sa.Column("name", sa.String(length=255), nullable=False),
sa.Column("description", sa.Text(), nullable=True),
sa.Column("source_kind", sa.String(length=30), nullable=False),
sa.Column("source_ref", sa.String(length=1000), nullable=True),
sa.Column("read_only", sa.Boolean(), nullable=False),
sa.Column("created_by_account_id", sa.String(length=36), nullable=True),
sa.Column("updated_by_account_id", sa.String(length=36), nullable=True),
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["address_book_id"],
["addresses_address_books.id"],
name=op.f("fk_addresses_address_lists_address_book_id_addresses_address_books"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_address_lists")),
)
op.create_index(op.f("ix_addresses_address_lists_address_book_id"), "addresses_address_lists", ["address_book_id"], unique=False)
op.create_index("ix_addresses_address_lists_book_name", "addresses_address_lists", ["address_book_id", "name"], unique=False)
op.create_index(op.f("ix_addresses_address_lists_created_by_account_id"), "addresses_address_lists", ["created_by_account_id"], unique=False)
op.create_index(op.f("ix_addresses_address_lists_deleted_at"), "addresses_address_lists", ["deleted_at"], unique=False)
op.create_index(op.f("ix_addresses_address_lists_source_kind"), "addresses_address_lists", ["source_kind"], unique=False)
op.create_index(op.f("ix_addresses_address_lists_tenant_id"), "addresses_address_lists", ["tenant_id"], unique=False)
op.create_index(op.f("ix_addresses_address_lists_updated_by_account_id"), "addresses_address_lists", ["updated_by_account_id"], unique=False)
op.create_index(
"uq_addresses_address_lists_active_name",
"addresses_address_lists",
["address_book_id", "name"],
unique=True,
sqlite_where=sa.text("deleted_at IS NULL"),
postgresql_where=sa.text("deleted_at IS NULL"),
)
op.create_table(
"addresses_address_list_entries",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("address_list_id", sa.String(length=36), nullable=False),
sa.Column("contact_id", sa.String(length=36), nullable=False),
sa.Column("contact_email_id", sa.String(length=36), nullable=True),
sa.Column("contact_postal_address_id", sa.String(length=36), nullable=True),
sa.Column("target_kind", sa.String(length=30), nullable=False),
sa.Column("label", sa.String(length=255), nullable=True),
sa.Column("order_index", sa.Integer(), nullable=False),
sa.Column("metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["address_list_id"],
["addresses_address_lists.id"],
name=op.f("fk_addresses_address_list_entries_address_list_id_addresses_address_lists"),
ondelete="CASCADE",
),
sa.ForeignKeyConstraint(
["contact_email_id"],
["addresses_contact_emails.id"],
name=op.f("fk_addresses_address_list_entries_contact_email_id_addresses_contact_emails"),
ondelete="SET NULL",
),
sa.ForeignKeyConstraint(
["contact_id"],
["addresses_contacts.id"],
name=op.f("fk_addresses_address_list_entries_contact_id_addresses_contacts"),
ondelete="CASCADE",
),
sa.ForeignKeyConstraint(
["contact_postal_address_id"],
["addresses_contact_postal_addresses.id"],
name=op.f("fk_addresses_address_list_entries_contact_postal_address_id_addresses_contact_postal_addresses"),
ondelete="SET NULL",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_address_list_entries")),
)
op.create_index(op.f("ix_addresses_address_list_entries_address_list_id"), "addresses_address_list_entries", ["address_list_id"], unique=False)
op.create_index("ix_addresses_address_list_entries_contact", "addresses_address_list_entries", ["contact_id"], unique=False)
op.create_index(op.f("ix_addresses_address_list_entries_contact_email_id"), "addresses_address_list_entries", ["contact_email_id"], unique=False)
op.create_index(op.f("ix_addresses_address_list_entries_contact_id"), "addresses_address_list_entries", ["contact_id"], unique=False)
op.create_index(
op.f("ix_addresses_address_list_entries_contact_postal_address_id"),
"addresses_address_list_entries",
["contact_postal_address_id"],
unique=False,
)
op.create_index("ix_addresses_address_list_entries_list_order", "addresses_address_list_entries", ["address_list_id", "order_index"], unique=False)
op.create_index(op.f("ix_addresses_address_list_entries_target_kind"), "addresses_address_list_entries", ["target_kind"], unique=False)
def downgrade() -> None:
op.drop_table("addresses_address_list_entries")
op.drop_table("addresses_address_lists")

View File

@@ -0,0 +1,193 @@
"""addresses sync infrastructure
Revision ID: e1f2a4b5c6d
Revises: d0e1f2a4b5c
Create Date: 2026-07-14 00:00:00.000000
"""
from __future__ import annotations
from alembic import op
import sqlalchemy as sa
revision = "e1f2a4b5c6d"
down_revision = "d0e1f2a4b5c"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"addresses_sync_sources",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("tenant_id", sa.String(length=36), nullable=True),
sa.Column("address_book_id", sa.String(length=36), nullable=False),
sa.Column("connector_type", sa.String(length=60), nullable=False),
sa.Column("display_name", sa.String(length=255), nullable=False),
sa.Column("external_account_ref", sa.String(length=1000), nullable=True),
sa.Column("external_address_book_ref", sa.String(length=1000), nullable=True),
sa.Column("sync_direction", sa.String(length=30), nullable=False),
sa.Column("read_only", sa.Boolean(), nullable=False),
sa.Column("enabled", sa.Boolean(), nullable=False),
sa.Column("status", sa.String(length=30), nullable=False),
sa.Column("sync_token", sa.Text(), nullable=True),
sa.Column("etag", sa.String(length=1000), nullable=True),
sa.Column("remote_revision", sa.String(length=1000), nullable=True),
sa.Column("last_attempted_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("last_success_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("last_error", sa.Text(), nullable=True),
sa.Column("last_diagnostic", sa.JSON(), nullable=True),
sa.Column("created_by_account_id", sa.String(length=36), nullable=True),
sa.Column("updated_by_account_id", sa.String(length=36), nullable=True),
sa.Column("metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["address_book_id"],
["addresses_address_books.id"],
name=op.f("fk_addresses_sync_sources_address_book_id_addresses_address_books"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_sync_sources")),
)
op.create_index(op.f("ix_addresses_sync_sources_address_book_id"), "addresses_sync_sources", ["address_book_id"], unique=False)
op.create_index("ix_addresses_sync_sources_book_status", "addresses_sync_sources", ["address_book_id", "status"], unique=False)
op.create_index("ix_addresses_sync_sources_connector", "addresses_sync_sources", ["tenant_id", "connector_type"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_connector_type"), "addresses_sync_sources", ["connector_type"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_created_by_account_id"), "addresses_sync_sources", ["created_by_account_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_enabled"), "addresses_sync_sources", ["enabled"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_last_attempted_at"), "addresses_sync_sources", ["last_attempted_at"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_last_success_at"), "addresses_sync_sources", ["last_success_at"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_status"), "addresses_sync_sources", ["status"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_sync_direction"), "addresses_sync_sources", ["sync_direction"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_tenant_id"), "addresses_sync_sources", ["tenant_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_sources_updated_by_account_id"), "addresses_sync_sources", ["updated_by_account_id"], unique=False)
op.create_table(
"addresses_sync_tombstones",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("tenant_id", sa.String(length=36), nullable=True),
sa.Column("sync_source_id", sa.String(length=36), nullable=False),
sa.Column("address_book_id", sa.String(length=36), nullable=False),
sa.Column("contact_id", sa.String(length=36), nullable=True),
sa.Column("remote_uid", sa.String(length=1000), nullable=True),
sa.Column("resource_href", sa.String(length=1000), nullable=True),
sa.Column("local_deleted_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("remote_deleted_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("synced_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["address_book_id"],
["addresses_address_books.id"],
name=op.f("fk_addresses_sync_tombstones_address_book_id_addresses_address_books"),
ondelete="CASCADE",
),
sa.ForeignKeyConstraint(
["contact_id"],
["addresses_contacts.id"],
name=op.f("fk_addresses_sync_tombstones_contact_id_addresses_contacts"),
ondelete="SET NULL",
),
sa.ForeignKeyConstraint(
["sync_source_id"],
["addresses_sync_sources.id"],
name=op.f("fk_addresses_sync_tombstones_sync_source_id_addresses_sync_sources"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_sync_tombstones")),
)
op.create_index(op.f("ix_addresses_sync_tombstones_address_book_id"), "addresses_sync_tombstones", ["address_book_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_tombstones_contact_id"), "addresses_sync_tombstones", ["contact_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_tombstones_local_deleted_at"), "addresses_sync_tombstones", ["local_deleted_at"], unique=False)
op.create_index(op.f("ix_addresses_sync_tombstones_remote_deleted_at"), "addresses_sync_tombstones", ["remote_deleted_at"], unique=False)
op.create_index(op.f("ix_addresses_sync_tombstones_synced_at"), "addresses_sync_tombstones", ["synced_at"], unique=False)
op.create_index("ix_addresses_sync_tombstones_source_href", "addresses_sync_tombstones", ["sync_source_id", "resource_href"], unique=False)
op.create_index("ix_addresses_sync_tombstones_source_remote", "addresses_sync_tombstones", ["sync_source_id", "remote_uid"], unique=False)
op.create_index(op.f("ix_addresses_sync_tombstones_sync_source_id"), "addresses_sync_tombstones", ["sync_source_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_tombstones_tenant_id"), "addresses_sync_tombstones", ["tenant_id"], unique=False)
op.create_table(
"addresses_sync_conflicts",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("tenant_id", sa.String(length=36), nullable=True),
sa.Column("sync_source_id", sa.String(length=36), nullable=False),
sa.Column("address_book_id", sa.String(length=36), nullable=False),
sa.Column("contact_id", sa.String(length=36), nullable=True),
sa.Column("remote_uid", sa.String(length=1000), nullable=True),
sa.Column("resource_href", sa.String(length=1000), nullable=True),
sa.Column("field_path", sa.String(length=500), nullable=False),
sa.Column("local_value", sa.JSON(), nullable=True),
sa.Column("remote_value", sa.JSON(), nullable=True),
sa.Column("local_updated_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("remote_updated_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("status", sa.String(length=30), nullable=False),
sa.Column("resolution", sa.String(length=60), nullable=True),
sa.Column("resolved_at", sa.DateTime(timezone=True), nullable=True),
sa.Column("resolved_by_account_id", sa.String(length=36), nullable=True),
sa.Column("metadata", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["address_book_id"],
["addresses_address_books.id"],
name=op.f("fk_addresses_sync_conflicts_address_book_id_addresses_address_books"),
ondelete="CASCADE",
),
sa.ForeignKeyConstraint(
["contact_id"],
["addresses_contacts.id"],
name=op.f("fk_addresses_sync_conflicts_contact_id_addresses_contacts"),
ondelete="SET NULL",
),
sa.ForeignKeyConstraint(
["sync_source_id"],
["addresses_sync_sources.id"],
name=op.f("fk_addresses_sync_conflicts_sync_source_id_addresses_sync_sources"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_sync_conflicts")),
)
op.create_index(op.f("ix_addresses_sync_conflicts_address_book_id"), "addresses_sync_conflicts", ["address_book_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_conflicts_contact_id"), "addresses_sync_conflicts", ["contact_id"], unique=False)
op.create_index("ix_addresses_sync_conflicts_contact_status", "addresses_sync_conflicts", ["contact_id", "status"], unique=False)
op.create_index(op.f("ix_addresses_sync_conflicts_resolved_at"), "addresses_sync_conflicts", ["resolved_at"], unique=False)
op.create_index(op.f("ix_addresses_sync_conflicts_resolved_by_account_id"), "addresses_sync_conflicts", ["resolved_by_account_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_conflicts_status"), "addresses_sync_conflicts", ["status"], unique=False)
op.create_index("ix_addresses_sync_conflicts_source_status", "addresses_sync_conflicts", ["sync_source_id", "status"], unique=False)
op.create_index(op.f("ix_addresses_sync_conflicts_sync_source_id"), "addresses_sync_conflicts", ["sync_source_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_conflicts_tenant_id"), "addresses_sync_conflicts", ["tenant_id"], unique=False)
op.create_table(
"addresses_sync_diagnostics",
sa.Column("id", sa.String(length=36), nullable=False),
sa.Column("tenant_id", sa.String(length=36), nullable=True),
sa.Column("sync_source_id", sa.String(length=36), nullable=False),
sa.Column("severity", sa.String(length=30), nullable=False),
sa.Column("code", sa.String(length=120), nullable=False),
sa.Column("message", sa.Text(), nullable=False),
sa.Column("details", sa.JSON(), nullable=True),
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
sa.ForeignKeyConstraint(
["sync_source_id"],
["addresses_sync_sources.id"],
name=op.f("fk_addresses_sync_diagnostics_sync_source_id_addresses_sync_sources"),
ondelete="CASCADE",
),
sa.PrimaryKeyConstraint("id", name=op.f("pk_addresses_sync_diagnostics")),
)
op.create_index(op.f("ix_addresses_sync_diagnostics_code"), "addresses_sync_diagnostics", ["code"], unique=False)
op.create_index(op.f("ix_addresses_sync_diagnostics_severity"), "addresses_sync_diagnostics", ["severity"], unique=False)
op.create_index("ix_addresses_sync_diagnostics_source_created", "addresses_sync_diagnostics", ["sync_source_id", "created_at"], unique=False)
op.create_index("ix_addresses_sync_diagnostics_source_severity", "addresses_sync_diagnostics", ["sync_source_id", "severity"], unique=False)
op.create_index(op.f("ix_addresses_sync_diagnostics_sync_source_id"), "addresses_sync_diagnostics", ["sync_source_id"], unique=False)
op.create_index(op.f("ix_addresses_sync_diagnostics_tenant_id"), "addresses_sync_diagnostics", ["tenant_id"], unique=False)
def downgrade() -> None:
op.drop_table("addresses_sync_diagnostics")
op.drop_table("addresses_sync_conflicts")
op.drop_table("addresses_sync_tombstones")
op.drop_table("addresses_sync_sources")