94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
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() |