from typing import List from flask_sqlalchemy import SQLAlchemy from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy import String, ForeignKey, types, func from datetime import datetime db = SQLAlchemy() class RoleModel(db.Model): __tablename__ = "roles" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=False) name: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) createdAt: Mapped[datetime] = mapped_column(types.DateTime(timezone=True), nullable=False, server_default=func.now()) updatedAt: Mapped[datetime] = mapped_column(types.DateTime(timezone=True), nullable=False, server_default=func.now(), onupdate=func.now()) staff: Mapped[List["StaffModel"]] = relationship(back_populates="role") class StaffModel(db.Model): __tablename__ = "staff" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) firstName: Mapped[str] = mapped_column(String(40), nullable=False, index=True) lastName: Mapped[str] = mapped_column(String(40), nullable=False, index=True) uid: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) email: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) password: Mapped[str] = mapped_column(String(200), nullable=True) dateOfBirth: Mapped[datetime] = mapped_column(types.DateTime(timezone=True), nullable=True) roleId: Mapped[int] = mapped_column(ForeignKey("roles.id")) revoked: Mapped[bool] = mapped_column(default=False) createdAt: Mapped[datetime] = mapped_column(types.DateTime(timezone=True), nullable=False, server_default=func.now()) updatedAt: Mapped[datetime] = mapped_column(types.DateTime(timezone=True), nullable=False, server_default=func.now(), onupdate=func.now()) role: Mapped["RoleModel"] = relationship(back_populates="staff") email_aliases: Mapped[List["EmailAliasModel"]] = relationship(back_populates="staff") class EmailAliasModel(db.Model): __tablename__ = "email_aliases" id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True) email: Mapped[str] = mapped_column(String(100), unique=True, nullable=False) staffId: Mapped[int] = mapped_column(ForeignKey("staff.id")) createdAt: Mapped[datetime] = mapped_column(types.DateTime(timezone=True), nullable=False, server_default=func.now()) updatedAt: Mapped[datetime] = mapped_column(types.DateTime(timezone=True), nullable=False, server_default=func.now(), onupdate=func.now()) staff: Mapped["StaffModel"] = relationship(back_populates="email_aliases")