from datetime import datetime, timezone from app.extensions import db from werkzeug.security import generate_password_hash, check_password_hash class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True, autoincrement=True) username = db.Column(db.String(50), unique=True, nullable=False) password_hash = db.Column(db.String(255), nullable=False) name = db.Column(db.String(100), nullable=False) created_at = db.Column(db.DateTime, default=datetime.now(timezone.utc)) updated_at = db.Column(db.DateTime, default=datetime.now(timezone.utc), onupdate=datetime.now(timezone.utc)) def __repr__(self): return f'' def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password) @classmethod def create_user(cls, username, password, name): # Check if user already exists if cls.query.filter_by(username=username).first(): raise ValueError("Username already exists") user = cls( username=username, name=name ) user.set_password(password) try: db.session.add(user) db.session.commit() except Exception as e: db.session.rollback() raise ValueError(f"Error creating user: {str(e)}") return user @classmethod def get_user_by_username(cls, username): return cls.query.filter_by(username=username).first() def to_dict(self): return { 'id': self.id, 'username': self.username, 'name': self.name, 'created_at': self.created_at.isoformat() if self.created_at else None, 'updated_at': self.updated_at.isoformat() if self.updated_at else None }