diff --git a/.gitignore b/.gitignore index 1ae8eac..9a70efa 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,5 @@ wheels/ .env -.sqlite -.duckdb \ No newline at end of file +*.sqlite +*.duckdb \ No newline at end of file diff --git a/src/app.py b/src/app.py index e69de29..7c009ed 100644 --- a/src/app.py +++ b/src/app.py @@ -0,0 +1,28 @@ +from fastapi import FastAPI +from routes import admin_router, score_router, user_router, card_router, movie_router +from sqlmodel import SQLModel, Session, create_engine + +from models import * + +app = FastAPI( + title="Paska joululeffa 2024", + name="Paska joululeffa 2024", + description="API for Paska joululeffa 2024", +) + +app.include_router(admin_router) +app.include_router(score_router) +app.include_router(user_router) +app.include_router(card_router) +app.include_router(movie_router) + + +engine = create_engine("sqlite:///data.sqlite") + +SQLModel.metadata.create_all(engine) + + +@app.on_event("startup") +async def connect_db(): + with Session(engine) as session: + app.state.db = session diff --git a/src/models/__init__.py b/src/models/__init__.py index e69de29..659c8af 100644 --- a/src/models/__init__.py +++ b/src/models/__init__.py @@ -0,0 +1,4 @@ +from .user import User +from .movie import Movie +from .score import Score +from .card import Card diff --git a/src/models/card.py b/src/models/card.py new file mode 100644 index 0000000..189ac57 --- /dev/null +++ b/src/models/card.py @@ -0,0 +1,12 @@ +from sqlmodel import Field, SQLModel +from datetime import datetime +from typing import Optional + + +class Card(SQLModel, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + title: str + description: str + score: int + created_at: datetime = Field(default_factory=datetime.utcnow) + updated_at: datetime = Field(default_factory=datetime.utcnow) diff --git a/src/models/movie.py b/src/models/movie.py new file mode 100644 index 0000000..bd47a04 --- /dev/null +++ b/src/models/movie.py @@ -0,0 +1,14 @@ +from sqlmodel import Field, SQLModel +from datetime import datetime +from typing import Optional + + +class Movie(SQLModel, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + name: str + imdb_id: str + actors: str + plot: str + release_date: datetime + created_at: datetime = Field(default_factory=datetime.utcnow) + updated_at: datetime = Field(default_factory=datetime.utcnow) diff --git a/src/models/score.py b/src/models/score.py new file mode 100644 index 0000000..96665b9 --- /dev/null +++ b/src/models/score.py @@ -0,0 +1,12 @@ +from sqlmodel import Field, SQLModel +from datetime import datetime +from typing import Optional + + +class Score(SQLModel, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + user_id: Optional[int] = Field(default=None, foreign_key="user.id") + movie_id: Optional[int] = Field(default=None, foreign_key="movie.id") + score: int + created_at: datetime = Field(default_factory=datetime.utcnow) + updated_at: datetime = Field(default_factory=datetime.utcnow) diff --git a/src/models/user.py b/src/models/user.py new file mode 100644 index 0000000..a7de8c9 --- /dev/null +++ b/src/models/user.py @@ -0,0 +1,15 @@ +from sqlmodel import Field, SQLModel +from datetime import datetime +from typing import Optional + + +class User(SQLModel, table=True): + id: Optional[int] = Field(default=None, primary_key=True) + name: str + email: str = Field(unique=True) + password: str + avatar_url: str + is_active: bool = Field(default=True) + is_admin: bool = Field(default=False) + created_at: datetime = Field(default_factory=datetime.utcnow) + updated_at: datetime = Field(default_factory=datetime.utcnow) diff --git a/src/routes/__init__.py b/src/routes/__init__.py index e69de29..1616b16 100644 --- a/src/routes/__init__.py +++ b/src/routes/__init__.py @@ -0,0 +1,5 @@ +from .admin import router as admin_router +from .score import router as score_router +from .user import router as user_router +from .card import router as card_router +from .movie import router as movie_router diff --git a/src/routes/admin.py b/src/routes/admin.py new file mode 100644 index 0000000..2920f95 --- /dev/null +++ b/src/routes/admin.py @@ -0,0 +1,43 @@ +from fastapi import APIRouter + +router = APIRouter( + prefix="/admin", + tags=["admin"], + responses={404: {"description": "Not found"}}, +) + + +@router.post("/user") +async def add_user(user: str): + """Add a user to the database""" + return {"user": user} + + +@router.delete("/user") +async def remove_user(user: str): + """Remove a user from the database""" + return {"user": user} + + +@router.post("/movie") +async def add_movie(movie: str): + """Add a movie to the database""" + return {"movie": movie} + + +@router.delete("/movie") +async def remove_movie(movie: str): + """Remove a movie from the database""" + return {"movie": movie} + + +@router.post("/card") +async def add_card(card: str): + """Add a card to the database""" + return {"card": card} + + +@router.delete("/card") +async def remove_card(card: str): + """Remove a card from the database""" + return {"card": card} diff --git a/src/routes/card.py b/src/routes/card.py new file mode 100644 index 0000000..3319706 --- /dev/null +++ b/src/routes/card.py @@ -0,0 +1,7 @@ +from fastapi import APIRouter + +router = APIRouter( + prefix="/card", + tags=["card"], + responses={404: {"description": "Not found"}}, +) diff --git a/src/routes/movie.py b/src/routes/movie.py new file mode 100644 index 0000000..bc9ee44 --- /dev/null +++ b/src/routes/movie.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter + +router = APIRouter( + prefix="/movie", + tags=["movie"], + responses={404: {"description": "Not found"}}, +) + + +@router.get("/") +async def get_movies(): + return {"movies": ["movie1", "movie2", "movie3"]} diff --git a/src/routes/score.py b/src/routes/score.py new file mode 100644 index 0000000..a124cc8 --- /dev/null +++ b/src/routes/score.py @@ -0,0 +1,12 @@ +from fastapi import APIRouter + +router = APIRouter( + prefix="/score", + tags=["score"], + responses={404: {"description": "Not found"}}, +) + + +@router.get("/leaderboard") +async def get_leaderboard(): + return {"leaderboard": ["user1", "user2", "user3"]} diff --git a/src/routes/user.py b/src/routes/user.py new file mode 100644 index 0000000..e924943 --- /dev/null +++ b/src/routes/user.py @@ -0,0 +1,19 @@ +from fastapi import APIRouter + +from models import User + +router = APIRouter( + prefix="/user", + tags=["user"], + responses={404: {"description": "Not found"}}, +) + + +@router.get("/") +async def get_users(): + return {"users": ["user1", "user2", "user3"]} + + +@router.post("/login") +async def login(): + return {"token": "token"}