""" Track Model. This Track model uses sqlalchemy. """ from typing import Any import sentry_sdk from sqlalchemy import BigInteger, Column, DateTime, Integer, func from sqlalchemy.exc import SQLAlchemyError from assets.connectors import mysql class Track(mysql.ArModel): """Table definition for track table.""" __tablename__ = "track" track_unique_id = Column("id", Integer, primary_key=True, autoincrement=True) upc = Column(BigInteger) track_id = Column(Integer) cd = Column(Integer) length_minute = Column(Integer) length_seconds = Column(Integer) last_updated = Column(DateTime) def as_dict(self) -> dict[str, Any]: """Return object as dict. Returns: dict: Dictionary representation of the object """ track_dict = { "id": self.track_unique_id, "upc": self.upc, "track_id": self.track_id, "cd": self.cd, "length_minute": self.length_minute, "length_seconds": self.length_seconds, "last_updated": self.last_updated, } return track_dict def update_track_duration(track_unique_id: int, minutes: int, seconds: int) -> None: """Update track duration and return the track. Args: track_unique_id (int): Track number. minutes (int): Track minutes. seconds (int): Track seconds. """ try: filters = [(Track.track_unique_id == track_unique_id)] with mysql.ar_db_session() as session: result = session.query(Track).filter(*filters).with_for_update(nowait=True) if result.one_or_none(): updated_items = ( session.query(Track) .filter(*filters) .update( { "length_minute": int(minutes), "length_seconds": int(seconds), "last_updated": func.now(), } ) ) if updated_items != 1: sentry_sdk.capture_message("Track duration could not be updated") except SQLAlchemyError as ex: sentry_sdk.capture_exception(ex)