crud.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. from sqlalchemy.orm import Session
  2. from sqlalchemy.exc import SQLAlchemyError, IntegrityError
  3. import models, schemas
  4. from utils import hash_password, encrypt_data, decrypt_data
  5. def create_user(db: Session, user: schemas.UserCreate):
  6. """Создает нового пользователя в базе данных на основе предоставленных данных."""
  7. try:
  8. hashed_password = hash_password(user.password)
  9. encrypted_email = encrypt_data(user.email)
  10. db_user = models.User(name=user.name, email=encrypted_email, password=hashed_password)
  11. db.add(db_user)
  12. db.commit()
  13. db.refresh(db_user)
  14. db_user.email = decrypt_data(db_user.email)
  15. return db_user
  16. except IntegrityError:
  17. db.rollback()
  18. raise ValueError("User with this email already exists")
  19. except SQLAlchemyError:
  20. db.rollback()
  21. raise ConnectionError("Database error while creating user")
  22. def get_users(db: Session):
  23. """Получает список всех пользователей из базы данных."""
  24. try:
  25. users = db.query(models.User).all()
  26. for user in users:
  27. user.email = decrypt_data(user.email)
  28. return users
  29. except SQLAlchemyError:
  30. raise ConnectionError("Database error while fetching users")
  31. def get_user(db: Session, user_id: int):
  32. """Получает информацию о пользователе по его ID из базы данных."""
  33. try:
  34. user = db.query(models.User).filter(models.User.id == user_id).first()
  35. if not user:
  36. raise LookupError("User not found")
  37. user.email = decrypt_data(user.email)
  38. return user
  39. except SQLAlchemyError:
  40. raise ConnectionError("Database error while fetching user")
  41. def delete_user(db: Session, user_id: int):
  42. """Удаляет пользователя по его ID из базы данных."""
  43. try:
  44. user = db.query(models.User).filter(models.User.id == user_id).first()
  45. if not user:
  46. raise LookupError("User not found")
  47. db.delete(user)
  48. db.commit()
  49. return user
  50. except SQLAlchemyError:
  51. db.rollback()
  52. raise ConnectionError("Database error while deleting user")
  53. def update_user(db: Session, user_id: int, user_update: schemas.UserCreate):
  54. """Обновляет данные пользователя по его ID."""
  55. try:
  56. user = db.query(models.User).filter(models.User.id == user_id).first()
  57. if not user:
  58. raise LookupError("User not found")
  59. user.name = user_update.name
  60. user.email = encrypt_data(user_update.email)
  61. user.password = hash_password(user_update.password)
  62. db.commit()
  63. db.refresh(user)
  64. user.email = decrypt_data(user.email)
  65. return user
  66. except SQLAlchemyError:
  67. db.rollback()
  68. raise ConnectionError("Database error while updating user")
  69. def create_post(db: Session, post: schemas.PostCreate):
  70. """Создает новый пост в базе данных, проверяя существование пользователя."""
  71. try:
  72. user = db.query(models.User).filter(models.User.id == post.user_id).first()
  73. if not user:
  74. raise LookupError("User does not exist")
  75. db_post = models.Post(**post.dict())
  76. db.add(db_post)
  77. db.commit()
  78. db.refresh(db_post)
  79. return db_post
  80. except IntegrityError:
  81. db.rollback()
  82. raise ValueError("Invalid post data")
  83. except SQLAlchemyError:
  84. db.rollback()
  85. raise ConnectionError("Database error while creating post")
  86. def get_posts(db: Session):
  87. """Получает список всех постов из базы данных."""
  88. try:
  89. return db.query(models.Post).all()
  90. except SQLAlchemyError:
  91. raise ConnectionError("Database error while fetching posts")
  92. def get_post(db: Session, post_id: int):
  93. """Получает информацию о посте по его ID из базы данных."""
  94. try:
  95. post = db.query(models.Post).filter(models.Post.id == post_id).first()
  96. if not post:
  97. raise LookupError("Post not found")
  98. return post
  99. except SQLAlchemyError:
  100. raise ConnectionError("Database error while fetching post")
  101. def update_post(db: Session, post_id: int, post_update: schemas.PostCreate):
  102. """Обновляет данные поста по его ID."""
  103. try:
  104. post = db.query(models.Post).filter(models.Post.id == post_id).first()
  105. if not post:
  106. raise LookupError("Post not found")
  107. for key, value in post_update.dict().items():
  108. setattr(post, key, value)
  109. db.commit()
  110. db.refresh(post)
  111. return post
  112. except SQLAlchemyError:
  113. db.rollback()
  114. raise ConnectionError("Database error while updating post")