diff libervia/backend/memory/sqla_mapping.py @ 4385:a1ac33fe6b97

memory (sqla): Add columns and tables to handles permissions: Add columns to handle `access_model` and `publish_model` and a table for `affiliations`. With those new data, components handling pubsub can now manage permissions correctly. rel 462
author Goffi <goffi@goffi.org>
date Sun, 03 Aug 2025 23:45:45 +0200
parents f6672bc80897
children
line wrap: on
line diff
--- a/libervia/backend/memory/sqla_mapping.py	Sun Aug 03 23:36:22 2025 +0200
+++ b/libervia/backend/memory/sqla_mapping.py	Sun Aug 03 23:45:45 2025 +0200
@@ -105,11 +105,29 @@
     NO_SYNC = 4
 
 
+class AccessModel(enum.StrEnum):
+    open = enum.auto()
+    whitelist = enum.auto()
+
+
+class PublishModel(enum.StrEnum):
+    publishers = enum.auto()
+    subscribers = enum.auto()
+    open = enum.auto()
+
+
 class SubscriptionState(enum.Enum):
     SUBSCRIBED = 1
     PENDING = 2
 
 
+class Affiliation(enum.StrEnum):
+    outcast = enum.auto()
+    member = enum.auto()
+    publisher = enum.auto()
+    owner = enum.auto()
+
+
 class NotificationType(enum.Enum):
     chat = "chat"
     blog = "blog"
@@ -604,6 +622,20 @@
     profile_id = Column(ForeignKey("profiles.id", ondelete="CASCADE"))
     service = Column(JID)
     name = Column(Text, nullable=False)
+    access_model = Column(
+        Enum(
+            AccessModel,
+            create_constraint=True,
+        ),
+        nullable=True,
+    )
+    publish_model = Column(
+        Enum(
+            PublishModel,
+            create_constraint=True,
+        ),
+        nullable=True,
+    )
     subscribed = Column(
         Boolean(create_constraint=True, name="subscribed_bool"), nullable=False
     )
@@ -622,12 +654,36 @@
     extra = Column(JSON)
 
     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)
 
     def __str__(self):
         return f"Pubsub node {self.name!r} at {self.service}"
 
 
+class PubsubAffiliation(Base):
+    """Affiliations to pubsub nodes.
+
+    User by components managing a pubsub service.
+    """
+    __tablename__ = "pubsub_affiliations"
+    __table_args__ = (UniqueConstraint("node_id", "entity"),)
+
+
+    id = Column(Integer, primary_key=True)
+    node_id = Column(ForeignKey("pubsub_nodes.id", ondelete="CASCADE"), nullable=False)
+    entity = Column(JID, nullable=False)
+    affiliation = Column(
+        Enum(
+            Affiliation,
+            create_constraint=True,
+        ),
+        nullable=False,
+    )
+
+    node = relationship("PubsubNode", back_populates="affiliations")
+
+
 class PubsubSub(Base):
     """Subscriptions to pubsub nodes