Skip to content

Commit

Permalink
Переработаны валидаторы. В CRUDBase заменены методы для извлечения об…
Browse files Browse the repository at this point in the history
…ъекта из БД на 1 универсальный get_by_attr(), переработан код эндпоинтов.
  • Loading branch information
CuriousGecko committed Jul 21, 2024
1 parent 6951f42 commit fe7add9
Show file tree
Hide file tree
Showing 13 changed files with 207 additions and 140 deletions.
24 changes: 16 additions & 8 deletions app/api/endpoints/achievement.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from fastapi import APIRouter, Body, Depends, HTTPException, Response, status
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.validators import check_name_duplicate, check_obj_exists
from app.api.validators import check_obj_duplicate, check_obj_exists
from app.api_docs_responses.achievement import (
CREATE_ACHIEVEMENT, CREATE_ACHIEVEMENT_DESCRIPTION, DELETE_ACHIEVEMENT,
DELETE_ACHIEVEMENT_DESCRIPTION, GET_ACHIEVEMENT,
Expand Down Expand Up @@ -115,7 +115,12 @@ async def create_achievement(
session: AsyncSession = Depends(get_async_session)
):
"""Создать достижение"""
await check_name_duplicate(achievement.name, achievement_crud, session)
obj = await achievement_crud.get_by_attr(
attr_name='name',
attr_value=achievement.name,
session=session,
)
await check_obj_duplicate(obj=obj)
return await achievement_crud.create(obj_in=achievement, session=session)


Expand All @@ -134,13 +139,16 @@ async def update_achievement(
session: AsyncSession = Depends(get_async_session)
):
"""Обновить достижение."""
_achievement = await check_obj_exists(
achievement_id,
achievement_crud,
session
obj = await achievement_crud.get_by_attr(
attr_name='id',
attr_value=achievement_id,
session=session,
)
await check_obj_exists(obj=obj)
return await achievement_crud.update(
_achievement, data, session
db_obj=obj,
obj_in=data,
session=session,
)


Expand All @@ -158,5 +166,5 @@ async def delete_achievement(
):
"""Удалить достижение."""
return await delete_obj(
obj_id=achievement_id, crud=achievement_crud, session=session
obj_id=achievement_id, crud=achievement_crud, session=session,
)
66 changes: 36 additions & 30 deletions app/api/endpoints/course.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from fastapi import APIRouter, Body, Depends, HTTPException, Response, status
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.validators import check_name_duplicate, check_obj_exists
from app.api.validators import check_obj_duplicate, check_obj_exists
from app.api_docs_responses.course import (
CREATE_COURSE, DELETE_COURSE, GET_COURSE, GET_COURSES, GET_USER_COURSE,
GET_USER_COURSES, PATCH_COURSE,
Expand All @@ -12,7 +12,7 @@
from app.core.db import get_async_session
from app.core.user import current_superuser, current_user
from app.crud import course_crud
from app.models import Course, User
from app.models import User
from app.schemas.course import CourseCreate, CourseRead, CourseUpdate
from app.services.endpoints_services import delete_obj
from app.services.utils import (
Expand Down Expand Up @@ -70,19 +70,15 @@ async def get_user_course_id(
session: AsyncSession = Depends(get_async_session),
) -> CourseRead:
"""Возвращает конкретный курс текущего пользователя по id."""
await check_obj_exists(
obj_id=course_id, crud=course_crud, session=session
)
course: Course | None = await course_crud.get_course(
course_id=course_id,
session=session
)
if user not in course.users:
obj = await course_crud.get_course(course_id=course_id, session=session)
await check_obj_exists(obj=obj)

if user not in obj.users:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail='Вы не записаны на данный курс.'
)
return course
return obj


@router.get(
Expand All @@ -95,8 +91,13 @@ async def get_course(
session: AsyncSession = Depends(get_async_session)
):
"""Возвращает курс по id."""
await check_obj_exists(course_id, course_crud, session)
return await course_crud.get(course_id, session)
obj = await course_crud.get_by_attr(
attr_name='id',
attr_value=course_id,
session=session,
)
await check_obj_exists(obj=obj)
return obj


@router.post(
Expand All @@ -112,7 +113,12 @@ async def create_course(
session: AsyncSession = Depends(get_async_session)
):
"""Создать курс."""
await check_name_duplicate(course.name, course_crud, session)
obj = await course_crud.get_by_attr(
attr_name='name',
attr_value=course.name,
session=session,
)
await check_obj_duplicate(obj)
return await course_crud.create(obj_in=course, session=session)


Expand All @@ -129,15 +135,15 @@ async def update_course(
session: AsyncSession = Depends(get_async_session),
) -> CourseRead:
"""Обновляет курс по его id."""
course = await check_obj_exists(
obj_id=course_id, crud=course_crud, session=session
obj = await course_crud.get_course(
course_id=course_id,
session=session,
)
if obj_in.name:
await check_name_duplicate(
name=obj_in.name, crud=course_crud, session=session
)
await check_obj_exists(obj=obj)
return await course_crud.update(
db_obj=course, obj_in=obj_in, session=session
db_obj=obj,
obj_in=obj_in,
session=session,
)


Expand All @@ -156,26 +162,26 @@ async def close_course(
Нельзя удалить курс, если у него уже есть пользователи,
можно лишь закрыть доступ новым пользователям.
"""
await check_obj_exists(
obj_id=course_id, crud=course_crud, session=session
)
course = await course_crud.get_course(
course_id=course_id, session=session
obj = await course_crud.get_course(
course_id=course_id,
session=session,
)
if not course.users:
await check_obj_exists(obj=obj)

if not obj.users:
await delete_obj(
obj_id=course_id, crud=course_crud, session=session
)
return
if course.is_closed:
if obj.is_closed:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail='Данный курс уже закрыт.'
)
course_closed = await course_crud.close_course(
course=course, session=session
course=obj, session=session
)
return {
'course': course_closed,
'message': 'Курс успешно закрыт'
'message': 'Курс успешно закрыт.'
}
32 changes: 24 additions & 8 deletions app/api/endpoints/examination.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from fastapi import APIRouter, Body, Depends, status
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.validators import check_name_duplicate, check_obj_exists
from app.api.validators import check_obj_duplicate, check_obj_exists
from app.api_docs_responses.examination import (
CREATE_EXAMINATION, DELETE_EXAMINATION, GET_EXAMINATION, GET_EXAMINATIONS,
GET_USER_EXAMINATIONS, UPDATE_EXAMINATION,
Expand Down Expand Up @@ -58,7 +58,13 @@ async def get_examination(
session: AsyncSession = Depends(get_async_session)
):
"""Возвращает экзамен по id."""
return await check_obj_exists(examination_id, examination_crud, session)
obj = await examination_crud.get_by_attr(
attr_name='id',
attr_value=examination_id,
session=session,
)
await check_obj_exists(obj=obj)
return obj


@router.post(
Expand All @@ -74,10 +80,13 @@ async def create_examination(
session: AsyncSession = Depends(get_async_session)
):
"""Создать экзамен."""
await check_name_duplicate(examination.name, examination_crud, session)
return await examination_crud.create(
obj_in=examination, session=session
obj = await examination_crud.get_by_attr(
attr_name='name',
attr_value=examination.name,
session=session,
)
await check_obj_duplicate(obj)
return await examination_crud.create(obj_in=examination, session=session)


@router.patch(
Expand All @@ -93,10 +102,17 @@ async def update_examination(
session: AsyncSession = Depends(get_async_session)
):
"""Обновить экзамен."""
_examination = await check_obj_exists(
examination_id, examination_crud, session
obj = await examination_crud.get_by_attr(
attr_name='id',
attr_value=examination_id,
session=session,
)
await check_obj_exists(obj=obj)
return await examination_crud.update(
db_obj=obj,
obj_in=data,
session=session,
)
return await examination_crud.update(_examination, data, session)


@router.delete(
Expand Down
35 changes: 19 additions & 16 deletions app/api/endpoints/group.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from fastapi import APIRouter, Body, Depends, HTTPException, Response, status
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.validators import check_name_duplicate
from app.api.validators import check_obj_duplicate, check_obj_exists
from app.api_docs_responses.group import (
CREATE_GROUP, DELETE_GROUP, GET_GROUP, GET_GROUPS, GET_USER_GROUP,
)
Expand Down Expand Up @@ -35,9 +35,7 @@ async def get_all_groups(
) -> list[GroupRead]:
"""Возвращает все группы."""
groups = await group_crud.get_multi(session)
response = add_response_headers(
response, groups, pagination
)
add_response_headers(response, groups, pagination)
return paginated(groups, pagination)


Expand Down Expand Up @@ -67,18 +65,15 @@ async def get_self_group_by_id(
session: AsyncSession = Depends(get_async_session)
):
"""Получение группы по id юзером."""
group: Group | None = await group_crud.get(group_id, session)
if group is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='Такой группы не существует.'
)
if user not in group.users:
obj: Group | None = await group_crud.get(group_id, session)
await check_obj_exists(obj=obj)

if user not in obj.users:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail='Вы не состоите в этой группе.'
)
return group
return obj


@router.get(
Expand All @@ -92,7 +87,9 @@ async def get_group(
session: AsyncSession = Depends(get_async_session)
):
"""Получение группы по id"""
return await group_crud.get(group_id, session)
obj = await group_crud.get(group_id, session)
await check_obj_exists(obj=obj)
return obj


@router.post(
Expand All @@ -108,7 +105,12 @@ async def create_group(
session: AsyncSession = Depends(get_async_session)
):
"""Создать группу"""
await check_name_duplicate(group.name, group_crud, session)
obj = await group_crud.get_by_attr(
attr_name='name',
attr_value=group.name,
session=session,
)
await check_obj_duplicate(obj=obj)
return await group_crud.create(obj_in=group, session=session)


Expand All @@ -125,8 +127,9 @@ async def update_group(
session: AsyncSession = Depends(get_async_session)
):
"""Обновить группу"""
_group = await group_crud.get(group_id, session)
return await group_crud.update(_group, group, session)
obj = await group_crud.get(group_id=group_id, session=session)
await check_obj_exists(obj=obj)
return await group_crud.update(db_obj=obj, obj_in=group, session=session)


@router.delete(
Expand Down
11 changes: 10 additions & 1 deletion app/api/endpoints/locale.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from fastapi import APIRouter, Depends, status
from sqlalchemy.ext.asyncio import AsyncSession

from app.api.validators import check_obj_duplicate, check_obj_exists
from app.core.db import get_async_session
from app.core.user import current_superuser
from app.crud import locale_crud
Expand All @@ -22,6 +23,12 @@ async def create_locale(
session: AsyncSession = Depends(get_async_session)
):
"""Создать локаль."""
obj = await locale_crud.get_by_attr(
attr_name='language',
attr_value=locale.language,
session=session,
)
await check_obj_duplicate(obj=obj)
return await locale_crud.create(locale=locale, session=session)


Expand All @@ -45,4 +52,6 @@ async def get_locale_by_id(
session: AsyncSession = Depends(get_async_session)
):
"""Получение локали по id."""
return await locale_crud.get_by_id(locale_id, session)
obj = await locale_crud.get_by_id(id=locale_id, session=session)
await check_obj_exists(obj=obj)
return obj
Loading

0 comments on commit fe7add9

Please sign in to comment.