Pridani skriptu pro pridani elevace, uprava prace s transakcemi

This commit is contained in:
Michal Kváček
2023-09-12 11:00:36 +02:00
parent ed5df4f953
commit 64cb544e2d
22 changed files with 519 additions and 226 deletions
+39 -31
View File
@@ -7,14 +7,14 @@ from sqlalchemy import select
from strawberry.file_uploads import Upload
from config import API_URL
from database import models
from database.models import User
from decorators.endpoints import authenticated_user_only
from decorators.error_logging import error_logging
from dependencies.db import get_session
from graphql_schema.sqlalchemy_to_strawberry_type import strawberry_sqlalchemy_type
from upload_utils import handle_file_upload, delete_file, get_public_url, resize_image
@strawberry_sqlalchemy_type(User, exclude_fields=['password_hashed'])
@strawberry_sqlalchemy_type(models.User, exclude_fields=['password_hashed'])
class User:
async def load_avatar_image_url(root):
if not root.avatar_image_filename:
@@ -40,15 +40,22 @@ class UserQueries:
if len(username) == 0:
raise GraphQLError("Username not set!")
return (await info.context.db.scalars(select(models.User).filter_by(public_username=username))).one()
async with get_session() as db:
user_model = (await db.scalars(select(models.User).filter_by(public_username=username))).one()
user = User(**user_model.as_dict())
return user
@strawberry.field()
@authenticated_user_only()
@error_logging
async def logged_user(root, info) -> User:
return (await info.context.db.scalars(
select(models.User).filter_by(id=info.context.user_id)
)).one()
async with get_session() as db:
user_model = (await db.scalars(
select(models.User).filter_by(id=info.context.user_id)
)).one()
return User(**user_model.as_dict())
@strawberry.type
@@ -66,35 +73,36 @@ class EditUserMutation:
@strawberry.mutation
@authenticated_user_only()
async def edit_logged_user(root, info, input: EditUserInput) -> User:
user = (await info.context.db.scalars(
select(models.User).filter_by(id=info.context.user_id)
)).one()
async with get_session() as db:
user = (await db.scalars(
select(models.User).filter_by(id=info.context.user_id)
)).one()
user_image_path = f"/app/uploads/profile/{user.id}"
data = input.to_dict()
if input.avatar_image:
if user.avatar_image_filename:
delete_file(f"{user_image_path}/{user.avatar_image_filename}", silent=True)
user_image_path = f"/app/uploads/profile/{user.id}"
data = input.to_dict()
if input.avatar_image:
if user.avatar_image_filename:
delete_file(f"{user_image_path}/{user.avatar_image_filename}", silent=True)
data['avatar_image_filename'] = await handle_file_upload(input.avatar_image, user_image_path)
info.context.background_tasks.add_task(
resize_image, path=user_image_path, filename=data['avatar_image_filename'], new_width=400
)
data['avatar_image_filename'] = await handle_file_upload(input.avatar_image, user_image_path)
info.context.background_tasks.add_task(
resize_image, path=user_image_path, filename=data['avatar_image_filename'], new_width=400
)
if input.title_image:
if user.title_image_filename:
delete_file(f"{user_image_path}/{user.title_image_filename}", silent=True)
if input.title_image:
if user.title_image_filename:
delete_file(f"{user_image_path}/{user.title_image_filename}", silent=True)
data['title_image_filename'] = await handle_file_upload(input.title_image, user_image_path)
data['title_image_filename'] = await handle_file_upload(input.title_image, user_image_path)
info.context.background_tasks.add_task(
resize_image, path=user_image_path, filename=data['title_image_filename'], new_width=800
)
info.context.background_tasks.add_task(
resize_image, path=user_image_path, filename=data['title_image_filename'], new_width=800
)
if input.old_password and input.new_password:
if not bcrypt.verify(input.old_password, user.password_hashed):
raise GraphQLError("Bad password")
if input.old_password and input.new_password:
if not bcrypt.verify(input.old_password, user.password_hashed):
raise GraphQLError("Bad password")
data['password_hashed'] = bcrypt.hash(input.new_password)
data['password_hashed'] = bcrypt.hash(input.new_password)
return await models.User.update(info.context.db, obj=user, data=data)
user_model = await models.User.update(db, obj=user, data=data)
return User(**user_model.as_dict())