Mercurial > libervia-backend
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