"""Anbindung an Banken ueber PSD2 (Enable Banking). Drei Ebenen: die bei Enable Banking registrierte Anwendung dieser Installation (Application ID + privater Schluessel), die autorisierte Verbindung zu einer Bank, und die Zuordnung eines dortigen Kontos zu einem Konto in Certain. Der private Schluessel liegt verschluesselt – er ist so schuetzenswert wie ein Passwort, denn mit ihm wird jede Anfrage signiert. Revision ID: 0021 Revises: 0020 """ import sqlalchemy as sa from alembic import op revision = "0021" down_revision = "0020" branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "bank_apps", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("owner_id", sa.Integer(), nullable=False), sa.Column("application_id", sa.String(length=64), nullable=False), sa.Column("private_key_enc", sa.Text(), nullable=False), sa.Column("base_url", sa.String(length=255), nullable=False), sa.Column("created_at", sa.DateTime(timezone=True), nullable=True), sa.ForeignKeyConstraint(["owner_id"], ["users.id"], ondelete="CASCADE"), ) op.create_index("ix_bank_apps_owner_id", "bank_apps", ["owner_id"]) op.create_table( "bank_connections", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("owner_id", sa.Integer(), nullable=False), sa.Column("aspsp_name", sa.String(length=120), nullable=False), sa.Column("aspsp_country", sa.String(length=2), nullable=False), sa.Column("session_id", sa.String(length=64), nullable=True), sa.Column("valid_until", sa.DateTime(timezone=True), nullable=True), sa.Column("pending_state", sa.String(length=64), nullable=True), sa.Column("last_sync_at", sa.DateTime(timezone=True), nullable=True), sa.Column("last_error", sa.Text(), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=True), sa.ForeignKeyConstraint(["owner_id"], ["users.id"], ondelete="CASCADE"), ) op.create_index("ix_bank_connections_owner_id", "bank_connections", ["owner_id"]) op.create_index("ix_bank_connections_state", "bank_connections", ["pending_state"]) op.create_table( "bank_account_links", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("owner_id", sa.Integer(), nullable=False), sa.Column("connection_id", sa.Integer(), nullable=False), sa.Column("remote_uid", sa.String(length=64), nullable=False), sa.Column("iban", sa.String(length=64), nullable=True), sa.Column("remote_name", sa.String(length=255), nullable=True), sa.Column("currency", sa.String(length=3), nullable=False, server_default="EUR"), sa.Column("account_id", sa.Integer(), nullable=True), sa.Column("created_at", sa.DateTime(timezone=True), nullable=True), sa.ForeignKeyConstraint(["owner_id"], ["users.id"], ondelete="CASCADE"), sa.ForeignKeyConstraint(["connection_id"], ["bank_connections.id"], ondelete="CASCADE"), sa.ForeignKeyConstraint(["account_id"], ["accounts.id"], ondelete="SET NULL"), sa.UniqueConstraint("owner_id", "remote_uid", name="uq_bank_link_remote"), ) op.create_index("ix_bank_links_owner_id", "bank_account_links", ["owner_id"]) op.create_index("ix_bank_links_connection", "bank_account_links", ["connection_id"]) def downgrade() -> None: op.drop_table("bank_account_links") op.drop_table("bank_connections") op.drop_table("bank_apps")