diff --git a/_collections/models.py b/_collections/models.py new file mode 100644 index 0000000..760d5d6 --- /dev/null +++ b/_collections/models.py @@ -0,0 +1,18 @@ +from fastapi import HTTPException +from sqlalchemy import Column, Integer, String, Float, Boolean, ForeignKey +from sqlalchemy.dialects.postgresql import ARRAY +from sqlalchemy.orm import Session +from ..config import Base + + + + +##### veri tabanı modelleri ##### +class Collections(Base): + __tablename__ = "collections_table" + + collection_id = Column(Integer, index=True, primary_key=True , autoincrement=True) + user_id = Column(Integer, ForeignKey('users_table.user_id'), nullable=False) + visibility = Column(Boolean, default=True) + colllection_name = Column(String, default="No name") + collection_description = Column(String, default="No description") \ No newline at end of file diff --git a/_collections/router.py b/_collections/router.py new file mode 100644 index 0000000..72387ea --- /dev/null +++ b/_collections/router.py @@ -0,0 +1,8 @@ +from fastapi import FastAPI, APIRouter + +router = APIRouter( + prefix="/collections", + tags=["collections"], + responses={404: {"description": "Not found"}}, + dependencies=[], +) \ No newline at end of file diff --git a/auth/models.py b/auth/models.py index fb259fd..a686151 100644 --- a/auth/models.py +++ b/auth/models.py @@ -10,6 +10,7 @@ from fastapi.security import OAuth2PasswordBearer from pydantic.networks import EmailStr from sqlalchemy import Column, Integer, String from sqlalchemy.orm import Session +from sqlalchemy.dialects.postgresql import ARRAY from email.message import EmailMessage import jwt @@ -53,6 +54,7 @@ class UserCreate(BaseModel): status: Status | None = None password : str | None = None + ### VERİTABANI MODELİ ### class DBUser(Base): __tablename__ = "users_table" @@ -64,6 +66,9 @@ class DBUser(Base): role = Column(String, default="user") status = Column(String, default="active") created_date = Column(String, default=datetime.now(timezone.utc).strftime("%Y-%m-%d %H:%M:%S")) + bio = Column(String, default="No bio") + collections = Column(ARRAY(String), default=['likes']) + follower_user = Column(ARRAY(Integer), default=[]) ### AUTH ### @@ -230,11 +235,9 @@ def update_password_w_user( user: Annotated[DBUser , None], password: str | None = None, -): +) -> any: hashed_password = get_password_hash(password) session.query(DBUser).filter(DBUser.user_id == user.user_id).update({"hashed_password": hashed_password}) session.commit() - session.refresh(user) - \ No newline at end of file diff --git a/items/models.py b/items/models.py index 8d7cb69..f1c70c4 100644 --- a/items/models.py +++ b/items/models.py @@ -1,11 +1,69 @@ from datetime import datetime, timedelta, timezone -from ..auth.models import UserBase +from typing import Annotated +from pydantic import BaseModel +from fastapi import Depends +from sqlalchemy.orm import Session +from sqlalchemy import ForeignKey, Column, Integer, String, Float +from sqlalchemy.dialects.postgresql import ARRAY +from ..auth.models import DBUser, Role, Status, UserBase +from ..config import Base, get_session_db -class UserProfile(UserBase): +class UserProfileBase(UserBase): bio : str | None = None created_date : datetime | None = None - collections : list[str] | None = None - items :list[str] | 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 + +##### 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 = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("users_table.user_id"), nullable=False) + #collection_id = Column(Integer, ForeignKey("collections_table.collection_id"), nullable=False) + item_created_date = Column(String, default=datetime.now()) + item_location = Column(String, default="No location") #daha net tanımlancak + item_type = Column(String, default="No type") + item_content = Column(String, default="No content") + item_score = Column(Float, default=0.0) + + + + +def is_user_exsist(username : str, session : Annotated[Session, Depends(get_session_db)]) -> bool | UserProfilePublic: + #DBUser veritabanındaki nesnedir her niteliğe sahiptir + user = session.query(DBUser).filter(DBUser.username == username).first() + return user + + +def all_users(session: Annotated[Session, Depends(get_session_db)]) -> list[UserProfilePublic]: + users = session.query(DBUser).all() + + return [UserProfilePublic( + username=user.username, + bio=user.bio, + created_date=user.created_date, + items=user.items, + collections=user.collections, + role=user.role, + status=user.status + ) for user in users] diff --git a/items/router.py b/items/router.py index 7fd3c4b..d67b90c 100644 --- a/items/router.py +++ b/items/router.py @@ -1,5 +1,7 @@ -from .models import UserProfile +from .models import UserProfileBase, UserProfileID, UserProfilePrivate, UserProfilePublic, all_users, is_user_exsist from fastapi import APIRouter, Depends +from sqlalchemy.orm import Session +from ..config import get_session_db from typing import Annotated from ..auth.models import get_current_active_user @@ -10,9 +12,37 @@ router = APIRouter( dependencies=[], ) -@router.get('/profile', response_model=UserProfile) -async def get_user_profile( - current_user: Annotated[UserProfile, Depends(get_current_active_user)] -) -> UserProfile: +@router.get('/all_profiles') +async def get_user_profile(session: Annotated[Session, Depends(get_session_db)]) -> list[UserProfilePublic]: - return current_user \ No newline at end of file + return all_users(session=session) + + +@router.get('/profile/{username}') +async def get_user_profile_by_username( + username: str, + session: Annotated[Session, Depends(get_session_db)], +) -> UserProfilePublic | dict: + + user : UserProfilePublic = is_user_exsist(username, session) + if user is None: + return {"error": "User not found"} + + return user + +@router.get('/profile/me') +async def get_user_profile_me( + current_user: Annotated[UserProfilePrivate, Depends(get_current_active_user)] #dependtek kaynaklı UserPublic doner + ) -> UserProfilePrivate: + + return current_user + + +@router.post('/create') +async def create_user_profile( + user : Annotated[UserProfileID, Depends(get_current_active_user)], + session: Annotated[Session, Depends(get_session_db)], +) -> UserProfileBase: + + return user + \ No newline at end of file diff --git a/main.py b/main.py index 14bc3fd..93010c6 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,8 @@ from .config import app from .auth.router import router as auth_router from .items.router import router as items_router +from ._collections.router import router as collections_router app.include_router(auth_router) +app.include_router(collections_router) app.include_router(items_router)