Skip to content

Commit

Permalink
Merge branch 'backend' into frontend
Browse files Browse the repository at this point in the history
  • Loading branch information
semant1cs committed Nov 18, 2023
2 parents 03ebafe + cf1ef36 commit ad74f5f
Show file tree
Hide file tree
Showing 30 changed files with 426 additions and 125 deletions.
5 changes: 3 additions & 2 deletions backend/docker-launch.sh
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/bin/bash
# При запуске стоит указывать здесь номер последней миграции
alembic upgrade b71a5f16b60e
alembic revision --autogenerate
alembic upgrade head || alembic upgrade b71a5f16b60e
cd src || exit
gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind=0.0.0.0:"$BACK_APP_PORT" --timeout 300
gunicorn main:app --workers 1 --worker-class uvicorn.workers.UvicornWorker --bind=0.0.0.0:"$BACK_APP_PORT" --timeout 300
40 changes: 40 additions & 0 deletions backend/migrations/versions/2023_11_18_1723-29ed19cdffbf_.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""empty message
Revision ID: 29ed19cdffbf
Revises: b71a5f16b60e
Create Date: 2023-11-18 17:23:49.682134
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '29ed19cdffbf'
down_revision: Union[str, None] = 'b71a5f16b60e'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('modules', 'previous_module_id',
existing_type=sa.UUID(),
nullable=True)
op.alter_column('modules', 'next_module_id',
existing_type=sa.UUID(),
nullable=True)
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.alter_column('modules', 'next_module_id',
existing_type=sa.UUID(),
nullable=False)
op.alter_column('modules', 'previous_module_id',
existing_type=sa.UUID(),
nullable=False)
# ### end Alembic commands ###
3 changes: 2 additions & 1 deletion backend/src/auth/base_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ def get_jwt_strategy() -> JWTStrategy:
[auth_backend],
)

current_active_user = fastapi_users.current_user(active=True)
current_user = fastapi_users.current_user()
current_superuser = fastapi_users.current_user(superuser=True)
6 changes: 1 addition & 5 deletions backend/src/database.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,12 @@
import asyncio
from typing import AsyncGenerator

from sqlalchemy import MetaData
from sqlalchemy.orm import declarative_base, DeclarativeBase
from sqlalchemy.orm import DeclarativeBase
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine

from settings import Settings


# metadata = MetaData()
# BaseModel = declarative_base(metadata=metadata)

class BaseModel(DeclarativeBase):
repr_cols_num = 3
repr_cols = tuple()
Expand Down
15 changes: 15 additions & 0 deletions backend/src/game/dependencies.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from repository.map_repository import MapRepository
from repository.models_repository import ModuleRepository
from services.map_service import MapService
from services.module_service import ModuleService


def map_service() -> MapService:
return MapService(MapRepository)


def module_service() -> ModuleService:
return ModuleService(ModuleRepository)

# def users_service():
# return UsersService(UsersRepository)
1 change: 1 addition & 0 deletions backend/src/game/levels/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .models import Level
6 changes: 3 additions & 3 deletions backend/src/game/levels/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,9 @@ class Level(BaseModel):
module_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('modules.id'), nullable=False)
name: Mapped[str] = mapped_column(String(length=255), nullable=False)

module: Mapped["Module"] = relationship(back_populates='level')
theory: Mapped[list["TheoryUnit"]] = relationship(secondary="level_theory_blocks", back_populates='level')
tasks: Mapped[list["TaskUnit"]] = relationship(secondary="level_tasks", back_populates='level')
module: Mapped["Module"] = relationship(back_populates='levels')
# theory: Mapped[list["TheoryUnit"]] = relationship(secondary="level_theory_blocks", back_populates='level')
# tasks: Mapped[list["TaskUnit"]] = relationship(secondary="level_tasks", back_populates='level')


class EmployeesLevel(BaseModel):
Expand Down
13 changes: 9 additions & 4 deletions backend/src/game/levels/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,20 +5,25 @@

