changeset 4389:4895cf954fbe

memory (sqla): add "parent_node_id" and "linked_mode_id" to PubsubNode: This is to prepare for the implementation of XEP-0496 and XEP-0499. rel 463
author Goffi <goffi@goffi.org>
date Fri, 29 Aug 2025 17:59:12 +0200
parents 01ab68704cc9
children 5e48634ccada
files libervia/backend/memory/migration/versions/ece2a6d7e4bb_add_parent_node_id_and_linked_mode_id_.py libervia/backend/memory/sqla_mapping.py
diffstat 2 files changed, 59 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libervia/backend/memory/migration/versions/ece2a6d7e4bb_add_parent_node_id_and_linked_mode_id_.py	Fri Aug 29 17:59:12 2025 +0200
@@ -0,0 +1,32 @@
+"""add "parent_node_id" and "linked_mode_id" to PubsubNode
+
+Revision ID: ece2a6d7e4bb
+Revises: 8db042adb973
+Create Date: 2025-08-16 16:47:48.242973
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = 'ece2a6d7e4bb'
+down_revision = '8db042adb973'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    with op.batch_alter_table('pubsub_nodes', schema=None) as batch_op:
+        batch_op.add_column(sa.Column('linked_node_id', sa.Integer(), nullable=True))
+        batch_op.add_column(sa.Column('parent_node_id', sa.Integer(), nullable=True))
+        batch_op.create_foreign_key(batch_op.f('fk_pubsub_nodes_parent_node_id_pubsub_nodes'), 'pubsub_nodes', ['parent_node_id'], ['id'], ondelete='CASCADE')
+        batch_op.create_foreign_key(batch_op.f('fk_pubsub_nodes_linked_node_id_pubsub_nodes'), 'pubsub_nodes', ['linked_node_id'], ['id'], ondelete='CASCADE')
+
+
+def downgrade():
+    with op.batch_alter_table('pubsub_nodes', schema=None) as batch_op:
+        batch_op.drop_constraint(batch_op.f('fk_pubsub_nodes_linked_node_id_pubsub_nodes'), type_='foreignkey')
+        batch_op.drop_constraint(batch_op.f('fk_pubsub_nodes_parent_node_id_pubsub_nodes'), type_='foreignkey')
+        batch_op.drop_column('parent_node_id')
+        batch_op.drop_column('linked_node_id')
--- a/libervia/backend/memory/sqla_mapping.py	Fri Aug 29 11:44:43 2025 +0200
+++ b/libervia/backend/memory/sqla_mapping.py	Fri Aug 29 17:59:12 2025 +0200
@@ -653,10 +653,37 @@
     subtype = Column(Text, nullable=True)
     extra = Column(JSON)
 
+    linked_node_id = Column(Integer, ForeignKey("pubsub_nodes.id", ondelete="CASCADE"), nullable=True)
+    parent_node_id = Column(Integer, ForeignKey("pubsub_nodes.id", ondelete="CASCADE"), nullable=True)
+
     items = relationship("PubsubItem", back_populates="node", passive_deletes=True)
     affiliations = relationship("PubsubAffiliation", back_populates="node", passive_deletes=True)
     subscriptions = relationship("PubsubSub", back_populates="node", passive_deletes=True)
 
+    linked_node = relationship(
+        "PubsubNode",
+        remote_side=[id],
+        foreign_keys=[linked_node_id],
+        back_populates="linking_nodes"
+    )
+    linking_nodes = relationship(
+        "PubsubNode",
+        foreign_keys=[linked_node_id],
+        back_populates="linked_node",
+    )
+
+    parent_node = relationship(
+        "PubsubNode",
+        remote_side=[id],
+        foreign_keys=[parent_node_id],
+        back_populates="child_nodes"
+    )
+    child_nodes = relationship(
+        "PubsubNode",
+        foreign_keys=[parent_node_id],
+        back_populates="parent_node",
+    )
+
     def __str__(self):
         return f"Pubsub node {self.name!r} at {self.service}"