| """
|
| Database initialization and migration
|
| """
|
| from sqlalchemy import event
|
| from .database import Base, engine, SessionLocal
|
| from .models.user import User, UserRole, UserStatus
|
| import logging
|
|
|
| logger = logging.getLogger(__name__)
|
|
|
| def init_db():
|
| """Initialize database and create default admin user"""
|
| try:
|
|
|
| Base.metadata.create_all(bind=engine)
|
|
|
|
|
| db = SessionLocal()
|
|
|
|
|
| admin = db.query(User).filter(User.role == UserRole.ADMIN).first()
|
| if not admin:
|
|
|
|
|
| admin = User(
|
| username="admin",
|
| password_hash=User.hash_password("admin"),
|
| role=UserRole.ADMIN,
|
| status=UserStatus.ACTIVE
|
| )
|
| db.add(admin)
|
| db.commit()
|
| logger.info("Created default admin user")
|
|
|
| db.close()
|
| logger.info("Database initialized successfully")
|
| return True
|
|
|
| except Exception as e:
|
| logger.error(f"Error initializing database: {e}")
|
| return False
|
|
|
| @event.listens_for(User, 'after_insert')
|
| def user_created(mapper, connection, target):
|
| """Log user creation"""
|
| logger.info(f"New user created: {target.username}")
|
|
|
| @event.listens_for(User.status, 'set')
|
| def user_status_changed(target, value, oldvalue, initiator):
|
| """Log user status changes"""
|
| if oldvalue and value != oldvalue:
|
| logger.info(f"User {target.username} status changed from {oldvalue} to {value}")
|
|
|