from dataclasses import dataclass from functools import cache from typing import Any from sqlalchemy import Column, String from sqlalchemy.dialects.mysql import TINYINT from assets.connectors import mysql from assets.exceptions import AssetUploadTypeNotFound class AssetUploadType(mysql.AuModel): """Table definition for asset_upload_type table.""" __tablename__ = "asset_upload_type" asset_upload_type_id: int = Column( TINYINT(unsigned=True), primary_key=True, autoincrement=True ) name: str = Column(String(127), nullable=False) def as_dict(self) -> dict[str, Any]: """Return object as dict. Returns: dict: Dictionary representation of object """ asset_upload_type_dict: dict[str, Any] = { "asset_upload_type_id": self.asset_upload_type_id, "name": self.name, } return asset_upload_type_dict @dataclass(frozen=True) class AssetUploadTypeMap: """Bidirectional mapping between asset_upload_type_id and name.""" id_to_name: dict[int, str] name_to_id: dict[str, int] @cache def get_asset_upload_type_map() -> AssetUploadTypeMap: """Return a bidirectional mapping between asset_upload_type_id and name. Returns: AssetUploadTypeMap: Bidirectional mapping between asset_upload_type_id and name """ with mysql.au_db_session(read_only=True) as session: rows = session.query(AssetUploadType).all() id_to_name = {row.asset_upload_type_id: row.name for row in rows} name_to_id = {row.name: row.asset_upload_type_id for row in rows} return AssetUploadTypeMap(id_to_name=id_to_name, name_to_id=name_to_id) def resolve_asset_upload_type_id(asset_upload_type: str) -> int: """Get asset_upload_type_id by asset_upload_type.name. Args: asset_upload_type (str): Asset upload type name Returns: int: Asset upload type id corresponding to asset_upload_type.name Raises: AssetUploadTypeNotFound: If no asset upload type exists with given name """ upload_type_map = get_asset_upload_type_map() if asset_upload_type not in upload_type_map.name_to_id: raise AssetUploadTypeNotFound(asset_upload_type) return upload_type_map.name_to_id[asset_upload_type] def resolve_asset_upload_type(asset_upload_type_id: int) -> str: """Get asset_upload_type.name by asset_upload_type_id. Args: asset_upload_type_id (int): Asset upload type id corresponding to asset_upload_type Returns: str: Asset upload type name Raises: AssetUploadTypeNotFound: If no asset upload type exists with the given id """ upload_type_map = get_asset_upload_type_map() if asset_upload_type_id not in upload_type_map.id_to_name: raise AssetUploadTypeNotFound(str(asset_upload_type_id)) return upload_type_map.id_to_name[asset_upload_type_id]