Запустим сервер и приступим к тестированию. Первым делом создадим нового пользователя, которого мы потом назначим как продавца:
Если мы сейчас перейдем в БД, то увидим что данный пользователь был создан как покупатель. То есть поле is_customer = True
Авторизуемся как администратор, нажав на кнопку «Authorize» в правом верхнем углу документации. И перейдем в конечную точку Supplier Permission. Введем id созданного пользователя и отправим запрос:
В результате мы получим ответ, что пользователь стал продавцом. Зайдем в БД, и посмотрим значения полей этого пользователя:
Поле is_supplier стало равно True, а поле is_customer = False, что означает что этот пользователь теперь будет считаться как продавец. Наша конечная точка прекрасно работает, также добавим конечную точку, для удаления пользователей.
@router.delete('/delete')
async def delete_user(db: Annotated[AsyncSession, Depends(get_db)], get_user: Annotated[dict, Depends(get_current_user)], user_id: int):
if get_user.get('is_admin'):
user = await db.scalar(select(User).where(User.id == user_id))
if user.is_admin:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="You can't delete admin user"
)
if user.is_active:
await db.execute(update(User).where(User.id == user_id).values(is_active=False))
await db.commit()
return {
'status_code': status.HTTP_200_OK,
'detail': 'User is deleted'
}
else:
await db.execute(update(User).where(User.id == user_id).values(is_active=True))
await db.commit()
return {
'status_code': status.HTTP_200_OK,
'detail': 'User is activated'
}
else:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="You don't have admin permission"
)
Данный код, почти не отличается от предыдущего, основное отличие, что мы будем менять значение поля is_active у пользователей. Проверим работу, отправив запрос:
Мы видим что мы удалили пользователя, установив значение is_active = False. Если мы отправим запрос еще раз, то активируем пользователя:
В следующем шаге, мы доработаем маршруты products и category, для установки в них прав доступа.