Kaadan's picture
initial commit
358dfff
from sqlalchemy import Column, String, CheckConstraint
from .base import Base
import uuid
from utils.password_utils import get_password_hash, verify_password
import re
class User(Base):
__tablename__ = "users"
id = Column(String, primary_key=True, default=lambda: str(uuid.uuid4()), index=True)
first_name = Column(String, nullable=False)
last_name = Column(String, nullable=False)
email = Column(String, unique=True, index=True, nullable=False)
password = Column(String, nullable=False)
role = Column(String, nullable=False) # 'hr' or 'applicant'
# Add constraint to ensure role is either 'hr' or 'applicant'
__table_args__ = (CheckConstraint(role.in_(['hr', 'applicant']), name='valid_role'),)
def set_password(self, password: str):
"""Hash and set the user's password"""
self.password = get_password_hash(password)
def check_password(self, password: str) -> bool:
"""Check if the provided password matches the stored hash"""
return verify_password(password, self.password)
def validate_name(self, name: str) -> bool:
"""Validate that the name contains only letters, spaces, hyphens, and apostrophes"""
if not name:
return False
# Allow letters, spaces, hyphens, and apostrophes, with length between 1 and 50
pattern = r"^[a-zA-Z\s\-']{1,50}$"
return bool(re.match(pattern, name.strip()))
def validate_first_name(self) -> bool:
"""Validate the first name"""
return self.validate_name(self.first_name)
def validate_last_name(self) -> bool:
"""Validate the last name"""
return self.validate_name(self.last_name)