from typing import Optional, List from models.projects import ProjectCampaignStatus from models.campaign import Campaign from shared.query_builders.campaigns_query_builder import CampaignsQueryBuilder, DynamicFields from campaigns.schemas import CampaignTabRequestModel from campaigns.constants import PENDING_STATUS class CampaignsTabRepository: def get_filtered_campaigns_tab_count(self, params: CampaignTabRequestModel, project_id: int, user_id: int) -> int: builder = CampaignsQueryBuilder(user_id) self.__filtered_campaigns_tab_query(builder, params, project_id) return builder.count_query().scalar() def get_filtered_campaigns_tab( self, params: CampaignTabRequestModel, project_id: int, user_id: int ) -> List[Campaign]: builder = CampaignsQueryBuilder(user_id) builder.set_dynamic_fields([DynamicFields.IS_PENDING]) self.__filtered_campaigns_tab_query(builder, params, project_id) builder.sort_by(params.sort).limit_to(params.limit).offset_by(params.offset) return builder.items_query().all() def __filtered_campaigns_tab_query( self, builder: CampaignsQueryBuilder, params: CampaignTabRequestModel, project_id: Optional[int] = None ): if params.freeText: builder.filtered_by_search(params.freeText) if project_id is not None: builder.filtered_by_project(project_id) if params.platforms: builder.filtered_by_platforms(params.platforms) if params.status == PENDING_STATUS: builder.status_in([ProjectCampaignStatus.PENDING.value])