absa-tourism-api / models.py
CrossManger's picture
Update models.py
6630efe verified
from datetime import datetime, timezone
from typing import List, Optional
from sqlalchemy import DateTime, ForeignKey, Integer, String, Text
from sqlalchemy.orm import Mapped, mapped_column, relationship
from database import Base
class User(Base):
__tablename__ = "users"
id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
username: Mapped[str] = mapped_column(String(150), unique=True, index=True, nullable=False)
hashed_password: Mapped[str] = mapped_column(String(255), nullable=False)
# Relationships
reviews: Mapped[List["Review"]] = relationship(
"Review",
back_populates="user",
cascade="all, delete-orphan",
passive_deletes=True,
)
def __repr__(self) -> str:
return f"<User id={self.id} username={self.username!r}>"
class ReviewAspect(Base):
__tablename__ = "review_aspects"
id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
review_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("reviews.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
aspect: Mapped[str] = mapped_column(String(100), nullable=False)
sentiment: Mapped[str] = mapped_column(String(50), nullable=False)
# Relationships
review: Mapped["Review"] = relationship("Review", back_populates="aspects")
def __repr__(self) -> str:
return f"<ReviewAspect id={self.id} review_id={self.review_id} aspect={self.aspect!r} sentiment={self.sentiment!r}>"
class Review(Base):
__tablename__ = "reviews"
id: Mapped[int] = mapped_column(Integer, primary_key=True, index=True)
user_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("users.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
review_text: Mapped[str] = mapped_column(Text, nullable=False)
created_at: Mapped[datetime] = mapped_column(
DateTime(timezone=True),
default=lambda: datetime.now(timezone.utc),
nullable=False,
)
# Relationships
user: Mapped["User"] = relationship("User", back_populates="reviews")
aspects: Mapped[List["ReviewAspect"]] = relationship(
"ReviewAspect",
back_populates="review",
cascade="all, delete-orphan",
passive_deletes=True,
)
def __repr__(self) -> str:
return f"<Review id={self.id}>"