Добавление авторизации и фронтэнда

This commit is contained in:
2025-12-18 18:52:09 +03:00
parent 2c24f66de0
commit 756e941f99
55 changed files with 2314 additions and 577 deletions
+7 -10
View File
@@ -1,25 +1,22 @@
"""Модуль моделей для базы данных"""
from .author import Author
from .book import Book
from .genre import Genre
from .role import Role
from .user import User
from .links import (
AuthorBookLink,
GenreBookLink,
AuthorWithBooks,
BookWithAuthors,
GenreWithBooks,
BookWithGenres,
BookWithAuthorsAndGenres,
UserRoleLink
)
__all__ = [
"Author",
"Book",
"Genre",
"Role",
"User",
"AuthorBookLink",
"AuthorWithBooks",
"BookWithAuthors",
"GenreBookLink",
"GenreWithBooks",
"BookWithGenres",
"BookWithAuthorsAndGenres",
"UserRoleLink",
]
+9 -5
View File
@@ -1,14 +1,18 @@
from typing import List, Optional, TYPE_CHECKING
from sqlmodel import SQLModel, Field, Relationship
from ..dto.author import AuthorBase
from .links import AuthorBookLink
"""Модуль DB-моделей авторов"""
from typing import TYPE_CHECKING, List
from sqlmodel import Field, Relationship
from library_service.models.dto.author import AuthorBase
from library_service.models.db.links import AuthorBookLink
if TYPE_CHECKING:
from .book import Book
class Author(AuthorBase, table=True):
id: Optional[int] = Field(default=None, primary_key=True, index=True)
"""Модель автора в базе данных"""
id: int | None = Field(default=None, primary_key=True, index=True)
books: List["Book"] = Relationship(
back_populates="authors", link_model=AuthorBookLink
)
+9 -5
View File
@@ -1,7 +1,10 @@
from typing import List, Optional, TYPE_CHECKING
from sqlmodel import SQLModel, Field, Relationship
from ..dto.book import BookBase
from .links import AuthorBookLink, GenreBookLink
"""Модуль DB-моделей книг"""
from typing import TYPE_CHECKING, List
from sqlmodel import Field, Relationship
from library_service.models.dto.book import BookBase
from library_service.models.db.links import AuthorBookLink, GenreBookLink
if TYPE_CHECKING:
from .author import Author
@@ -9,7 +12,8 @@ if TYPE_CHECKING:
class Book(BookBase, table=True):
id: Optional[int] = Field(default=None, primary_key=True, index=True)
"""Модель книги в базе данных"""
id: int | None = Field(default=None, primary_key=True, index=True)
authors: List["Author"] = Relationship(
back_populates="books", link_model=AuthorBookLink
)
+9 -5
View File
@@ -1,14 +1,18 @@
from typing import List, Optional, TYPE_CHECKING
from sqlmodel import SQLModel, Field, Relationship
from ..dto.genre import GenreBase
from .links import GenreBookLink
"""Модуль DB-моделей жанров"""
from typing import TYPE_CHECKING, List
from sqlmodel import Field, Relationship
from library_service.models.dto.genre import GenreBase
from library_service.models.db.links import GenreBookLink
if TYPE_CHECKING:
from .book import Book
class Genre(GenreBase, table=True):
id: Optional[int] = Field(default=None, primary_key=True, index=True)
"""Модель жанра в базе данных"""
id: int | None = Field(default=None, primary_key=True, index=True)
books: List["Book"] = Relationship(
back_populates="genres", link_model=GenreBookLink
)
+8 -23
View File
@@ -1,12 +1,9 @@
"""Модуль связей между сущностями в БД"""
from sqlmodel import SQLModel, Field
from typing import List
from library_service.models.dto.author import AuthorRead
from library_service.models.dto.book import BookRead
from library_service.models.dto.genre import GenreRead
class AuthorBookLink(SQLModel, table=True):
"""Модель связи автора и книги"""
author_id: int | None = Field(
default=None, foreign_key="author.id", primary_key=True
)
@@ -14,26 +11,14 @@ class AuthorBookLink(SQLModel, table=True):
class GenreBookLink(SQLModel, table=True):
"""Модель связи жанра и книги"""
genre_id: int | None = Field(default=None, foreign_key="genre.id", primary_key=True)
book_id: int | None = Field(default=None, foreign_key="book.id", primary_key=True)
class AuthorWithBooks(AuthorRead):
books: List[BookRead] = Field(default_factory=list)
class UserRoleLink(SQLModel, table=True):
"""Модель связи роли и пользователя"""
__tablename__ = "user_roles"
class BookWithAuthors(BookRead):
authors: List[AuthorRead] = Field(default_factory=list)
class BookWithGenres(BookRead):
genres: List[GenreRead] = Field(default_factory=list)
class GenreWithBooks(GenreRead):
books: List[BookRead] = Field(default_factory=list)
class BookWithAuthorsAndGenres(BookRead):
authors: List[AuthorRead] = Field(default_factory=list)
genres: List[GenreRead] = Field(default_factory=list)
user_id: int | None = Field(default=None, foreign_key="users.id", primary_key=True)
role_id: int | None = Field(default=None, foreign_key="roles.id", primary_key=True)
+20
View File
@@ -0,0 +1,20 @@
"""Модуль DB-моделей ролей"""
from typing import TYPE_CHECKING, List
from sqlmodel import Field, Relationship
from library_service.models.dto.role import RoleBase
from library_service.models.db.links import UserRoleLink
if TYPE_CHECKING:
from .user import User
class Role(RoleBase, table=True):
"""Модель роли в базе данных"""
__tablename__ = "roles"
id: int | None = Field(default=None, primary_key=True, index=True)
# Связи
users: List["User"] = Relationship(back_populates="roles", link_model=UserRoleLink)
+28
View File
@@ -0,0 +1,28 @@
"""Модуль DB-моделей пользователей"""
from datetime import datetime
from typing import TYPE_CHECKING, List
from sqlmodel import Field, Relationship
from library_service.models.dto.user import UserBase
from library_service.models.db.links import UserRoleLink
if TYPE_CHECKING:
from .role import Role
class User(UserBase, table=True):
"""Модель пользователя в базе данных"""
__tablename__ = "users"
id: int | None = Field(default=None, primary_key=True, index=True)
hashed_password: str = Field(nullable=False)
is_active: bool = Field(default=True)
is_verified: bool = Field(default=False)
created_at: datetime = Field(default_factory=datetime.utcnow)
updated_at: datetime | None = Field(
default=None, sa_column_kwargs={"onupdate": datetime.utcnow}
)
# Связи
roles: List["Role"] = Relationship(back_populates="users", link_model=UserRoleLink)