from datetime import datetime, timedelta, timezone from typing import Annotated from sqlalchemy import DateTime from pydantic import BaseModel from fastapi import Depends from sqlalchemy.orm import Session, relationship, mapped_column, Mapped from sqlalchemy import String, Float, Integer, ForeignKey from sqlalchemy.dialects.postgresql import ARRAY from ..config import Base, get_session_db, collection_item from typing import TYPE_CHECKING from ..auth.models import Role, Status, UserBase from ..collectionObj.models import CollectionsDB class UserProfileBase(UserBase): bio : str | None = None created_date : datetime | None = None # collection : list[str] | None = None class UserProfileID(UserProfileBase): user_id : int | None = None class UserProfilePublic(UserProfileBase): pass class UserProfilePrivate(UserProfilePublic): #collection : list[str] | None = None role : Role | None = None status : Status | None = None follow_user : list[int] | None = None items : list['Item'] | None = None ######## ITEMS ###### class BaseItem(BaseModel): item_created_date : datetime | None = None item_location : str | None = None item_type : str | None = None item_content : str | None = None class ItemCreate(BaseItem): # item oluşturma için ekstra bir ihtiyaci olmaz pass class Item(BaseItem): item_id : int | None = None user_id : int | None = None item_score : float | None = None class Config: from_attributes = True #sqlalchemy ile pydantic arasında geçiş yapabilmek için kullanılır ##### VERİTABANI MODELİ ##### # Tüm modeller AUTH'da veri tabanına işlendi yukardaki #modeller veri tabanında mevcuttur. Değiştirmek için AUTH'daki # DBUser modelini değiştirip tekrar veri tabanına işleyebilirsin class Items(Base): __tablename__ = "items_table" item_id : Mapped[int] = mapped_column(primary_key=True, index=True, autoincrement=True) #collection_id : Mapped[list[int]] = mapped_column(Integer, ForeignKey("collections_table.collection_id"), nullable=True) # collection_id ile ilişki item_created_date : Mapped[datetime] = mapped_column(DateTime, default=datetime.now()) item_location: Mapped[str] = mapped_column(String, default="No location") item_type: Mapped[str] = mapped_column(String, default="No type") item_content: Mapped[str] = mapped_column(String, default="No content") item_score: Mapped[float] = mapped_column(Float, default=0.0) # ilişkiler collections : Mapped['CollectionsDB']= relationship( "CollectionsDB", secondary=collection_item, back_populates="items", lazy='select' ) #back_populates karşı tarafın ismi