"""TrackAudit model to store logs when importing tracks.""" from oto import response from sentry_sdk import capture_exception from sqlalchemy import Column from sqlalchemy import DateTime from sqlalchemy import Enum from sqlalchemy import Integer from sqlalchemy import String from backend.connectors import mysql from backend.constants import error from backend.constants import track_audit as audit_consts class TrackAudit(mysql.OwsTrackBaseModel): """Contains data about track imports. Used to store logging information when importing tracks """ __tablename__ = 'ows_track_audit' # In table definition this column is of BIGINT type record_id = Column('id', Integer, primary_key=True) source_tuid = Column(Integer, nullable=False, index=True) destination_tuid = Column(Integer, nullable=False, index=True) source_product_id = Column(Integer, nullable=False, index=True) destination_product_id = Column(Integer, nullable=False, index=True) orchard_user_id = Column(String(127), nullable=False) action = Column( Enum(*audit_consts.ACTIONS_ENUM), default=audit_consts.IMPORT_ACTION) created_date = Column(DateTime, nullable=True, default=None) audit_metadata = Column( 'metadata', String(1024), nullable=True, default=None) def to_dict(self): """Convert TrackAudit data to dict.""" data = { audit_consts.RECORD_ID: self.record_id, audit_consts.SOURCE_TUID: self.source_tuid, audit_consts.DESTINATION_TUID: self.destination_tuid, audit_consts.SOURCE_PRODUCT_ID: self.source_product_id, audit_consts.DESTINATION_PRODUCT_ID: self.destination_product_id, audit_consts.ORCHARD_USER_ID: self.orchard_user_id, audit_consts.ACTION: self.action, audit_consts.CREATED_DATE: self.created_date, audit_consts.AUDIT_METADATA: self.audit_metadata } return data @mysql.ows_track_db_session_wrap def create_log_entries(entries, session): """ Create multiple TrackAudit entries. Args: entries (list of dicts): Each dict is expected to have at least required fields of TrackAudit model. session (object): SQLAlchemy database session Returns: oto.response.Response with list of created TrackAudit.to_dict() """ try: audit_entries = [TrackAudit(**kwargs) for kwargs in entries] session.add_all(audit_entries) session.commit() created_entries = [entry.to_dict() for entry in audit_entries] return response.Response(message=created_entries) except Exception as e: session.rollback() capture_exception(e) return response.create_error_response( code=error.TRACK_AUDIT_MODEL_CREATION_ERROR, message=str(e))