demo_seed.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import logging
  2. from sqlalchemy.exc import SQLAlchemyError
  3. from sqlalchemy.orm import sessionmaker
  4. from app.bootstrap.settings import AuthServiceSettings
  5. from app.domain.repositories import (
  6. RoleAssignmentRepository,
  7. RolePermissionBindingRepository,
  8. RoleRepository,
  9. UserRepository,
  10. )
  11. from app.infrastructure.passwords import hash_password
  12. logger = logging.getLogger(__name__)
  13. def bootstrap_demo_identity(
  14. *,
  15. settings: AuthServiceSettings,
  16. session_factory: sessionmaker) -> None:
  17. if not settings.demo_user_bootstrap_enabled or settings.service_env != "local":
  18. return
  19. db = session_factory()
  20. try:
  21. users = UserRepository(db)
  22. if users.has_any():
  23. return
  24. user = users.create(
  25. username=settings.demo_user_username,
  26. password_hash=hash_password(settings.demo_user_password),
  27. display_name=settings.demo_user_display_name,
  28. email=settings.demo_user_email,
  29. metadata_json={"source": "local-bootstrap"})
  30. roles = RoleRepository(db)
  31. role = roles.get_by_name(name="Administrator")
  32. if role is None:
  33. role = roles.create(
  34. code="administrator",
  35. name="Administrator",
  36. description="Local bootstrap administrator",
  37. permissions_json=[])
  38. RoleAssignmentRepository(db).create(
  39. user_id=user.id,
  40. role_id=role.id,
  41. scope_type=None,
  42. scope_id=None,
  43. expires_time=None)
  44. RolePermissionBindingRepository(db).create(
  45. role_id=role.id,
  46. permission="*",
  47. scope_type=None,
  48. scope_id=None)
  49. except SQLAlchemyError as exc:
  50. db.rollback()
  51. logger.warning("Skipped demo identity bootstrap: %s", exc)
  52. finally:
  53. db.close()