class __LevelBase(BaseModel):
module_id: UUID
name: str
title: str
theory_units_id: list[UUID] | None
task_units_id: list[UUID] | None

model_config = ConfigDict(from_attributes=True)


class LevelRead(__LevelBase):
id: UUID
is_accomplished: bool
theory_units_id: list[UUID]
task_units_id: list[UUID]


class LevelCreate(__LevelBase):
pass


class LevelUpdate(__LevelBase):
module_id: UUID | None
name: str | None
module_id: UUID | None = None
title: str | None = None
theory_units_id: list[UUID] | None = None
task_units_id: list[UUID] | None = None
1 change: 1 addition & 0 deletions backend/src/game/map/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .models import Map
10 changes: 9 additions & 1 deletion backend/src/game/map/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
import uuid

from sqlalchemy import String, UUID
from sqlalchemy.ext.associationproxy import AssociationProxy, association_proxy
from sqlalchemy.orm import Mapped, mapped_column, relationship

from database import BaseModel
from game.map.schemas import MapRead, MapCreate

if typing.TYPE_CHECKING:
from game.modules.models import Module
Expand All @@ -16,4 +18,10 @@ class Map(BaseModel):
id: Mapped[uuid.UUID] = mapped_column(UUID, primary_key=True, default=uuid.uuid4)
title: Mapped[str] = mapped_column(String(length=255), nullable=False)

modules: Mapped[list["Module"]] = relationship(back_populates='map')
modules: Mapped[list["Module"]] = relationship(back_populates='map', lazy='selectin')
modules_ids: AssociationProxy[list[uuid.UUID]] = association_proxy('modules', 'id')

def to_read_schema(self) -> MapRead:
return MapRead(id=self.id,
title=self.title,
modules_ids=self.modules_ids)
25 changes: 15 additions & 10 deletions backend/src/game/map/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,31 +3,36 @@
from fastapi import APIRouter

from game.map.schemas import MapRead, MapCreate, MapUpdate
from utils.types import MapServiceType

router = APIRouter(prefix="/maps", tags=["Map"])


@router.get("/")
async def root() -> list[MapRead]:
return []
async def root(map_service: MapServiceType) -> list[MapRead]:
return await map_service.get_all()


@router.get("/{id}")
async def get_map(id: UUID) -> MapRead:
return MapRead()
async def get_map(id: UUID,
map_service: MapServiceType) -> MapRead:
return await map_service.get_one(id)


@router.post("/")
async def post_map(map_create: MapCreate) -> MapRead:
return MapRead()
async def post_map(map_create: MapCreate,
map_service: MapServiceType) -> UUID:
return await map_service.create_one(map_create)


@router.delete("/{id}")
async def delete_map(id: UUID) -> MapRead:
return MapRead()
async def delete_map(id: UUID,
map_service: MapServiceType) -> MapRead:
return await map_service.delete_one(id)


@router.patch("/{id}")
async def update_map(id: UUID,
map_update: MapUpdate) -> MapRead:
return MapRead()
map_update: MapUpdate,
map_service: MapServiceType) -> MapRead:
return await map_service.update_one(id, map_update)
8 changes: 6 additions & 2 deletions backend/src/game/map/schemas.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,25 @@
import uuid
from uuid import UUID

from pydantic import BaseModel, ConfigDict

from game.modules.schemas import ModuleRead


class __MapBase(BaseModel):
name: str
title: str

model_config = ConfigDict(from_attributes=True)


class MapRead(__MapBase):
id: UUID
modules_ids: list[UUID]


class MapCreate(__MapBase):
pass


class MapUpdate(__MapBase):
name: str | None
title: str | None = None
1 change: 1 addition & 0 deletions backend/src/game/modules/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .models import Module
30 changes: 21 additions & 9 deletions backend/src/game/modules/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,23 +2,35 @@
import uuid

