diff --git a/helpers/programminglanguage_helpers.py b/helpers/programminglanguage_helpers.py new file mode 100644 index 0000000..5fa61ec --- /dev/null +++ b/helpers/programminglanguage_helpers.py @@ -0,0 +1,94 @@ +from typing import List, Optional, Dict, Union +from sqlalchemy.orm import Session +import random +from pydantic import BaseModel, validator +from models.programming_language import ProgrammingLanguage + +def validate_language_name(name: str) -> bool: + """ + Validate programming language name format. + + Args: + name: Programming language name to validate + + Returns: + bool: True if name format is valid, False otherwise + """ + # Language name should be at least 1 character and contain only letters, numbers, and common symbols + return bool(name and len(name.strip()) > 0 and all(c.isalnum() or c in '+-#.' for c in name)) + +def get_random_language(db: Session) -> Optional[ProgrammingLanguage]: + """ + Get a random programming language from the database. + + Args: + db: Database session + + Returns: + Random ProgrammingLanguage object if any exist, None otherwise + """ + languages = db.query(ProgrammingLanguage).all() + return random.choice(languages) if languages else None + +def get_language_by_name(db: Session, name: str) -> Optional[ProgrammingLanguage]: + """ + Get a programming language by its name. + + Args: + db: Database session + name: Language name to search for + + Returns: + ProgrammingLanguage object if found, None otherwise + """ + return db.query(ProgrammingLanguage).filter(ProgrammingLanguage.name == name).first() + +def create_language_safely( + db: Session, + name: str, + description: Optional[str] = None +) -> Union[ProgrammingLanguage, Dict[str, str]]: + """ + Create a new programming language with validation and error handling. + + Args: + db: Database session + name: Language name + description: Optional language description + + Returns: + ProgrammingLanguage object if created successfully, error dict otherwise + """ + if not validate_language_name(name): + return {"error": "Invalid language name format"} + + existing_language = get_language_by_name(db, name) + if existing_language: + return {"error": "Language already exists"} + + db_language = ProgrammingLanguage( + name=name, + description=description + ) + + db.add(db_language) + db.commit() + db.refresh(db_language) + + return db_language + +def filter_languages_by_pattern(db: Session, pattern: str) -> List[ProgrammingLanguage]: + """ + Filter programming languages by name pattern. + + Args: + db: Database session + pattern: Search pattern to filter languages + + Returns: + List of ProgrammingLanguage objects matching the pattern + """ + search = f"%{pattern}%" + return db.query(ProgrammingLanguage).filter( + ProgrammingLanguage.name.ilike(search) + ).all() \ No newline at end of file