from delphi_api.errors import Codes, InvalidInputError from delphi_api.v3.data_models.postgres_db import Playlist, db from delphi_api.v3.data_models.schemas.models import PlaylistSchema, PlaylistSimpleSchema from delphi_api.v3.view_models.params import Params from delphi_api.v3.view_models.query_builder import QueryBuilder class PlaylistsViewModel: @staticmethod def validate_params(params: Params): """Check the search parameters provided by the client are compatible before continuing""" err = False if err: raise InvalidInputError({ 'code': Codes.invalid_input.value, 'description': err, }) @staticmethod def get_one(params: dict): params = Params(**params) result = db.session.query(Playlist).get_or_404(params.playlist_id) return PlaylistSchema().dump(result) @staticmethod def get_many(params: dict): params = Params(**params) PlaylistsViewModel.validate_params(params) q = db.session.query(Playlist) q = QueryBuilder.or_filters_from_params(q, params, parent=Playlist) if params.sort_by != 'rank': q = QueryBuilder.add_sort_clause(q, params, parent=Playlist) q = QueryBuilder.add_query_limit_offset(q, params) result = PlaylistSimpleSchema(many=True).dump(q.all()) result = QueryBuilder.sort_results(result, params) result = QueryBuilder.limit_offset_results(result, params) return result