feat: initialize governed postbox module
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""Postbox release migration lineage."""
|
||||
+798
@@ -0,0 +1,798 @@
|
||||
"""v0.1.0 Postbox baseline
|
||||
|
||||
Revision ID: c7d2e5f8a1b4
|
||||
Revises: None
|
||||
Depends on: 8f9a0b1c2d3e
|
||||
Create Date: 2026-07-28 00:00:00.000000
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
revision = "c7d2e5f8a1b4"
|
||||
down_revision = None
|
||||
branch_labels = None
|
||||
depends_on = "8f9a0b1c2d3e"
|
||||
|
||||
|
||||
def _timestamps() -> tuple[sa.Column, sa.Column]:
|
||||
return (
|
||||
sa.Column("created_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("updated_at", sa.DateTime(timezone=True), nullable=False),
|
||||
)
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
op.create_table(
|
||||
"postbox_templates",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("slug", sa.String(length=120), nullable=False),
|
||||
sa.Column("name", sa.String(length=250), nullable=False),
|
||||
sa.Column("description", sa.Text(), nullable=True),
|
||||
sa.Column("status", sa.String(length=24), nullable=False),
|
||||
sa.Column("current_revision", sa.Integer(), nullable=False),
|
||||
sa.Column("published_revision_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("created_by", sa.String(length=255), nullable=True),
|
||||
sa.Column("updated_by", sa.String(length=255), nullable=True),
|
||||
sa.Column("retired_at", sa.DateTime(timezone=True), nullable=True),
|
||||
*_timestamps(),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_templates")),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"slug",
|
||||
name="uq_postbox_templates_tenant_slug",
|
||||
),
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_postbox_templates_tenant_id"),
|
||||
"postbox_templates",
|
||||
["tenant_id"],
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_postbox_templates_status"),
|
||||
"postbox_templates",
|
||||
["status"],
|
||||
)
|
||||
op.create_index(
|
||||
op.f("ix_postbox_templates_published_revision_id"),
|
||||
"postbox_templates",
|
||||
["published_revision_id"],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_templates_tenant_status",
|
||||
"postbox_templates",
|
||||
["tenant_id", "status"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_template_revisions",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("template_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("revision", sa.Integer(), nullable=False),
|
||||
sa.Column("function_type_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("scope_kind", sa.String(length=30), nullable=False),
|
||||
sa.Column("scope_id", sa.String(length=255), nullable=True),
|
||||
sa.Column("name_pattern", sa.String(length=500), nullable=False),
|
||||
sa.Column("address_pattern", sa.String(length=500), nullable=False),
|
||||
sa.Column("classification", sa.String(length=50), nullable=False),
|
||||
sa.Column("allow_vacant_delivery", sa.Boolean(), nullable=False),
|
||||
sa.Column("encryption_profile", sa.String(length=80), nullable=False),
|
||||
sa.Column("history_policy", sa.JSON(), nullable=False),
|
||||
sa.Column("routing_policy", sa.JSON(), nullable=False),
|
||||
sa.Column("retention_policy", sa.JSON(), nullable=False),
|
||||
sa.Column("created_by", sa.String(length=255), nullable=True),
|
||||
sa.Column("published_at", sa.DateTime(timezone=True), nullable=True),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["template_id"],
|
||||
["postbox_templates.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_template_revisions_template_id_postbox_templates"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint(
|
||||
"id",
|
||||
name=op.f("pk_postbox_template_revisions"),
|
||||
),
|
||||
sa.UniqueConstraint(
|
||||
"template_id",
|
||||
"revision",
|
||||
name="uq_postbox_template_revision_number",
|
||||
),
|
||||
)
|
||||
for column in (
|
||||
"tenant_id",
|
||||
"template_id",
|
||||
"function_type_id",
|
||||
"scope_id",
|
||||
"published_at",
|
||||
):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_template_revisions_{column}"),
|
||||
"postbox_template_revisions",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_template_revisions_function_scope",
|
||||
"postbox_template_revisions",
|
||||
["tenant_id", "function_type_id", "scope_kind", "scope_id"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_addresses",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("address_key", sa.String(length=500), nullable=False),
|
||||
sa.Column("address", sa.String(length=500), nullable=False),
|
||||
sa.Column("template_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("template_revision_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("organization_unit_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("organization_unit_name", sa.String(length=500), nullable=True),
|
||||
sa.Column("function_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("function_name", sa.String(length=500), nullable=True),
|
||||
sa.Column("function_type_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("context_key", sa.String(length=255), nullable=True),
|
||||
sa.Column("status", sa.String(length=24), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["template_id"],
|
||||
["postbox_templates.id"],
|
||||
name=op.f("fk_postbox_addresses_template_id_postbox_templates"),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["template_revision_id"],
|
||||
["postbox_template_revisions.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_addresses_template_revision_id_postbox_template_revisions"
|
||||
),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_addresses")),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"address_key",
|
||||
name="uq_postbox_addresses_tenant_key",
|
||||
),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"address",
|
||||
name="uq_postbox_addresses_tenant_address",
|
||||
),
|
||||
)
|
||||
for column in (
|
||||
"tenant_id",
|
||||
"template_id",
|
||||
"template_revision_id",
|
||||
"organization_unit_id",
|
||||
"function_id",
|
||||
"function_type_id",
|
||||
"context_key",
|
||||
"status",
|
||||
):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_addresses_{column}"),
|
||||
"postbox_addresses",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_addresses_function_scope",
|
||||
"postbox_addresses",
|
||||
[
|
||||
"tenant_id",
|
||||
"organization_unit_id",
|
||||
"function_id",
|
||||
"context_key",
|
||||
],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postboxes",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("address_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("name", sa.String(length=500), nullable=False),
|
||||
sa.Column("description", sa.Text(), nullable=True),
|
||||
sa.Column("status", sa.String(length=24), nullable=False),
|
||||
sa.Column("classification", sa.String(length=50), nullable=False),
|
||||
sa.Column("encryption_profile", sa.String(length=80), nullable=False),
|
||||
sa.Column("key_epoch", sa.Integer(), nullable=False),
|
||||
sa.Column("settings", sa.JSON(), nullable=False),
|
||||
sa.Column("archived_at", sa.DateTime(timezone=True), nullable=True),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["address_id"],
|
||||
["postbox_addresses.id"],
|
||||
name=op.f("fk_postboxes_address_id_postbox_addresses"),
|
||||
ondelete="RESTRICT",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postboxes")),
|
||||
sa.UniqueConstraint("address_id", name="uq_postboxes_address"),
|
||||
)
|
||||
for column in ("tenant_id", "address_id", "status", "classification"):
|
||||
op.create_index(
|
||||
op.f(f"ix_postboxes_{column}"),
|
||||
"postboxes",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postboxes_tenant_status",
|
||||
"postboxes",
|
||||
["tenant_id", "status"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_bindings",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("postbox_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("binding_type", sa.String(length=30), nullable=False),
|
||||
sa.Column("organization_unit_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("function_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("function_type_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("applies_to_subunits", sa.Boolean(), nullable=False),
|
||||
sa.Column("source", sa.String(length=30), nullable=False),
|
||||
sa.Column("is_active", sa.Boolean(), nullable=False),
|
||||
sa.Column("valid_from", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column("valid_until", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column("settings", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["postbox_id"],
|
||||
["postboxes.id"],
|
||||
name=op.f("fk_postbox_bindings_postbox_id_postboxes"),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_bindings")),
|
||||
)
|
||||
for column in (
|
||||
"tenant_id",
|
||||
"postbox_id",
|
||||
"organization_unit_id",
|
||||
"function_id",
|
||||
"function_type_id",
|
||||
"is_active",
|
||||
):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_bindings_{column}"),
|
||||
"postbox_bindings",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_bindings_function_scope",
|
||||
"postbox_bindings",
|
||||
[
|
||||
"tenant_id",
|
||||
"organization_unit_id",
|
||||
"function_id",
|
||||
"is_active",
|
||||
],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_bindings_postbox_active",
|
||||
"postbox_bindings",
|
||||
["postbox_id", "is_active"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_messages",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("postbox_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("subject", sa.String(length=1000), nullable=False),
|
||||
sa.Column("body_text", sa.Text(), nullable=True),
|
||||
sa.Column("status", sa.String(length=30), nullable=False),
|
||||
sa.Column("classification", sa.String(length=50), nullable=False),
|
||||
sa.Column("sender_label", sa.String(length=500), nullable=True),
|
||||
sa.Column("producer_module", sa.String(length=100), nullable=True),
|
||||
sa.Column("producer_resource_type", sa.String(length=100), nullable=True),
|
||||
sa.Column("producer_resource_id", sa.String(length=255), nullable=True),
|
||||
sa.Column("in_reply_to_message_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("replaces_message_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("encryption_profile", sa.String(length=80), nullable=False),
|
||||
sa.Column("key_epoch", sa.Integer(), nullable=False),
|
||||
sa.Column("ciphertext_ref", sa.String(length=1000), nullable=True),
|
||||
sa.Column("signed_manifest_ref", sa.String(length=1000), nullable=True),
|
||||
sa.Column("wrapped_keys", sa.JSON(), nullable=False),
|
||||
sa.Column("delivered_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("expires_at", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column("withdrawn_at", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column(
|
||||
"retention_hold_until",
|
||||
sa.DateTime(timezone=True),
|
||||
nullable=True,
|
||||
),
|
||||
sa.Column("metadata", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["postbox_id"],
|
||||
["postboxes.id"],
|
||||
name=op.f("fk_postbox_messages_postbox_id_postboxes"),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["in_reply_to_message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_messages_in_reply_to_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["replaces_message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_messages_replaces_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_messages")),
|
||||
)
|
||||
for column in (
|
||||
"tenant_id",
|
||||
"postbox_id",
|
||||
"status",
|
||||
"classification",
|
||||
"producer_module",
|
||||
"producer_resource_type",
|
||||
"producer_resource_id",
|
||||
"in_reply_to_message_id",
|
||||
"replaces_message_id",
|
||||
"delivered_at",
|
||||
"expires_at",
|
||||
"withdrawn_at",
|
||||
):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_messages_{column}"),
|
||||
"postbox_messages",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_messages_postbox_delivered",
|
||||
"postbox_messages",
|
||||
["postbox_id", "delivered_at"],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_messages_tenant_status",
|
||||
"postbox_messages",
|
||||
["tenant_id", "status"],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_messages_producer",
|
||||
"postbox_messages",
|
||||
[
|
||||
"tenant_id",
|
||||
"producer_module",
|
||||
"producer_resource_type",
|
||||
"producer_resource_id",
|
||||
],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_participants",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("message_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("kind", sa.String(length=30), nullable=False),
|
||||
sa.Column("reference_type", sa.String(length=50), nullable=False),
|
||||
sa.Column("reference_id", sa.String(length=255), nullable=True),
|
||||
sa.Column("label", sa.String(length=500), nullable=True),
|
||||
sa.Column("address", sa.String(length=500), nullable=True),
|
||||
sa.Column("position", sa.Integer(), nullable=False),
|
||||
sa.Column("metadata", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_participants_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_participants")),
|
||||
)
|
||||
for column in ("tenant_id", "message_id", "reference_id"):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_participants_{column}"),
|
||||
"postbox_participants",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_participants_message_kind",
|
||||
"postbox_participants",
|
||||
["message_id", "kind"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_attachment_references",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("message_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("reference_type", sa.String(length=50), nullable=False),
|
||||
sa.Column("reference_id", sa.String(length=255), nullable=False),
|
||||
sa.Column("name", sa.String(length=1000), nullable=True),
|
||||
sa.Column("media_type", sa.String(length=255), nullable=True),
|
||||
sa.Column("size_bytes", sa.Integer(), nullable=True),
|
||||
sa.Column("digest", sa.String(length=255), nullable=True),
|
||||
sa.Column("ciphertext_ref", sa.String(length=1000), nullable=True),
|
||||
sa.Column("position", sa.Integer(), nullable=False),
|
||||
sa.Column("metadata", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_attachment_references_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint(
|
||||
"id",
|
||||
name=op.f("pk_postbox_attachment_references"),
|
||||
),
|
||||
)
|
||||
for column in ("tenant_id", "message_id"):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_attachment_references_{column}"),
|
||||
"postbox_attachment_references",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_attachment_references_target",
|
||||
"postbox_attachment_references",
|
||||
["tenant_id", "reference_type", "reference_id"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_deliveries",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("postbox_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("message_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("producer_module", sa.String(length=100), nullable=False),
|
||||
sa.Column("producer_resource_type", sa.String(length=100), nullable=False),
|
||||
sa.Column("producer_resource_id", sa.String(length=255), nullable=True),
|
||||
sa.Column("idempotency_key", sa.String(length=255), nullable=False),
|
||||
sa.Column("status", sa.String(length=40), nullable=False),
|
||||
sa.Column("template_revision_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("organization_unit_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("function_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("holder_count", sa.Integer(), nullable=False),
|
||||
sa.Column("target_snapshot", sa.JSON(), nullable=False),
|
||||
sa.Column("accepted_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("metadata", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["postbox_id"],
|
||||
["postboxes.id"],
|
||||
name=op.f("fk_postbox_deliveries_postbox_id_postboxes"),
|
||||
ondelete="RESTRICT",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_deliveries_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="RESTRICT",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_deliveries")),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"producer_module",
|
||||
"idempotency_key",
|
||||
name="uq_postbox_deliveries_producer_idempotency",
|
||||
),
|
||||
)
|
||||
for column in (
|
||||
"tenant_id",
|
||||
"postbox_id",
|
||||
"message_id",
|
||||
"producer_resource_id",
|
||||
"status",
|
||||
"template_revision_id",
|
||||
"organization_unit_id",
|
||||
"function_id",
|
||||
"accepted_at",
|
||||
):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_deliveries_{column}"),
|
||||
"postbox_deliveries",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_deliveries_postbox_status",
|
||||
"postbox_deliveries",
|
||||
["postbox_id", "status"],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_deliveries_producer",
|
||||
"postbox_deliveries",
|
||||
[
|
||||
"tenant_id",
|
||||
"producer_module",
|
||||
"producer_resource_type",
|
||||
"producer_resource_id",
|
||||
],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_routes",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("delivery_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("source_postbox_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("source_message_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("target_postbox_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("target_message_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("route_kind", sa.String(length=40), nullable=False),
|
||||
sa.Column("status", sa.String(length=40), nullable=False),
|
||||
sa.Column("depth", sa.Integer(), nullable=False),
|
||||
sa.Column("source_route_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("policy_snapshot", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["delivery_id"],
|
||||
["postbox_deliveries.id"],
|
||||
name=op.f("fk_postbox_routes_delivery_id_postbox_deliveries"),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["source_postbox_id"],
|
||||
["postboxes.id"],
|
||||
name=op.f("fk_postbox_routes_source_postbox_id_postboxes"),
|
||||
ondelete="RESTRICT",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["source_message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_routes_source_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="RESTRICT",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["target_postbox_id"],
|
||||
["postboxes.id"],
|
||||
name=op.f("fk_postbox_routes_target_postbox_id_postboxes"),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["target_message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_routes_target_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["source_route_id"],
|
||||
["postbox_routes.id"],
|
||||
name=op.f("fk_postbox_routes_source_route_id_postbox_routes"),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_routes")),
|
||||
)
|
||||
for column in ("tenant_id", "delivery_id", "target_postbox_id"):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_routes_{column}"),
|
||||
"postbox_routes",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_routes_delivery_kind",
|
||||
"postbox_routes",
|
||||
["delivery_id", "route_kind"],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_routes_target",
|
||||
"postbox_routes",
|
||||
["tenant_id", "target_postbox_id"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_message_receipts",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("message_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("account_id", sa.String(length=255), nullable=False),
|
||||
sa.Column("identity_id", sa.String(length=255), nullable=True),
|
||||
sa.Column("assignment_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("read_at", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column("acknowledged_at", sa.DateTime(timezone=True), nullable=True),
|
||||
sa.Column("metadata", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_message_receipts_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint(
|
||||
"id",
|
||||
name=op.f("pk_postbox_message_receipts"),
|
||||
),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"message_id",
|
||||
"account_id",
|
||||
name="uq_postbox_receipts_message_account",
|
||||
),
|
||||
)
|
||||
for column in (
|
||||
"tenant_id",
|
||||
"message_id",
|
||||
"account_id",
|
||||
"identity_id",
|
||||
"assignment_id",
|
||||
):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_message_receipts_{column}"),
|
||||
"postbox_message_receipts",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_receipts_account_state",
|
||||
"postbox_message_receipts",
|
||||
[
|
||||
"tenant_id",
|
||||
"account_id",
|
||||
"read_at",
|
||||
"acknowledged_at",
|
||||
],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_groupings",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("account_id", sa.String(length=255), nullable=False),
|
||||
sa.Column("name", sa.String(length=250), nullable=False),
|
||||
sa.Column("is_default", sa.Boolean(), nullable=False),
|
||||
sa.Column("settings", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.PrimaryKeyConstraint("id", name=op.f("pk_postbox_groupings")),
|
||||
sa.UniqueConstraint(
|
||||
"tenant_id",
|
||||
"account_id",
|
||||
"name",
|
||||
name="uq_postbox_groupings_account_name",
|
||||
),
|
||||
)
|
||||
for column in ("tenant_id", "account_id"):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_groupings_{column}"),
|
||||
"postbox_groupings",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_groupings_account",
|
||||
"postbox_groupings",
|
||||
["tenant_id", "account_id"],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_grouping_sources",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("grouping_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("postbox_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("position", sa.Integer(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["grouping_id"],
|
||||
["postbox_groupings.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_grouping_sources_grouping_id_postbox_groupings"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["postbox_id"],
|
||||
["postboxes.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_grouping_sources_postbox_id_postboxes"
|
||||
),
|
||||
ondelete="CASCADE",
|
||||
),
|
||||
sa.PrimaryKeyConstraint(
|
||||
"id",
|
||||
name=op.f("pk_postbox_grouping_sources"),
|
||||
),
|
||||
sa.UniqueConstraint(
|
||||
"grouping_id",
|
||||
"postbox_id",
|
||||
name="uq_postbox_grouping_sources_postbox",
|
||||
),
|
||||
)
|
||||
for column in ("tenant_id", "grouping_id", "postbox_id"):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_grouping_sources_{column}"),
|
||||
"postbox_grouping_sources",
|
||||
[column],
|
||||
)
|
||||
|
||||
op.create_table(
|
||||
"postbox_access_events",
|
||||
sa.Column("id", sa.String(length=36), nullable=False),
|
||||
sa.Column("tenant_id", sa.String(length=36), nullable=False),
|
||||
sa.Column("postbox_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("message_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("account_id", sa.String(length=255), nullable=True),
|
||||
sa.Column("identity_id", sa.String(length=255), nullable=True),
|
||||
sa.Column("assignment_id", sa.String(length=36), nullable=True),
|
||||
sa.Column("action", sa.String(length=80), nullable=False),
|
||||
sa.Column("outcome", sa.String(length=30), nullable=False),
|
||||
sa.Column("reason_code", sa.String(length=80), nullable=False),
|
||||
sa.Column("occurred_at", sa.DateTime(timezone=True), nullable=False),
|
||||
sa.Column("details", sa.JSON(), nullable=False),
|
||||
*_timestamps(),
|
||||
sa.ForeignKeyConstraint(
|
||||
["postbox_id"],
|
||||
["postboxes.id"],
|
||||
name=op.f("fk_postbox_access_events_postbox_id_postboxes"),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.ForeignKeyConstraint(
|
||||
["message_id"],
|
||||
["postbox_messages.id"],
|
||||
name=op.f(
|
||||
"fk_postbox_access_events_message_id_postbox_messages"
|
||||
),
|
||||
ondelete="SET NULL",
|
||||
),
|
||||
sa.PrimaryKeyConstraint(
|
||||
"id",
|
||||
name=op.f("pk_postbox_access_events"),
|
||||
),
|
||||
)
|
||||
for column in (
|
||||
"tenant_id",
|
||||
"postbox_id",
|
||||
"message_id",
|
||||
"account_id",
|
||||
"identity_id",
|
||||
"assignment_id",
|
||||
"action",
|
||||
"outcome",
|
||||
"occurred_at",
|
||||
):
|
||||
op.create_index(
|
||||
op.f(f"ix_postbox_access_events_{column}"),
|
||||
"postbox_access_events",
|
||||
[column],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_access_events_resource",
|
||||
"postbox_access_events",
|
||||
["tenant_id", "postbox_id", "message_id", "occurred_at"],
|
||||
)
|
||||
op.create_index(
|
||||
"ix_postbox_access_events_actor",
|
||||
"postbox_access_events",
|
||||
["tenant_id", "account_id", "occurred_at"],
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.drop_table("postbox_access_events")
|
||||
op.drop_table("postbox_grouping_sources")
|
||||
op.drop_table("postbox_groupings")
|
||||
op.drop_table("postbox_message_receipts")
|
||||
op.drop_table("postbox_routes")
|
||||
op.drop_table("postbox_deliveries")
|
||||
op.drop_table("postbox_attachment_references")
|
||||
op.drop_table("postbox_participants")
|
||||
op.drop_table("postbox_messages")
|
||||
op.drop_table("postbox_bindings")
|
||||
op.drop_table("postboxes")
|
||||
op.drop_table("postbox_addresses")
|
||||
op.drop_table("postbox_template_revisions")
|
||||
op.drop_table("postbox_templates")
|
||||
Reference in New Issue
Block a user