Skip to content

Commit

Permalink
Merge branch 'game-api-v1' into backend
Browse files Browse the repository at this point in the history
  • Loading branch information
codEnjoyer committed Nov 19, 2023
2 parents c6cc2a2 + 78a40e9 commit d15662e
Show file tree
Hide file tree
Showing 30 changed files with 451 additions and 188 deletions.
13 changes: 7 additions & 6 deletions backend/migrations/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,14 @@
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata

from game.map.models import Map
from game.modules.models import Module
from game.levels.models import Level, LevelTheory, LevelTask
from game.units.tasks.models import TaskUnit, EmployeesTask
from game.units.tasks.questions.models import Question, AnswerOption
from game.map import Map
from game.modules import Module
from game.levels import Level
from game.units.tasks import TaskUnit, EmployeesTask
from game.units.theory import TheoryUnit # , TheoryVideo
from game.units.tasks.questions import Question
from game.units.tasks.questions.answers import AnswerOption
from game.units.tasks.proofs.models import Proof, ProofVideos, ProofImages
from game.units.theory.models import TheoryUnit # , TheoryVideo

from users.models import User
from users.tutors.models import Tutor
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""обновляет модели задачи, вопросов и ответов
Revision ID: e545a099be25
Revises: 4e3cf7a2acb2
Create Date: 2023-11-19 22:20:11.830596
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'e545a099be25'
down_revision: Union[str, None] = '4e3cf7a2acb2'
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.add_column('answers', sa.Column('is_correct', sa.Boolean(), nullable=False))
op.alter_column('tasks', 'level_id',
existing_type=sa.UUID(),
nullable=False)
op.add_column('theory_blocks', sa.Column('level_id', sa.UUID(), nullable=False))
op.create_foreign_key(None, 'theory_blocks', 'levels', ['level_id'], ['id'])
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(None, 'theory_blocks', type_='foreignkey')
op.drop_column('theory_blocks', 'level_id')
op.alter_column('tasks', 'level_id',
existing_type=sa.UUID(),
nullable=True)
op.drop_column('answers', 'is_correct')
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""меняет название колонки у ответа
Revision ID: 842b8bf56cef
Revises: e545a099be25
Create Date: 2023-11-19 22:30:13.120331
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = '842b8bf56cef'
down_revision: Union[str, None] = 'e545a099be25'
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.add_column('answers', sa.Column('answer', sa.String(), nullable=False))
op.drop_column('answers', 'content')
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('answers', sa.Column('content', sa.VARCHAR(), autoincrement=False, nullable=False))
op.drop_column('answers', 'answer')
# ### end Alembic commands ###
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
"""удаляет промежуточные таблицы
Revision ID: f074fb69a98a
Revises: 842b8bf56cef
Create Date: 2023-11-20 01:14:38.556334
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'f074fb69a98a'
down_revision: Union[str, None] = '842b8bf56cef'
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.drop_table('level_tasks')
op.drop_table('level_theory_blocks')
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('level_theory_blocks',
sa.Column('level_id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('theory_id', sa.UUID(), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['level_id'], ['levels.id'], name='level_theory_blocks_level_id_fkey'),
sa.ForeignKeyConstraint(['theory_id'], ['theory_blocks.id'], name='level_theory_blocks_theory_id_fkey'),
sa.PrimaryKeyConstraint('level_id', 'theory_id', name='level_theory_blocks_pkey')
)
op.create_table('level_tasks',
sa.Column('level_id', sa.UUID(), autoincrement=False, nullable=False),
sa.Column('task_id', sa.UUID(), autoincrement=False, nullable=False),
sa.ForeignKeyConstraint(['level_id'], ['levels.id'], name='level_tasks_level_id_fkey'),
sa.ForeignKeyConstraint(['task_id'], ['tasks.id'], name='level_tasks_task_id_fkey'),
sa.PrimaryKeyConstraint('level_id', 'task_id', name='level_tasks_pkey')
)
# ### end Alembic commands ###
14 changes: 13 additions & 1 deletion backend/src/game/dependencies.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
from repository.level_repository import LevelRepository
from repository.map_repository import MapRepository
from repository.models_repository import ModuleRepository
from repository.module_repository import ModuleRepository
from repository.task_unit_repository import TaskUnitRepository
from repository.theory_unit_repository import TheoryUnitRepository
from services.level_service import LevelService
from services.map_service import MapService
from services.module_service import ModuleService
from services.task_unit_service import TaskUnitService
from services.theory_unit_service import TheoryUnitService


def map_service() -> MapService:
Expand All @@ -16,5 +20,13 @@ def module_service() -> ModuleService:

def level_service() -> LevelService:
return LevelService(LevelRepository)


def task_unit_service() -> TaskUnitService:
return TaskUnitService(TaskUnitRepository)


def theory_unit_service() -> TheoryUnitService:
return TheoryUnitService(TheoryUnitRepository)
# def users_service():
# return UsersService(UsersRepository)
20 changes: 2 additions & 18 deletions backend/src/game/levels/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,11 +25,9 @@ class Level(BaseModel):

module: Mapped["Module"] = relationship(back_populates='levels')

theory_units: Mapped[list["TheoryUnit"]] = relationship(
secondary="level_theory_blocks", back_populates='level', lazy='selectin')
theory_units: Mapped[list["TheoryUnit"]] = relationship(back_populates='level', lazy='selectin')

task_units: Mapped[list["TaskUnit"]] = relationship(
secondary="level_tasks", back_populates='level', lazy='selectin')
task_units: Mapped[list["TaskUnit"]] = relationship(back_populates='level', lazy='selectin')

def to_read_schema(self) -> LevelRead:
return LevelRead(id=self.id,
Expand All @@ -46,17 +44,3 @@ class EmployeesLevel(BaseModel):
employee_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('employees.id'), nullable=False, primary_key=True)
state: Mapped[LevelStates] = mapped_column(
postgresql.ENUM(LevelStates, name='level_states'), nullable=False, default=LevelStates.NotViewed)


class LevelTask(BaseModel):
__tablename__ = "level_tasks"

level_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('levels.id'), nullable=False, primary_key=True)
task_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('tasks.id'), nullable=False, primary_key=True)


class LevelTheory(BaseModel):
__tablename__ = "level_theory_blocks"

level_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('levels.id'), nullable=False, primary_key=True)
theory_id: Mapped[uuid.UUID] = mapped_column(UUID, ForeignKey('theory_blocks.id'), nullable=False, primary_key=True)
51 changes: 33 additions & 18 deletions backend/src/game/levels/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,34 +5,49 @@
from game.levels.schemas import LevelRead, LevelCreate, LevelUpdate
from utils.types import LevelServiceType

router = APIRouter(prefix="/levels", tags=["Levels"])
router = APIRouter(tags=["Levels"])


@router.get("/")
@router.get("/levels/", tags=['Dev'])
async def root(level_service: LevelServiceType) -> list[LevelRead]:
return await level_service.get_all()


@router.get("/{id}")
async def get_level(id: UUID,
level_service: LevelServiceType) -> LevelRead:
return await level_service.get_one(id)
@router.get("/maps/{map_id}/modules/{module_id}/levels/")
async def get_module_levels(map_id: UUID,
module_id: UUID,
level_service: LevelServiceType) -> list[LevelRead]:
return await level_service.get_all()


@router.get("/maps/{map_id}/modules/{module_id}/levels/{level_id}/")
async def get_module_level(map_id: UUID,
module_id: UUID,
level_id: UUID,
level_service: LevelServiceType) -> LevelRead:
return await level_service.get_one(level_id)


@router.post("/")
async def post_level(level_create: LevelCreate,
level_service: LevelServiceType) -> LevelRead:
@router.post("/maps/{map_id}/modules/{module_id}/levels/")
async def post_level_to_module(map_id: UUID,
module_id: UUID,
level_create: LevelCreate,
level_service: LevelServiceType) -> LevelRead:
return await level_service.create_one(level_create)


@router.delete("/{id}")
async def delete_level(id: UUID,
level_service: LevelServiceType) -> LevelRead:
return await level_service.delete_one(id)
@router.delete("/maps/{map_id}/modules/{module_id}/levels/{level_id}/")
async def delete_level_from_module(map_id: UUID,
module_id: UUID,
level_id: UUID,
level_service: LevelServiceType) -> LevelRead:
return await level_service.delete_one(level_id)


@router.patch("/{id}")
async def update_level(id: UUID,
level_update: LevelUpdate,
level_service: LevelServiceType) -> LevelRead:
return await level_service.update_one(id, level_update)
@router.patch("/maps/{map_id}/modules/{module_id}/levels/{level_id}/")
async def update_level_in_module(map_id: UUID,
module_id: UUID,
level_id: UUID,
level_update: LevelUpdate,
level_service: LevelServiceType) -> LevelRead:
return await level_service.update_one(level_id, level_update)
8 changes: 4 additions & 4 deletions backend/src/game/map/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@


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


@router.get("/{id}")
@router.get("/{id}/")
async def get_map(id: UUID,
map_service: MapServiceType) -> MapRead:
return await map_service.get_one(id)
Expand All @@ -25,13 +25,13 @@ async def post_map(map_create: MapCreate,
return await map_service.create_one(map_create)


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


@router.patch("/{id}")
@router.patch("/{id}/")
async def update_map(id: UUID,
map_update: MapUpdate,
map_service: MapServiceType) -> MapRead:
Expand Down
46 changes: 28 additions & 18 deletions backend/src/game/modules/router.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,39 +6,49 @@
from game.modules.schemas import ModuleRead, ModuleCreate, ModuleUpdate
from utils.types import ModuleServiceType

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


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


@router.get("/{id}")
async def get_module(id: UUID,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.get_one(id)
@router.get("/maps/{map_id}/modules/")
async def get_map_modules(map_id: UUID,
module_service: ModuleServiceType) -> list[ModuleRead]:
return await module_service.get_all()


@router.get("/maps/{map_id}/modules/{module_id}/")
async def get_map_module(map_id: UUID,
module_id: UUID,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.get_one(module_id)


@router.post("/")
async def post_module(module_create: ModuleCreate,
module_service: ModuleServiceType) -> ModuleRead:
@router.post("/maps/{map_id}/modules/")
async def post_module_to_map(map_id: UUID,
module_create: ModuleCreate,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.create_one(module_create)


@router.delete("/{id}")
async def delete_module(id: UUID,
module_service: ModuleServiceType) -> ModuleRead:
@router.delete("/maps/{map_id}/modules/{module_id}/")
async def delete_module_from_map(map_id: UUID,
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)
return await module_service.delete_one(module_id)


@router.patch("/{id}")
async def update_module(id: UUID,
module_update: ModuleUpdate,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.update_one(id, module_update)
@router.patch("/maps/{map_id}/modules/{module_id}/")
async def update_module_on_map(map_id: UUID,
module_id: UUID,
module_update: ModuleUpdate,
module_service: ModuleServiceType) -> ModuleRead:
return await module_service.update_one(module_id, module_update)
4 changes: 2 additions & 2 deletions backend/src/game/units/tasks/enums.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from enum import Enum, auto
from enum import Enum, auto, StrEnum


class TaskTypes(Enum):
class TaskTypes(StrEnum):
Test = auto()


Expand Down
Loading

0 comments on commit d15662e

Please sign in to comment.