users.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. from typing import Any, List
  2. from fastapi import APIRouter, Body, Depends, HTTPException
  3. from fastapi.encoders import jsonable_encoder
  4. from sqlalchemy.orm import Session
  5. from backend.app.core import security
  6. from backend.app.core.database import get_db
  7. from backend.app.models import sql_models
  8. from backend.app.schemas import schemas
  9. from backend.app.api import deps
  10. router = APIRouter()
  11. @router.get("", response_model=List[schemas.User])
  12. def read_users(
  13. db: Session = Depends(get_db),
  14. skip: int = 0,
  15. limit: int = 100,
  16. current_user: sql_models.User = Depends(deps.get_current_active_superuser),
  17. ) -> Any:
  18. """
  19. Retrieve users.
  20. """
  21. users = db.query(sql_models.User).offset(skip).limit(limit).all()
  22. return users
  23. @router.post("", response_model=schemas.User)
  24. def create_user(
  25. *,
  26. db: Session = Depends(get_db),
  27. user_in: schemas.UserCreate,
  28. current_user: sql_models.User = Depends(deps.get_current_active_superuser),
  29. ) -> Any:
  30. """
  31. Create new user.
  32. """
  33. user = db.query(sql_models.User).filter(sql_models.User.username == user_in.username).first()
  34. if user:
  35. raise HTTPException(
  36. status_code=400,
  37. detail="The user with this username already exists in the system.",
  38. )
  39. hashed_password = security.get_password_hash(user_in.password)
  40. db_user = sql_models.User(
  41. username=user_in.username,
  42. hashed_password=hashed_password,
  43. is_active=user_in.is_active,
  44. is_superuser=user_in.is_superuser,
  45. )
  46. db.add(db_user)
  47. db.commit()
  48. db.refresh(db_user)
  49. return db_user
  50. @router.put("/{user_id}", response_model=schemas.User)
  51. def update_user(
  52. *,
  53. db: Session = Depends(get_db),
  54. user_id: int,
  55. user_in: schemas.UserUpdate,
  56. current_user: sql_models.User = Depends(deps.get_current_active_superuser),
  57. ) -> Any:
  58. """
  59. Update a user.
  60. """
  61. user = db.query(sql_models.User).filter(sql_models.User.id == user_id).first()
  62. if not user:
  63. raise HTTPException(
  64. status_code=404,
  65. detail="The user with this id does not exist in the system",
  66. )
  67. # Check if username collision if logic allowed changing username (but UserUpdate doesn't have username)
  68. # So we just update fields
  69. if user_in.password:
  70. user.hashed_password = security.get_password_hash(user_in.password)
  71. if user_in.is_active is not None:
  72. user.is_active = user_in.is_active
  73. if user_in.is_superuser is not None:
  74. user.is_superuser = user_in.is_superuser
  75. db.add(user)
  76. db.commit()
  77. db.refresh(user)
  78. return user
  79. @router.delete("/{user_id}", response_model=schemas.User)
  80. def delete_user(
  81. *,
  82. db: Session = Depends(get_db),
  83. user_id: int,
  84. current_user: sql_models.User = Depends(deps.get_current_active_superuser),
  85. ) -> Any:
  86. """
  87. Delete a user.
  88. """
  89. user = db.query(sql_models.User).filter(sql_models.User.id == user_id).first()
  90. if not user:
  91. raise HTTPException(
  92. status_code=404,
  93. detail="The user with this id does not exist in the system",
  94. )
  95. if user.id == current_user.id:
  96. raise HTTPException(
  97. status_code=400,
  98. detail="Users cannot delete themselves",
  99. )
  100. db.delete(user)
  101. db.commit()
  102. return user