from collections.abc import Iterator from typing import TypedDict from folkugat_web.dal.sql import Connection, get_connection from folkugat_web.dal.sql.sessions import conversion as sessions_conversion from folkugat_web.model import playlists as model from folkugat_web.model.sessions import Session from folkugat_web.utils import groupby from . import conversion class QueryData(TypedDict, total=False): id: int set_id: int playlist_id: int def _filter_clause( entry_id: int | None = None, set_id: int | None = None, playlist_id: int | None = None, ) -> tuple[str, QueryData]: filter_clauses: list[str] = [] query_data: QueryData = {} if entry_id is not None: filter_clauses.append("id = :id") query_data["id"] = entry_id if set_id is not None: filter_clauses.append("set_id = :set_id") query_data["set_id"] = set_id if playlist_id is not None: filter_clauses.append("playlist_id = :playlist_id") query_data["playlist_id"] = playlist_id return " AND ".join(filter_clauses), query_data def get_playlist_entries( entry_id: int | None = None, set_id: int | None = None, playlist_id: int | None = None, con: Connection | None = None, ) -> Iterator[model.PlaylistEntry]: filter_clause, data = _filter_clause(entry_id=entry_id, set_id=set_id, playlist_id=playlist_id) query = f""" SELECT id, playlist_id, set_id, tema_id FROM playlist_entries WHERE {filter_clause} ORDER BY id ASC """ with get_connection(con) as con: cur = con.cursor() _ = cur.execute(query, data) return map(conversion.row_to_playlist_entry, cur.fetchall())