67 lines
2.0 KiB
Python
67 lines
2.0 KiB
Python
|
|
"""
|
||
|
|
Validation utilities for microservices
|
||
|
|
"""
|
||
|
|
|
||
|
|
import re
|
||
|
|
from typing import Any, Optional
|
||
|
|
from email_validator import validate_email, EmailNotValidError
|
||
|
|
|
||
|
|
def validate_spanish_phone(phone: str) -> bool:
|
||
|
|
"""Validate Spanish phone number"""
|
||
|
|
# Spanish phone pattern: +34 followed by 9 digits
|
||
|
|
pattern = r'^(\+34|0034|34)?[6-9]\d{8}$'
|
||
|
|
return bool(re.match(pattern, phone.replace(' ', '').replace('-', '')))
|
||
|
|
|
||
|
|
def validate_email_address(email: str) -> bool:
|
||
|
|
"""Validate email address"""
|
||
|
|
try:
|
||
|
|
validate_email(email)
|
||
|
|
return True
|
||
|
|
except EmailNotValidError:
|
||
|
|
return False
|
||
|
|
|
||
|
|
def validate_tenant_name(name: str) -> bool:
|
||
|
|
"""Validate tenant name"""
|
||
|
|
# Must be 2-50 characters, letters, numbers, spaces, hyphens, apostrophes
|
||
|
|
pattern = r"^[a-zA-ZÀ-ÿ0-9\s\-']{2,50}$"
|
||
|
|
return bool(re.match(pattern, name))
|
||
|
|
|
||
|
|
def validate_address(address: str) -> bool:
|
||
|
|
"""Validate address"""
|
||
|
|
# Must be 5-200 characters
|
||
|
|
return 5 <= len(address.strip()) <= 200
|
||
|
|
|
||
|
|
def validate_coordinates(latitude: float, longitude: float) -> bool:
|
||
|
|
"""Validate Madrid coordinates"""
|
||
|
|
# Madrid is roughly between these coordinates
|
||
|
|
madrid_bounds = {
|
||
|
|
'lat_min': 40.3,
|
||
|
|
'lat_max': 40.6,
|
||
|
|
'lon_min': -3.8,
|
||
|
|
'lon_max': -3.5
|
||
|
|
}
|
||
|
|
|
||
|
|
return (
|
||
|
|
madrid_bounds['lat_min'] <= latitude <= madrid_bounds['lat_max'] and
|
||
|
|
madrid_bounds['lon_min'] <= longitude <= madrid_bounds['lon_max']
|
||
|
|
)
|
||
|
|
|
||
|
|
def validate_product_name(name: str) -> bool:
|
||
|
|
"""Validate product name"""
|
||
|
|
# Must be 1-50 characters, letters, numbers, spaces
|
||
|
|
pattern = r"^[a-zA-ZÀ-ÿ0-9\s]{1,50}$"
|
||
|
|
return bool(re.match(pattern, name))
|
||
|
|
|
||
|
|
def validate_positive_number(value: Any) -> bool:
|
||
|
|
"""Validate positive number"""
|
||
|
|
try:
|
||
|
|
return float(value) > 0
|
||
|
|
except (ValueError, TypeError):
|
||
|
|
return False
|
||
|
|
|
||
|
|
def validate_non_negative_number(value: Any) -> bool:
|
||
|
|
"""Validate non-negative number"""
|
||
|
|
try:
|
||
|
|
return float(value) >= 0
|
||
|
|
except (ValueError, TypeError):
|
||
|
|
return False
|