"""Episode Links Model.""" import sqlalchemy from sqlalchemy import ForeignKey from sqlalchemy.dialects.mysql import INTEGER from sqlalchemy.orm.exc import NoResultFound from podcast.connectors import mysql from podcast.constants import error from podcast.utils.exc import OwsError class EpisodeLink(mysql.BaseModel): """Episode Link model.""" __tablename__ = 'episode_link' id = sqlalchemy.Column(INTEGER(unsigned=True), primary_key=True, autoincrement=True) # noqa episode_id = sqlalchemy.Column( INTEGER, ForeignKey('episode.id'), nullable=False ) podcast_id = sqlalchemy.Column( INTEGER, ForeignKey('podcast.id'), nullable=False ) store_id = sqlalchemy.Column( INTEGER, ForeignKey('store.id'), nullable=False ) link = sqlalchemy.Column(sqlalchemy.VARCHAR(510), nullable=False) def to_dict(self): """Return the object as dictionary.""" return dict( id=self.id, episode_id=self.episode_id, podcast_id=self.podcast_id, store_id=self.store_id, link=self.link ) def get_episode_links(podcast_id, store_id=None): """Get all episode links for a podcast.""" with mysql.pod_db_session() as session: query = session.query(EpisodeLink).filter( EpisodeLink.podcast_id == podcast_id, ) if store_id is not None: query = query.filter( EpisodeLink.store_id == store_id ) episode_links = query.all() return {'items': [x.to_dict() for x in episode_links]} def get_episode_links_by_episode_id(episode_id): """Get all episode links for an episode.""" with mysql.pod_db_session() as session: episode_links = session.query(EpisodeLink).filter( EpisodeLink.episode_id == episode_id, ).all() return {'items': [x.to_dict() for x in episode_links]} def create_episode_links(data): """Create episode links for a podcast.""" links = data['links'] with mysql.pod_db_session() as session: for link in links: episode_link = EpisodeLink(**link) session.add(episode_link) session.flush() def create_or_update_episode_link(data): """Create or update episode link for an episode.""" with mysql.pod_db_session() as session: try: episode_link = session.query(EpisodeLink).filter( EpisodeLink.episode_id == data['episode_id'], EpisodeLink.store_id == data['store_id'] ) episode_link_data = episode_link.one() except NoResultFound: episode_link_data = EpisodeLink(**data) session.add(episode_link_data) else: episode_link.update(data) session.flush() return episode_link_data.to_dict() def delete_episode_link(episode_id, store_id): """Delete an episode link.""" with mysql.pod_db_session() as session: try: episode_link = session.query(EpisodeLink).filter( EpisodeLink.episode_id == episode_id, EpisodeLink.store_id == store_id ) episode_link.one() except NoResultFound: raise OwsError.not_found(error.ERROR_EPISODE_LINK_NOT_FOUND) episode_link.delete() return None