from sqlalchemy import String, UUID, ForeignKey
from sqlalchemy.ext.associationproxy import AssociationProxy, association_proxy
from sqlalchemy.orm import Mapped, mapped_column, relationship

from database import BaseModel

if typing.TYPE_CHECKING:
from game.levels.models import Level
from game.modules.schemas import ModuleRead
from game.levels import Level
from game.map import Map


class Module(BaseModel):
__tablename__ = 'modules'

id: Mapped[uuid.UUID] = mapped_column(UUID, primary_key=True, default=uuid.uuid4)
previous_module_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('modules.id'))
next_module_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('modules.id'))
map_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('maps.id'))
title: Mapped[str] = mapped_column(String(length=255), nullable=False)
map_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('maps.id'))
previous_module_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('modules.id'), nullable=True)
next_module_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('modules.id'), nullable=True)

map: Mapped["Map"] = relationship(back_populates='modules', lazy='selectin')
levels: Mapped[list["Level"]] = relationship(back_populates='module', lazy='selectin')
levels_ids: AssociationProxy[list[uuid.UUID]] = association_proxy('levels', 'id')

# next_module: Mapped["Module"] = relationship(back_populates='previous_module')
# previous_module: Mapped["Module"] = relationship(back_populates='next_module')

levels: Mapped[list["Level"]] = relationship(back_populates='module')
next_module: Mapped["Module"] = relationship(back_populates='previous_module')
previous_module: Mapped["Module"] = relationship(back_populates='next_module')
def to_read_schema(self) -> ModuleRead:
return ModuleRead(id=self.id,
title=self.title,
map_id=self.map_id,
previous_module_id=self.previous_module_id,
next_module_id=self.next_module_id,
levels_ids=self.levels_ids)
33 changes: 22 additions & 11 deletions backend/src/game/modules/router.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,44 @@
from uuid import UUID

from fastapi import APIRouter
from fastapi import APIRouter, HTTPException, status
from sqlalchemy.exc import NoResultFound

from game.modules.schemas import ModuleRead, ModuleCreate, ModuleUpdate
from utils.types import ModuleServiceType

router = APIRouter(prefix="/modules", tags=["Module"])


@router.get("/")
async def root() -> list[ModuleRead]:
return []
async def root(module_service: ModuleServiceType) -> list[ModuleRead]:
return await module_service.get_all()


@router.get("/{id}")
async def get_module(id: UUID) -> ModuleRead:
return ModuleRead()
async def get_module(id: UUID,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.get_one(id)


@router.post("/")
async def post_module(module_create: ModuleCreate) -> ModuleRead:
return ModuleRead()
async def post_module(module_create: ModuleCreate,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.create_one(module_create)


@router.delete("/{id}")
async def delete_module(id: UUID) -> ModuleRead:
return ModuleRead()
async def delete_module(id: UUID,
module_service: ModuleServiceType) -> ModuleRead:
# TODO: Добавить обработку ошибок
# try:
# deleted_module =
# except NoResultFound as exc:
# raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=exc.args)
return await module_service.delete_one(id)


@router.patch("/{id}")
async def update_module(id: UUID,
module_update: ModuleUpdate) -> ModuleRead:
return ModuleRead()
module_update: ModuleUpdate,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.update_one(id, module_update)
14 changes: 8 additions & 6 deletions backend/src/game/modules/schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,24 @@


class __ModuleBase(BaseModel):
previous_module_id: UUID
next_module_id: UUID
name: str
map_id: UUID
title: str
previous_module_id: UUID | None
next_module_id: UUID | None

model_config = ConfigDict(from_attributes=True)


class ModuleRead(__ModuleBase):
id: UUID
levels_ids: list[UUID]


class ModuleCreate(__ModuleBase):
pass


class ModuleUpdate(__ModuleBase):
previous_module_id: UUID | None
next_module_id: UUID | None
name: str | None
title: str | None = None
previous_module_id: UUID | None = None
next_module_id: UUID | None = None
Loading

0 comments on commit ad74f5f

Please sign in to comment.