from __future__ import annotations import uuid from enum import Enum from sqlalchemy import String from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column from core.db.base import Base, SoftDeleteMixin, TimestampMixin class FriendshipStatus(str, Enum): PENDING = "pending" ACCEPTED = "accepted" BLOCKED = "blocked" DECLINED = "declined" CANCELED = "canceled" class Friendship(TimestampMixin, SoftDeleteMixin, Base): __tablename__: str = "friendships" __table_args__ = {"extend_existing": True} id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=uuid.uuid4 ) user_low_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), nullable=False, ) user_high_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), nullable=False, ) initiator_id: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) status: Mapped[FriendshipStatus] = mapped_column( String(20), nullable=False, default=FriendshipStatus.PENDING, ) requested_at: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) accepted_at: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) blocked_by: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) created_by: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) updated_by: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, )