from sqlalchemy import Column, String, Text, DateTime, Integer, ForeignKey, Boolean, Enum from sqlalchemy.orm import relationship, DeclarativeBase from sqlalchemy.sql import func import enum class UserRole(enum.Enum): ADMIN = "ADMIN" CUSTOMER = "CUSTOMER" SHIPPER = "SHIPPER" class SexType(enum.Enum): OTHER = "OTHER" MALE = "MALE" FEMALE = "FEMALE" class UserType(enum.Enum): BASIC = "BASIC" BOTH = "BOTH" EMAIL = "EMAIL" class Base(DeclarativeBase): pass class User(Base): __tablename__ = 'user' user_id = Column(Integer, primary_key=True, autoincrement=True) avatar = Column(Text, nullable=True) birth_date = Column(DateTime, nullable=True) city = Column(String(255), nullable=True) district = Column(String(255), nullable=True) email = Column(String(255), unique=True, nullable=False) full_name = Column(String(255), nullable=False) is_deleted = Column(Boolean, default=False) password = Column(Text, nullable=False) phone_number = Column(String(20), nullable=True) role = Column(Enum(UserRole), nullable=False) # 🎯 Enum Role sex = Column(Enum(SexType), nullable=True) # 🎯 Enum Sex street = Column(String(255), nullable=True) type = Column(Enum(UserType), nullable=True) # 🎯 Enum Type username = Column(String(255), unique=True, nullable=False) date_created = Column(DateTime, default=func.now()) date_updated = Column(DateTime, default=func.now(), onupdate=func.now()) date_deleted = Column(DateTime, nullable=True) ward = Column(String(255), nullable=True) tokens = relationship("Token", back_populates="user") user_chats = relationship("UserChat", back_populates="user") class Token(Base): __tablename__ = 'token' token_id = Column(Integer, primary_key=True, autoincrement=True) access_token = Column(Text, nullable=False) expire = Column(DateTime, nullable=False) refresh_token = Column(Text, nullable=False) user_id = Column(Integer, ForeignKey('user.user_id'), nullable=False) user = relationship("User", back_populates="tokens") class UserChat(Base): __tablename__ = 'user_chat' user_chat_id = Column(Integer, primary_key=True, autoincrement=True) chat_name = Column(String(255), nullable=False) id_mongo_db = Column(String(255), nullable=True) user_id = Column(Integer, ForeignKey('user.user_id'), nullable=False) date_created = Column(DateTime, default=func.now()) date_updated = Column(DateTime, default=func.now(), onupdate=func.now()) date_deleted = Column(DateTime, nullable=True) is_deleted = Column(Boolean, default=False) user = relationship("User", back_populates="user_chats")