2024-11-01 12:06:21 +00:00
|
|
|
import time
|
|
|
|
|
2025-02-11 09:00:35 +00:00
|
|
|
from sqlalchemy import (
|
|
|
|
JSON,
|
|
|
|
Boolean,
|
|
|
|
Column,
|
|
|
|
DateTime,
|
|
|
|
ForeignKey,
|
|
|
|
Integer,
|
|
|
|
String,
|
|
|
|
func,
|
|
|
|
)
|
2022-07-21 11:58:50 +00:00
|
|
|
from sqlalchemy.orm import relationship
|
2023-10-30 21:00:55 +00:00
|
|
|
|
2024-11-01 12:06:21 +00:00
|
|
|
from services.db import Base
|
|
|
|
|
|
|
|
|
|
|
|
class Permission(Base):
|
|
|
|
__tablename__ = "permission"
|
|
|
|
|
|
|
|
id = Column(String, primary_key=True, unique=True, nullable=False, default=None)
|
|
|
|
resource = Column(String, nullable=False)
|
|
|
|
operation = Column(String, nullable=False)
|
|
|
|
|
|
|
|
|
|
|
|
class Role(Base):
|
|
|
|
__tablename__ = "role"
|
|
|
|
|
|
|
|
id = Column(String, primary_key=True, unique=True, nullable=False, default=None)
|
|
|
|
name = Column(String, nullable=False)
|
|
|
|
permissions = relationship(Permission)
|
|
|
|
|
|
|
|
|
|
|
|
class AuthorizerUser(Base):
|
|
|
|
__tablename__ = "authorizer_users"
|
|
|
|
|
|
|
|
id = Column(String, primary_key=True, unique=True, nullable=False, default=None)
|
|
|
|
key = Column(String)
|
|
|
|
email = Column(String, unique=True)
|
|
|
|
email_verified_at = Column(Integer)
|
|
|
|
family_name = Column(String)
|
|
|
|
gender = Column(String)
|
|
|
|
given_name = Column(String)
|
|
|
|
is_multi_factor_auth_enabled = Column(Boolean)
|
|
|
|
middle_name = Column(String)
|
|
|
|
nickname = Column(String)
|
|
|
|
password = Column(String)
|
|
|
|
phone_number = Column(String, unique=True)
|
|
|
|
phone_number_verified_at = Column(Integer)
|
|
|
|
# preferred_username = Column(String, nullable=False)
|
|
|
|
picture = Column(String)
|
|
|
|
revoked_timestamp = Column(Integer)
|
|
|
|
roles = Column(String, default="author,reader")
|
|
|
|
signup_methods = Column(String, default="magic_link_login")
|
|
|
|
created_at = Column(Integer, default=lambda: int(time.time()))
|
|
|
|
updated_at = Column(Integer, default=lambda: int(time.time()))
|
2023-10-26 17:56:42 +00:00
|
|
|
|
2022-09-03 10:50:14 +00:00
|
|
|
|
2021-10-15 10:00:26 +00:00
|
|
|
class UserRating(Base):
|
2022-09-03 10:50:14 +00:00
|
|
|
__tablename__ = "user_rating"
|
|
|
|
|
2023-10-30 21:00:55 +00:00
|
|
|
id = None
|
|
|
|
rater: Column = Column(ForeignKey("user.id"), primary_key=True, index=True)
|
|
|
|
user: Column = Column(ForeignKey("user.id"), primary_key=True, index=True)
|
|
|
|
value: Column = Column(Integer)
|
2021-08-23 08:02:45 +00:00
|
|
|
|
2022-11-19 11:35:34 +00:00
|
|
|
@staticmethod
|
|
|
|
def init_table():
|
|
|
|
pass
|
|
|
|
|
2021-08-20 08:08:32 +00:00
|
|
|
|
2021-11-24 09:09:47 +00:00
|
|
|
class UserRole(Base):
|
2022-09-03 10:50:14 +00:00
|
|
|
__tablename__ = "user_role"
|
|
|
|
|
2023-10-30 21:00:55 +00:00
|
|
|
id = None
|
2022-11-30 06:27:12 +00:00
|
|
|
user = Column(ForeignKey("user.id"), primary_key=True, index=True)
|
2022-11-30 17:21:15 +00:00
|
|
|
role = Column(ForeignKey("role.id"), primary_key=True, index=True)
|
2021-11-24 09:09:47 +00:00
|
|
|
|
2021-08-17 09:14:26 +00:00
|
|
|
|
2021-06-28 09:08:09 +00:00
|
|
|
class User(Base):
|
2022-09-03 10:50:14 +00:00
|
|
|
__tablename__ = "user"
|
2022-11-19 11:35:34 +00:00
|
|
|
default_user = None
|
2022-09-03 10:50:14 +00:00
|
|
|
|
|
|
|
email = Column(String, unique=True, nullable=False, comment="Email")
|
|
|
|
username = Column(String, nullable=False, comment="Login")
|
|
|
|
password = Column(String, nullable=True, comment="Password")
|
2022-12-01 10:04:38 +00:00
|
|
|
bio = Column(String, nullable=True, comment="Bio") # status description
|
|
|
|
about = Column(String, nullable=True, comment="About") # long and formatted
|
2022-09-03 10:50:14 +00:00
|
|
|
userpic = Column(String, nullable=True, comment="Userpic")
|
|
|
|
name = Column(String, nullable=True, comment="Display name")
|
|
|
|
slug = Column(String, unique=True, comment="User's slug")
|
2024-11-01 12:06:21 +00:00
|
|
|
links = Column(JSON, nullable=True, comment="Links")
|
2022-09-03 10:50:14 +00:00
|
|
|
oauth = Column(String, nullable=True)
|
2024-11-03 08:32:05 +00:00
|
|
|
oid = Column(String, nullable=True)
|
|
|
|
|
|
|
|
muted = Column(Boolean, default=False)
|
|
|
|
confirmed = Column(Boolean, default=False)
|
|
|
|
|
|
|
|
created_at = Column(DateTime(timezone=True), nullable=False, server_default=func.now(), comment="Created at")
|
|
|
|
updated_at = Column(DateTime(timezone=True), nullable=False, server_default=func.now(), comment="Updated at")
|
|
|
|
last_seen = Column(DateTime(timezone=True), nullable=False, server_default=func.now(), comment="Was online at")
|
|
|
|
deleted_at = Column(DateTime(timezone=True), nullable=True, comment="Deleted at")
|
|
|
|
|
2022-09-03 10:50:14 +00:00
|
|
|
ratings = relationship(UserRating, foreign_keys=UserRating.user)
|
|
|
|
roles = relationship(lambda: Role, secondary=UserRole.__tablename__)
|
2024-11-03 08:32:05 +00:00
|
|
|
|
2022-12-01 13:24:05 +00:00
|
|
|
def get_permission(self):
|
2022-09-03 10:50:14 +00:00
|
|
|
scope = {}
|
2022-11-28 22:58:23 +00:00
|
|
|
for role in self.roles:
|
2022-09-03 10:50:14 +00:00
|
|
|
for p in role.permissions:
|
2022-11-30 17:21:15 +00:00
|
|
|
if p.resource not in scope:
|
|
|
|
scope[p.resource] = set()
|
|
|
|
scope[p.resource].add(p.operation)
|
2022-12-01 08:12:48 +00:00
|
|
|
print(scope)
|
2022-09-03 10:50:14 +00:00
|
|
|
return scope
|
2021-06-28 09:08:09 +00:00
|
|
|
|
|
|
|
|
2022-12-02 08:47:55 +00:00
|
|
|
# if __name__ == "__main__":
|
2023-10-30 21:00:55 +00:00
|
|
|
# print(User.get_permission(user_id=1))
|