"""Pure projections shared by DAX binding read and write paths.""" from __future__ import annotations from app.domains.data_access import constants as c from app.domains.data_access.models import ( BINDING_STATUS_ACTIVE, BINDING_STATUS_REVOKED, BINDING_STATUS_REVOKED_PENDING, EFFECT_DESIRED_PRESENT, EFFECT_STATUS_APPLIED, EFFECT_STATUS_FAILED, EFFECT_STATUS_RETRYABLE, RECONCILE_STATUS_APPLIED, RECONCILE_STATUS_FAILED, RECONCILE_STATUS_RETRYABLE, DataAccessBinding, DataAccessCompiledEffect, ) def binding_access_state( binding: DataAccessBinding, effect: DataAccessCompiledEffect | None, ) -> str: """Map durable binding/effect state to the employee-facing lifecycle.""" if binding.status == BINDING_STATUS_REVOKED: return "revoked_history" if effect is not None and effect.status in { EFFECT_STATUS_FAILED, EFFECT_STATUS_RETRYABLE, }: return "failed" if binding.reconcile_status in { RECONCILE_STATUS_FAILED, RECONCILE_STATUS_RETRYABLE, }: return "failed" if binding.status == BINDING_STATUS_REVOKED_PENDING: return "revoked_pending" if ( binding.status == BINDING_STATUS_ACTIVE and effect is not None and effect.desired_state == EFFECT_DESIRED_PRESENT and effect.status == EFFECT_STATUS_APPLIED ): return "active" if ( binding.status == BINDING_STATUS_ACTIVE and binding.reconcile_status == RECONCILE_STATUS_APPLIED ): return "active" return "pending_apply" def provider_member_for_binding(binding: DataAccessBinding) -> str: """Compile the provider member from the immutable binding snapshot.""" if binding.principal_type_snapshot == c.PRINCIPAL_TYPE_GCP_SERVICE_ACCOUNT: return ( f"{c.BIGQUERY_SERVICE_ACCOUNT_MEMBER_PREFIX}" f"{binding.principal_email_snapshot}" ) if binding.principal_type_snapshot == c.PRINCIPAL_TYPE_GOOGLE_USER: return f"{c.BIGQUERY_USER_MEMBER_PREFIX}{binding.principal_email_snapshot}" return f"{c.BIGQUERY_GROUP_MEMBER_PREFIX}{binding.principal_email_snapshot}"