backend/main.py
2025-05-05 15:02:44 +03:00

123 lines
3.6 KiB
Python

from .config import app
from .auth.router import router as auth_router
from .items.router import router as items_router
app.include_router(auth_router)
app.include_router(items_router)
'''
from fastapi import FastAPI
from pydantic import BaseModel, Field, EmailStr
from enum import Enum as PyEnum
import datetime
from sqlalchemy import Column, Integer, String, DateTime, Float, Text, Boolean, ForeignKey, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from .config import Base #databaese connection
from .config import app #base app
# Enums database
class Role(str, PyEnum):
admin = "admin"
user = "user"
mod = "mod"
class Status(str, PyEnum):
active = "active"
banned = "banned"
suspended = "suspended"
class ItemType(str, PyEnum):
text = "text"
image = "image"
class VoteType(str, PyEnum):
up = "up"
down = "down"
# SQLAlchemy Models
class User(Base):
__tablename__ = "users"
user_id = Column(Integer, primary_key=True, index=True)
username = Column(String, unique=True, nullable=False)
name = Column(String)
surname = Column(String)
email = Column(String, unique=True, nullable=False)
role = Column(Enum(Role), default=Role.user)
status = Column(Enum(Status), default=Status.active)
bio = Column(String(144))
created_date = Column(DateTime, default=datetime.datetime.utcnow)
collections = relationship("Collection", back_populates="user")
items = relationship("Item", back_populates="user")
class Collection(Base):
__tablename__ = "collections"
collection_id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.user_id"))
visibility = Column(Boolean, default=True) # True = public, False = private
collection_name = Column(String, nullable=False)
collection_bio = Column(String)
user = relationship("User", back_populates="collections")
items = relationship("Item", back_populates="collection")
class Item(Base):
__tablename__ = "items"
item_id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.user_id"))
date = Column(DateTime, default=datetime.datetime.utcnow)
location_x = Column(Float)
location_y = Column(Float)
item_type = Column(Enum(ItemType))
content_text = Column(Text, nullable=True)
content_image_path = Column(String, nullable=True)
collection_id = Column(Integer, ForeignKey("collections.collection_id"))
score = Column(Integer, default=0)
user = relationship("User", back_populates="items")
collection = relationship("Collection", back_populates="items")
votes = relationship("Vote", back_populates="item")
class Vote(Base):
__tablename__ = "votes"
vote_id = Column(Integer, primary_key=True)
user_id = Column(Integer, ForeignKey("users.user_id"))
item_id = Column(Integer, ForeignKey("items.item_id"))
vote_type = Column(Enum(VoteType))
date = Column(DateTime, default=datetime.datetime.utcnow)
item = relationship("Item", back_populates="votes")
# Pydantic Schemas
class UserCreate(BaseModel):
username: str
name: str
surname: str
email: EmailStr
bio: str = Field(max_length=144)
class ItemCreate(BaseModel):
location_x: float
location_y: float
item_type: ItemType
content_text: str | None = None
content_image_path: str | None = None
collection_id: int
class CollectionCreate(BaseModel):
collection_name: str
collection_bio: str
visibility: bool = True
class VoteCreate(BaseModel):
item_id: int
vote_type: VoteType
'''