from typing import List from flask import g from sqlalchemy import and_, func from db import db from models import Artist from models.projects import Project, ProjectTargetItem from models.campaign import Campaign, CampaignSourceType from models.project_entity_type import ProjectEntityType from shared.query_builders.projects_query_builder import ProjectsQueryBuilder, DynamicFields from shared.query_builders.campaigns_query_builder import CampaignsQueryBuilder class GlobalSearchRepository: def search_campaigns(self, query: str, limit: int, offset: int): builder = CampaignsQueryBuilder(g.user_id) builder.sort_expression = [Campaign.planned_budget.desc()] builder.only_accessible_campaigns().filtered_by_sources(CampaignSourceType.all_external_sources()) builder.filtered_by_search(query) count = builder.count_query().scalar() campaigns = builder.limit_to(limit).offset_by(offset).items_query().all() return campaigns, count def search_projects(self, query: str, limit: int, offset: int): builder = ProjectsQueryBuilder(g.user_id) builder.set_dynamic_fields([DynamicFields.USER_ROLE]) builder.sort_expression = [Project.budget.desc()] builder.filtered_by_search(query).only_accessible_projects() count = builder.count_query().scalar() projects = builder.limit_to(limit).offset_by(offset).items_query().all() return projects, count def projects_count_by_artists(self, artists_external_ids: List[str]): query = ( db.session.query(Artist.external_id, func.count(Project.id)) .join( ProjectTargetItem, and_( ProjectTargetItem.project_id == Project.id, ProjectTargetItem.entity_type == ProjectEntityType.PRIMARY_ARTIST.value, ProjectTargetItem.is_deleted.is_(False), ), ) .join(Artist, ProjectTargetItem.entity_id == Artist.id) .filter(Project.is_deleted.is_(False), Artist.external_id.in_(artists_external_ids)) ) if not g.is_admin: query = query.filter(Project.is_confidential.is_(False)) return query.group_by(Artist.external_id).all()