feat: CRUD ProcessSchema #16

Merged
ivan.dev merged 8 commits from VORKOUT-17 into master 2025-08-05 21:37:07 +05:00
21 changed files with 719 additions and 301 deletions
Showing only changes of commit 3c300f7c7a - Show all commits

View File

@@ -117,59 +117,59 @@ async def get_process_schema_by_title(connection: AsyncConnection, title: str) -
"""
query = select(process_schema_table).where(process_schema_table.c.title == title)
processschema_db_cursor = await connection.execute(query)
process_schema_db_cursor = await connection.execute(query)
processschema_data = processschema_db_cursor.mappings().one_or_none()
if not processschema_data:
process_schema_data = process_schema_db_cursor.mappings().one_or_none()
if not process_schema_data:
return None
return ProcessSchema.model_validate(processschema_data)
return ProcessSchema.model_validate(process_schema_data)
async def get_process_schema_by_id(connection: AsyncConnection, id: int) -> Optional[ProcessSchema]:
"""
Получает processschema по id.
Получает process_schema по id.
"""
query = select(process_schema_table).where(process_schema_table.c.id == id)
processschema_db_cursor = await connection.execute(query)
process_schema_db_cursor = await connection.execute(query)
processschema_data = processschema_db_cursor.mappings().one_or_none()
if not processschema_data:
process_schema_data = process_schema_db_cursor.mappings().one_or_none()
if not process_schema_data:
return None
return ProcessSchema.model_validate(processschema_data)
return ProcessSchema.model_validate(process_schema_data)
async def update_process_schema_by_id(connection: AsyncConnection, update_values, processschema):
async def update_process_schema_by_id(connection: AsyncConnection, update_values, process_schema):
"""
Вносит изменеия в нужное поле таблицы process_schema_table.
"""
await connection.execute(
process_schema_table.update().where(process_schema_table.c.id == processschema.id).values(**update_values)
process_schema_table.update().where(process_schema_table.c.id == process_schema.id).values(**update_values)
)
await connection.commit()
async def create_process_schema(
connection: AsyncConnection, processschema: ProcessSchema, creator_id: int
connection: AsyncConnection, process_schema: ProcessSchema, creator_id: int
) -> Optional[ProcessSchema]:
"""
Создает нове поле в таблице process_schema_table.
"""
query = insert(process_schema_table).values(
title=processschema.title,
description=processschema.description,
owner_id=processschema.owner_id,
title=process_schema.title,
description=process_schema.description,
owner_id=process_schema.owner_id,
creator_id=creator_id,
created_at=datetime.now(timezone.utc),
settings=processschema.settings,
status=processschema.status.value,
settings=process_schema.settings,
status=process_schema.status.value,
)
await connection.execute(query)
await connection.commit()
return processschema
return process_schema

View File

@@ -3,7 +3,7 @@ from api.endpoints.profile import api_router as profile_router
from api.endpoints.account import api_router as account_router
from api.endpoints.keyring import api_router as keyring_router
from api.endpoints.listevents import api_router as listevents_router
from api.endpoints.processschema import api_router as processschema_router
from api.endpoints.process_schema import api_router as processschema_router
list_of_routes = [auth_router, profile_router, account_router, keyring_router, listevents_router, processschema_router]

View File

@@ -1,13 +1,13 @@
from fastapi import APIRouter, Depends, HTTPException, status, Query
from typing import Optional, Dict, Any, List
from typing import Optional, List
from sqlalchemy.ext.asyncio import AsyncConnection
from api.db.connection.session import get_connection_dep
from api.db.logic.account import get_user_by_login
from api.db.logic.processschema import (
from api.db.logic.process_schema import (
get_process_schema_by_title,
create_process_schema,
get_process_schema_by_id,
@@ -32,7 +32,7 @@ from api.services.user_role_validation import (
api_router = APIRouter(
prefix="/process-schema",
prefix="/process_schema",
tags=["process schema"],
)
@@ -78,40 +78,40 @@ async def get_all_process_schema(
return process_schema_page
@api_router.get("/{processschema_id}", dependencies=[Depends(bearer_schema)], response_model=ProcessSchema)
@api_router.get("/{process_schema_id}", dependencies=[Depends(bearer_schema)], response_model=ProcessSchema)
async def get_process_schema(
processschema_id: int,
process_schema_id: int,
connection: AsyncConnection = Depends(get_connection_dep),
current_user=Depends(get_current_user),
):
processschema_validation = await get_process_schema_by_id(connection, processschema_id)
process_schema_validation = await get_process_schema_by_id(connection, process_schema_id)
if processschema_validation is None:
if process_schema_validation is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Process schema not found")
authorize_user = await db_user_role_validation_for_listevents_and_processschema_by_listevent_id(
connection, current_user, processschema_validation.creator_id
connection, current_user, process_schema_validation.creator_id
)
if processschema_id is None:
if process_schema_id is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Process schema not found")
return processschema_validation
return process_schema_validation
@api_router.post("", dependencies=[Depends(bearer_schema)], response_model=ProcessSchema)
async def create_processschema(
processschema: ProcessSchemaUpdate,
process_schema: ProcessSchemaUpdate,
connection: AsyncConnection = Depends(get_connection_dep),
current_user=Depends(get_current_user),
):
user_validation = await get_user_by_login(connection, current_user)
processschema_validation = await get_process_schema_by_title(connection, processschema.title)
process_schema_validation = await get_process_schema_by_title(connection, process_schema.title)
if processschema_validation is None:
await create_process_schema(connection, processschema, user_validation.id)
processschema_new = await get_process_schema_by_title(connection, processschema.title)
return processschema_new
if process_schema_validation is None:
await create_process_schema(connection, process_schema, user_validation.id)
process_schema_new = await get_process_schema_by_title(connection, process_schema.title)
return process_schema_new
else:
raise HTTPException(
@@ -119,58 +119,58 @@ async def create_processschema(
)
@api_router.put("/{processschema_id}", dependencies=[Depends(bearer_schema)], response_model=ProcessSchema)
@api_router.put("/{process_schema_id}", dependencies=[Depends(bearer_schema)], response_model=ProcessSchema)
async def update_process_schema(
processschema_id: int,
processschema_update: ProcessSchemaUpdate,
process_schema_id: int,
process_schema_update: ProcessSchemaUpdate,
connection: AsyncConnection = Depends(get_connection_dep),
current_user=Depends(get_current_user),
):
processschema_validation = await get_process_schema_by_id(connection, processschema_id)
process_schema_validation = await get_process_schema_by_id(connection, process_schema_id)
if processschema_validation is None:
if process_schema_validation is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Process schema not found")
authorize_user = await db_user_role_validation_for_listevents_and_processschema_by_listevent_id(
connection, current_user, processschema_validation.creator_id
connection, current_user, process_schema_validation.creator_id
)
updated_values = processschema_update.model_dump(by_alias=True, exclude_none=True)
updated_values = process_schema_update.model_dump(by_alias=True, exclude_none=True)
if not updated_values:
return processschema_validation
return process_schema_validation
await update_process_schema_by_id(connection, updated_values, processschema_validation)
await update_process_schema_by_id(connection, updated_values, process_schema_validation)
processschema = await get_process_schema_by_id(connection, processschema_id)
process_schema = await get_process_schema_by_id(connection, process_schema_id)
return processschema
return process_schema
@api_router.delete("/{processschema_id}", dependencies=[Depends(bearer_schema)], response_model=ProcessSchema)
@api_router.delete("/{process_schema_id}", dependencies=[Depends(bearer_schema)], response_model=ProcessSchema)
async def delete_process_schema(
processschema_id: int,
process_schema_id: int,
connection: AsyncConnection = Depends(get_connection_dep),
current_user=Depends(get_current_user),
):
processschema_validation = await get_process_schema_by_id(connection, processschema_id)
process_schema_validation = await get_process_schema_by_id(connection, process_schema_id)
if processschema_validation is None:
if process_schema_validation is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Process schema not found")
authorize_user = await db_user_role_validation_for_listevents_and_processschema_by_listevent_id(
connection, current_user, processschema_validation.creator_id
connection, current_user, process_schema_validation.creator_id
)
processschema_update = ProcessSchemaUpdate(status=ProcessStatus.DELETED.value)
process_schema_update = ProcessSchemaUpdate(status=ProcessStatus.DELETED.value)
updated_values = processschema_update.model_dump(by_alias=True, exclude_none=True)
updated_values = process_schema_update.model_dump(by_alias=True, exclude_none=True)
if not updated_values:
return processschema_validation
return process_schema_validation
await update_process_schema_by_id(connection, updated_values, processschema_validation)
await update_process_schema_by_id(connection, updated_values, process_schema_validation)
processschema = await get_process_schema_by_id(connection, processschema_id)
process_schema = await get_process_schema_by_id(connection, process_schema_id)
return processschema
return process_schema

View File

@@ -38,12 +38,7 @@ all_list_event_adapter = TypeAdapter(List[AllListEvent])
class ListEventFilterDTO(Base):
pagination: Dict[str, int] = Field(
default={"page": 1, "limit": 10},
description="Пагинация (номер страницы и количество элементов)",
)
search: Optional[str] = Field(default=None, description="Поиск по текстовым полям (name, title)")
order: Optional[Dict[str, str]] = Field(
default={"field": "id", "direction": "asc"}, description="Сортировка (поле и направление)"
)
filters: Optional[Dict[str, List[str]]] = Field(default=None, description="Фильтрация по точным значениям")
pagination: Dict[str, int]
search: Optional[str] = None
order: Optional[Dict[str, str]] = None
filters: Optional[Dict[str, List[str]]] = None