import sys from datetime import datetime from pathlib import Path import logging import tomllib from from_root import from_root from src.ez_lan_manager.types.ConfigurationTypes import DatabaseConfiguration, MailingServiceConfiguration, LanInfo, TicketInfo, SeatingConfiguration logger = logging.getLogger(__name__.split(".")[-1]) class ConfigurationService: def __init__(self, config_file_path: Path) -> None: try: with open(from_root("VERSION"), "r") as version_file: self._version = version_file.read().strip() except FileNotFoundError: logger.warning("Could not find VERSION file, defaulting to '0.0.0'") self._version = "0.0.0" try: with open(config_file_path, "rb") as config_file: self._config = tomllib.load(config_file) except FileNotFoundError: logger.fatal(f"Could not find config file at \"{config_file_path}\", exiting...") exit(1) def get_database_configuration(self) -> DatabaseConfiguration: try: database_configuration = self._config["database"] return DatabaseConfiguration( db_user=database_configuration["db_user"], db_password=database_configuration["db_password"], db_host=database_configuration["db_host"], db_port=database_configuration["db_port"], db_name=database_configuration["db_name"] ) except KeyError: logger.fatal("Error loading DatabaseConfiguration, exiting...") sys.exit(1) def get_mailing_service_configuration(self) -> MailingServiceConfiguration: try: mailing_configuration = self._config["mailing"] return MailingServiceConfiguration( smtp_server=mailing_configuration["smtp_server"], smtp_port=mailing_configuration["smtp_port"], sender=mailing_configuration["sender"], username=mailing_configuration["username"], password=mailing_configuration["password"] ) except KeyError: logger.fatal("Error loading MailingServiceConfiguration, exiting...") sys.exit(1) def get_lan_info(self) -> LanInfo: try: lan_info = self._config["lan"] ticket_info = TicketInfo( default_category=lan_info["default_category"], categories=list(lan_info["tickets"].keys()), _prices=lan_info["prices"], _available_tickets=lan_info["tickets"] ) return LanInfo( name=lan_info["name"], iteration=lan_info["iteration"], ticket_info=ticket_info, date_from=datetime.strptime(lan_info["date_from"], "%Y-%m-%d %H:%M:%S"), date_till=datetime.strptime(lan_info["date_till"], "%Y-%m-%d %H:%M:%S") ) except KeyError: logger.fatal("Error loading LAN Info, exiting...") sys.exit(1) def get_seating_configuration(self) -> SeatingConfiguration: try: seating_config = self._config["seating"] base_svg_file_path = from_root(seating_config["base_svg_path"]) if not base_svg_file_path.exists(): logger.fatal(f"Specified seating plan SVG file was not found at {base_svg_file_path}! Exiting...") sys.exit(1) return SeatingConfiguration( base_svg_path=base_svg_file_path ) except KeyError: logger.fatal("Error loading seating configuration, exiting...") sys.exit(1) @property def APP_VERSION(self) -> str: return self._version