from typing import Any from ddtrace import tracer from neo4j import Session as Neo4jSession from pydantic import UUID4 from sqlalchemy.orm import Session as MySQLSession from contributor.api import datasources from contributor.connectors.features.wrappers import BooleanFeature from contributor.connectors.mysql import db_session_wrap from contributor.constants.features import ( FEATURE_FLAG_CCM_CONTRIBUTOR_ROLES_ART_RELATIONS, ) from contributor.queries.mysql import contributor_role as queries from contributor.queries.neo4j import participation_roles as neo4j_queries @db_session_wrap @tracer.wrap() def get_role_categories( session: MySQLSession, neo4j_session: Neo4jSession, identity_id: UUID4 ) -> list[dict[str, str]]: art_relations_roles_feature = BooleanFeature( client=datasources.get_splitio_client(), feature_name=FEATURE_FLAG_CCM_CONTRIBUTOR_ROLES_ART_RELATIONS, ) if art_relations_roles_feature.is_on_for_identity(str(identity_id)): return queries.get_role_categories(session) return neo4j_queries.get_role_categories(neo4j_session) @db_session_wrap @tracer.wrap() def get_role_by_uuid( session: MySQLSession, neo4j_session: Neo4jSession, uuid: UUID4, identity_id: UUID4, ) -> dict[str, Any] | None: art_relations_roles_feature = BooleanFeature( client=datasources.get_splitio_client(), feature_name=FEATURE_FLAG_CCM_CONTRIBUTOR_ROLES_ART_RELATIONS, ) if art_relations_roles_feature.is_on_for_identity(str(identity_id)): return queries.get_role_by_uuid(session, str(uuid)) return neo4j_queries.get_role_by_uuid(neo4j_session, uuid) @db_session_wrap @tracer.wrap() def get_roles_by_category_uuid( session: MySQLSession, neo4j_session: Neo4jSession, uuid: UUID4, identity_id: UUID4, ) -> list[dict[str, Any]]: art_relations_roles_feature = BooleanFeature( client=datasources.get_splitio_client(), feature_name=FEATURE_FLAG_CCM_CONTRIBUTOR_ROLES_ART_RELATIONS, ) if art_relations_roles_feature.is_on_for_identity(str(identity_id)): return queries.get_roles_by_category_uuid(session, str(uuid)) results = get_roles_by_category_uuids( session=session, neo4j_session=neo4j_session, uuids=[str(uuid)], identity_id=identity_id, ) return results[0]["roles"] if results else [] @db_session_wrap @tracer.wrap() def get_roles_by_category_uuids( session: MySQLSession, neo4j_session: Neo4jSession, uuids: list[str], identity_id: UUID4, ) -> list[dict[str, Any]]: art_relations_roles_feature = BooleanFeature( client=datasources.get_splitio_client(), feature_name=FEATURE_FLAG_CCM_CONTRIBUTOR_ROLES_ART_RELATIONS, ) if art_relations_roles_feature.is_on_for_identity(str(identity_id)): return queries.get_roles_by_category_uuids(session, uuids) return neo4j_queries.get_roles_by_category_uuids(neo4j_session, uuids)