From 23c569a7a63ee7a7d56d30adc1d3e20d67f7722b Mon Sep 17 00:00:00 2001 From: Backend IM Bot Date: Wed, 26 Mar 2025 22:29:01 +0000 Subject: [PATCH] Add helper functions for Country --- helpers/country_helpers.py | 102 +++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 helpers/country_helpers.py diff --git a/helpers/country_helpers.py b/helpers/country_helpers.py new file mode 100644 index 0000000..252df81 --- /dev/null +++ b/helpers/country_helpers.py @@ -0,0 +1,102 @@ +from typing import List, Optional, Dict, Union +from sqlalchemy.orm import Session +from sqlalchemy import func +from models.country import Country +from pydantic import BaseModel, constr + +def validate_country_code(country_code: str) -> bool: + """ + Validate that country code is exactly 2 characters and contains only letters. + + Args: + country_code: The country code to validate + + Returns: + bool: True if valid, False otherwise + """ + if len(country_code) != 2: + return False + return country_code.isalpha() + +def search_countries(db: Session, search_query: Optional[str] = None) -> List[Country]: + """ + Search for countries that start with the given search query. + + Args: + db: Database session + search_query: Optional search string to filter country names + + Returns: + List of matching Country objects + """ + query = db.query(Country) + + if search_query: + query = query.filter(Country.name.ilike(f'{search_query}%')) + + return query.order_by(Country.name).all() + +def get_country_by_code(db: Session, country_code: str) -> Optional[Country]: + """ + Get a country by its unique code. + + Args: + db: Database session + country_code: Two letter country code + + Returns: + Country object if found, None otherwise + """ + return db.query(Country).filter(Country.code == country_code.upper()).first() + +def create_country_safely(db: Session, name: str, code: str) -> Union[Country, Dict[str, str]]: + """ + Create a new country with validation and error handling. + + Args: + db: Database session + name: Country name + code: Country code + + Returns: + Country object if created successfully, error dict otherwise + """ + if not validate_country_code(code): + return {"error": "Invalid country code format"} + + existing_country = db.query(Country).filter( + func.lower(Country.name) == name.lower() + ).first() + + if existing_country: + return {"error": "Country name already exists"} + + existing_code = get_country_by_code(db, code) + if existing_code: + return {"error": "Country code already exists"} + + db_country = Country( + name=name, + code=code.upper() + ) + + db.add(db_country) + db.commit() + db.refresh(db_country) + + return db_country + +def format_country_response(country: Country) -> Dict[str, str]: + """ + Format a country object into a standardized response format. + + Args: + country: Country object to format + + Returns: + Dict containing formatted country data + """ + return { + "name": country.name, + "code": country.code, + } \ No newline at end of file