diff --git a/database/crud/games.py b/database/crud/games.py index a64f8d2..09f0d22 100644 --- a/database/crud/games.py +++ b/database/crud/games.py @@ -1,6 +1,7 @@ from time import strftime from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy.future import select +from sqlalchemy.orm import selectinload from .. import models as mdl from .. import schemas as sch diff --git a/database/models/__init__.py b/database/models/__init__.py index 67226bc..ad4ba40 100644 --- a/database/models/__init__.py +++ b/database/models/__init__.py @@ -1,4 +1,11 @@ from .games import Game as Game +from .game_genres import GameGenre as GameGenre + from .movies import Movie as Movie +from .movie_genres import MovieGenre as MovieGenre +from .movie_actors import MovieActor as MovieActor + from .audiobooks import Audiobook as Audiobook +from .audiobook_genres import AudiobookGenre as AudiobookGenre + from .users import User as User diff --git a/database/models/audiobook_genres.py b/database/models/audiobook_genres.py new file mode 100644 index 0000000..696319f --- /dev/null +++ b/database/models/audiobook_genres.py @@ -0,0 +1,25 @@ +from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String +from sqlalchemy.orm import relationship + +from ..database import Base + + +class AudiobookGenre(Base): + __tablename__ = "audiobook_genres" + + id = Column(Integer, primary_key=True) + genre = Column(String, nullable=False, unique=True) + + audiobooks = relationship("Audiobook", secondary="audiobook_to_genre", + lazy="selectin") + + +class AudiobookToGenre(Base): + __tablename__ = "audiobook_to_genre" + __table_args__ = ( + PrimaryKeyConstraint("audiobook_id", "genre_id"), + ) + + audiobook_id = Column(Integer, ForeignKey("audiobooks.id"), nullable=False) + genre_id = Column(Integer, ForeignKey( + "audiobook_genres.id"), nullable=False) diff --git a/database/models/audiobooks.py b/database/models/audiobooks.py index 56ff5d8..0af432b 100644 --- a/database/models/audiobooks.py +++ b/database/models/audiobooks.py @@ -1,4 +1,5 @@ from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import relationship from ..database import Base @@ -14,7 +15,6 @@ class Audiobook(Base): author = Column(String) torrent_file = Column(String, nullable=False) - upload_date = Column(String, nullable=False) fragment = Column(String) update_date = Column(String, nullable=False) language = Column(String) @@ -23,4 +23,7 @@ class Audiobook(Base): duration = Column(String) reader = Column(String) + genres = relationship("AudiobookGenre", secondary="audiobook_to_genre", + lazy="selectin") + owner_id = Column(Integer, ForeignKey("users.id")) diff --git a/database/models/game_genres.py b/database/models/game_genres.py new file mode 100644 index 0000000..3aa405f --- /dev/null +++ b/database/models/game_genres.py @@ -0,0 +1,24 @@ +from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String +from sqlalchemy.orm import relationship + +from ..database import Base + + +class GameGenre(Base): + __tablename__ = "game_genres" + + id = Column(Integer, primary_key=True) + genre = Column(String, nullable=False, unique=True) + + games = relationship("Game", secondary="game_to_genre", + lazy="selectin") + + +class GameToGenre(Base): + __tablename__ = "game_to_genre" + __table_args__ = ( + PrimaryKeyConstraint("game_id", "genre_id"), + ) + + game_id = Column(Integer, ForeignKey("games.id"), nullable=False) + genre_id = Column(Integer, ForeignKey("game_genres.id"), nullable=False) diff --git a/database/models/games.py b/database/models/games.py index 5c766fd..a38d461 100644 --- a/database/models/games.py +++ b/database/models/games.py @@ -1,4 +1,5 @@ from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import relationship from ..database import Base @@ -11,7 +12,6 @@ class Game(Base): cover = Column(String) description = Column(String) torrent_file = Column(String, nullable=False) - upload_date = Column(String, nullable=False) trailer = Column(String) system = Column(String) @@ -27,4 +27,8 @@ class Game(Base): release_date = Column(String) download_size = Column(String) + genres = relationship("GameGenre", secondary="game_to_genre", + lazy="selectin") + owner_id = Column(Integer, ForeignKey("users.id")) + owner = relationship("User", lazy="selectin", viewonly=True) diff --git a/database/models/movie_actors.py b/database/models/movie_actors.py new file mode 100644 index 0000000..10ccf58 --- /dev/null +++ b/database/models/movie_actors.py @@ -0,0 +1,24 @@ +from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String +from sqlalchemy.orm import relationship + +from ..database import Base + + +class MovieActor(Base): + __tablename__ = "movie_actors" + + id = Column(Integer, primary_key=True) + actor = Column(String, nullable=False, unique=True) + + movies = relationship("Movies", secondary="movie_to_actor", + lazy="selectin") + + +class MovieToActor(Base): + __tablename__ = "movie_to_actor" + __table_args__ = ( + PrimaryKeyConstraint("movie_id", "actor_id"), + ) + + movie_id = Column(Integer, ForeignKey("movies.id"), nullable=False) + actor_id = Column(Integer, ForeignKey("movie_actors.id"), nullable=False) diff --git a/database/models/movie_genres.py b/database/models/movie_genres.py new file mode 100644 index 0000000..eed9d57 --- /dev/null +++ b/database/models/movie_genres.py @@ -0,0 +1,24 @@ +from sqlalchemy import Column, Integer, ForeignKey, PrimaryKeyConstraint, String +from sqlalchemy.orm import relationship + +from ..database import Base + + +class MovieGenre(Base): + __tablename__ = "movie_genres" + + id = Column(Integer, primary_key=True) + genre = Column(String, nullable=False, unique=True) + + movies = relationship("Movies", secondary="movie_to_genre", + lazy="selectin") + + +class MovieToGenre(Base): + __tablename__ = "movie_to_genre" + __table_args__ = ( + PrimaryKeyConstraint("movie_id", "genre_id"), + ) + + movie_id = Column(Integer, ForeignKey("movies.id"), nullable=False) + genre_id = Column(Integer, ForeignKey("movie_genres.id"), nullable=False) diff --git a/database/models/movies.py b/database/models/movies.py index c447d99..99eddbc 100644 --- a/database/models/movies.py +++ b/database/models/movies.py @@ -1,4 +1,5 @@ from sqlalchemy import Column, ForeignKey, Integer, String +from sqlalchemy.orm import relationship from ..database import Base @@ -14,7 +15,6 @@ class Movie(Base): description = Column(String) torrent_file = Column(String, nullable=False) - upload_date = Column(String, nullable=False) trailer = Column(String) update_date = Column(String, nullable=False) language = Column(String) @@ -25,4 +25,10 @@ class Movie(Base): duration = Column(String) country = Column(String) + genres = relationship("MovieGenre", secondary="movie_to_genre", + lazy="selectin") + + actors = relationship("MovieActor", secondary="movie_to_actor", + lazy="selectin") + owner_id = Column(Integer, ForeignKey("users.id")) diff --git a/database/models/users.py b/database/models/users.py index 04df645..c747156 100644 --- a/database/models/users.py +++ b/database/models/users.py @@ -11,3 +11,7 @@ class User(Base): email = Column(String, nullable=False, unique=True) name = Column(String, nullable=False) hash_of_password = Column(String, nullable=False) + + games = relationship("Game", viewonly=True) + movies = relationship("Movie", viewonly=True) + audiobooks = relationship("Audiobook", viewonly=True) diff --git a/database/schemas/__init__.py b/database/schemas/__init__.py index 4d11ab3..79e1494 100644 --- a/database/schemas/__init__.py +++ b/database/schemas/__init__.py @@ -1,4 +1,11 @@ from .games import * +from .game_genres import * + from .movies import * +from .movie_genres import * +from .movie_actors import * + from .audiobooks import * +from .audiobook_genres import * + from .users import * diff --git a/database/schemas/audiobook_genres.py b/database/schemas/audiobook_genres.py new file mode 100644 index 0000000..d9f98bf --- /dev/null +++ b/database/schemas/audiobook_genres.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel, ConfigDict, Field + + +class AudiobookGenreBase(BaseModel): + genre: str = Field(default=None, examples=["Боевик"]) + + +class AudiobookGenreCreate(AudiobookGenreBase): + pass + + +class AudiobookGenre(AudiobookGenreBase): + id: int = Field(examples=[1]) + + model_config = ConfigDict(from_attributes=True) diff --git a/database/schemas/audiobooks.py b/database/schemas/audiobooks.py index eacb896..3d8c336 100644 --- a/database/schemas/audiobooks.py +++ b/database/schemas/audiobooks.py @@ -1,6 +1,9 @@ from typing import Optional from pydantic import BaseModel, ConfigDict, Field +from .users import UserOpenData as User +from .audiobook_genres import AudiobookGenre + class AudiobookCardBase(BaseModel): title: str = Field(examples=["Марсианин"]) @@ -39,13 +42,15 @@ class AudiobookBase(AudiobookCardBase): class AudiobookCreate(AudiobookBase): - pass + genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]]) class Audiobook(AudiobookBase): id: int = Field(examples=[1]) update_date: str = Field(examples=["2024-06-14 12:00:00"]) - upload_date: str = Field(examples=["2024-06-14 12:00:00"]) - owner_id: int = Field(examples=[1]) + + genres: list[AudiobookGenre] = Field() + + owner: User = Field() model_config = ConfigDict(from_attributes=True) diff --git a/database/schemas/game_genres.py b/database/schemas/game_genres.py new file mode 100644 index 0000000..cfdc1be --- /dev/null +++ b/database/schemas/game_genres.py @@ -0,0 +1,16 @@ +from typing import Optional +from pydantic import BaseModel, ConfigDict, Field + + +class GameGenreBase(BaseModel): + genre: str = Field(default=None, examples=["Стратегия"]) + + +class GameGenreCreate(GameGenreBase): + pass + + +class GameGenre(GameGenreBase): + id: int = Field(examples=[1]) + + model_config = ConfigDict(from_attributes=True) diff --git a/database/schemas/games.py b/database/schemas/games.py index 206d6b9..51a277c 100644 --- a/database/schemas/games.py +++ b/database/schemas/games.py @@ -1,6 +1,9 @@ from typing import Optional from pydantic import BaseModel, ConfigDict, Field +from .users import UserOpenData as User +from .game_genres import GameGenre + class GameCardBase(BaseModel): title: str = Field(examples=["DwarfFortress"]) @@ -40,13 +43,15 @@ class GameBase(GameCardBase): class GameCreate(GameBase): - pass + genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]]) class Game(GameBase): id: int = Field(examples=[1]) update_date: str = Field(examples=["2024-05-13 12:00:00"]) - upload_date: str = Field(examples=["2024-05-13 12:00:00"]) - owner_id: int = Field(examples=[1]) + + genres: list[GameGenre] = Field() + + owner: User = Field() model_config = ConfigDict(from_attributes=True) diff --git a/database/schemas/movie_actors.py b/database/schemas/movie_actors.py new file mode 100644 index 0000000..5604547 --- /dev/null +++ b/database/schemas/movie_actors.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel, ConfigDict, Field + + +class MovieActorBase(BaseModel): + actor: str = Field(default=None, examples=["Мэттью Макконахи"]) + + +class MovieActorCreate(MovieActorBase): + pass + + +class MovieActor(MovieActorBase): + id: int = Field(examples=[1]) + + model_config = ConfigDict(from_attributes=True) diff --git a/database/schemas/movie_genres.py b/database/schemas/movie_genres.py new file mode 100644 index 0000000..7f7a8fc --- /dev/null +++ b/database/schemas/movie_genres.py @@ -0,0 +1,15 @@ +from pydantic import BaseModel, ConfigDict, Field + + +class MovieGenreBase(BaseModel): + genre: str = Field(default=None, examples=["Фантастика"]) + + +class MovieGenreCreate(MovieGenreBase): + pass + + +class MovieGenre(MovieGenreBase): + id: int = Field(examples=[1]) + + model_config = ConfigDict(from_attributes=True) diff --git a/database/schemas/movies.py b/database/schemas/movies.py index 50d4d09..2711d9c 100644 --- a/database/schemas/movies.py +++ b/database/schemas/movies.py @@ -1,6 +1,10 @@ from typing import Optional from pydantic import BaseModel, ConfigDict, Field +from .users import UserOpenData as User +from .movie_genres import MovieGenre +from .movie_actors import MovieActor + class MovieCardBase(BaseModel): title: str = Field(examples=["Интерстеллар"]) @@ -43,13 +47,17 @@ class MovieBase(MovieCardBase): class MovieCreate(MovieBase): - pass + genres: Optional[list[int]] = Field(default=None, examples=[[1, 2]]) + actors: Optional[list[int]] = Field(default=None, examples=[[1, 2]]) class Movie(MovieBase): id: int = Field(examples=[1]) update_date: str = Field(examples=["2024-06-11 12:00:00"]) - upload_date: str = Field(examples=["2024-06-11 12:00:00"]) - owner_id: int = Field(examples=[1]) + + genres: list[MovieGenre] = Field() + actors: list[MovieActor] = Field() + + owner: User = Field() model_config = ConfigDict(from_attributes=True)