Откроем файл routers/category.py, мы увидим в нем следующие методы
get_all_categories- Метод получения всех категорийcreate_category- Метод создания категорииupdate_category- Метод изменения категорииdelete_category- Метод удаления категории
В данном случае, нам необходимо установить права доступа, чтобы покупатели и продавцы не имели доступ к созданию, изменению и удалению категорий. Это право будет только лишь у администраторов интернет магазина. Приступим к установке прав на примере конечной точки создания категорий. В данный момент она у нас выглядит следующим образом:
@router.post('/create')
async def create_category(db: Annotated[AsyncSession, Depends(get_db)], create_category: CreateCategory):
await db.execute(insert(Category).values(name=create_category.name,
parent_id=create_category.parent_id,
slug=slugify(create_category.name)))
await db.commit()
return {
'status_code': status.HTTP_201_CREATED,
'transaction': 'Successful'
}
Добавим зависимость get_current_user() и проверку:
from app.routers.auth import get_current_user
@router.post('/create')
async def create_category(db: Annotated[AsyncSession, Depends(get_db)], create_category: CreateCategory, get_user: Annotated[dict, Depends(get_current_user)]):
if get_user.get('is_admin'):
await db.execute(insert(Category).values(name=create_category.name,
parent_id=create_category.parent_id,
slug=slugify(create_category.name)))
await db.commit()
return {
'status_code': status.HTTP_201_CREATED,
'transaction': 'Successful'
}
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail='You must be admin user for this'
)
Мы добавляем проверку, на параметр is_admin, если True, то выполняем код создания категории, в случае значения False выводим 401 код ошибки.
По аналогии изменим конечные точки отвечающие за изменение или удаление категории:
@router.put('/update_category')
async def update_category(db: Annotated[AsyncSession, Depends(get_db)], category_id: int, update_category: CreateCategory, get_user: Annotated[dict, Depends(get_current_user)]):
if get_user.get('is_admin'):
category = await db.scalar(select(Category).where(Category.id == category_id))
if category is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='There is no category found'
)
await db.execute(update(Category).where(Category.id == category_id).values(
name=update_category.name,
slug=slugify(update_category.name),
parent_id=update_category.parent_id))
await db.commit()
return {
'status_code': status.HTTP_200_OK,
'transaction': 'Category update is successful'
}
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail='You must be admin user for this'
)
@router.delete('/delete')
async def delete_category(db: Annotated[AsyncSession, Depends(get_db)], category_id: int, get_user: Annotated[dict, Depends(get_current_user)]):
if get_user.get('is_admin'):
category = await db.scalar(select(Category).where(Category.id == category_id))
if category is None:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail='There is no category found'
)
await db.execute(update(Category).where(Category.id == category_id).values(is_active=False))
await db.commit()
return {
'status_code': status.HTTP_200_OK,
'transaction': 'Category delete is successful'
}
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail='You must be admin user for this'
)
В этом и заключается основное преимущество использования JWT токена, так как вся необходимая информация содержится уже внутри него, и нам не нужно делать лишние обращения к БД.