"""Resource relationship graph — materialised edges across all owner / member / responsibility relations Helix already tracks. A nightly full-sync rebuilds ``rel_relationships`` from authoritative sources; an incremental sync runs every 30 minutes catching the high-churn edges. The frontend force-directed graph then has a single fast read path via ``/api/v1/relationships/graph?center=...``. Edge types (rel_type values) — see ``constants.py`` for the canonical list. Each edge has a stable ``source`` tag identifying which sync populated it, so an edge dropping out of one source is correctly soft-deleted on next sync without disturbing edges held by other sources. """ from app.domains.relationships.constants import ( NODE_TYPE_API_KEY, NODE_TYPE_CLOUD_GRANT, NODE_TYPE_CLOUD_SCOPE, NODE_TYPE_CLOUD_SERVER, NODE_TYPE_DEPARTMENT, NODE_TYPE_DOMAIN, NODE_TYPE_EMAIL_GROUP, NODE_TYPE_HARDWARE_ASSET, NODE_TYPE_PERMISSION, NODE_TYPE_PERSON, NODE_TYPE_SOFTWARE, NODE_TYPE_SOFTWARE_SEAT, REL_ASSIGNED_TO, REL_GRANTS_ACCESS_TO, REL_HAS_API_KEY, REL_HOLDS_SEAT, REL_HOSTS, REL_IT_CONTACT_FOR, REL_MANAGES, REL_MEMBER_OF, REL_OWNS, REL_REPORTS_TO, REL_RESOLVES_DNS, REL_RESPONSIBLE_FOR, ) from app.domains.relationships.models import RelRelationship __all__ = [ "RelRelationship", "REL_MANAGES", "REL_REPORTS_TO", "REL_ASSIGNED_TO", "REL_HOLDS_SEAT", "REL_HAS_API_KEY", "REL_OWNS", "REL_RESPONSIBLE_FOR", "REL_GRANTS_ACCESS_TO", "REL_IT_CONTACT_FOR", "REL_MEMBER_OF", "REL_HOSTS", "REL_RESOLVES_DNS", "NODE_TYPE_PERSON", "NODE_TYPE_DEPARTMENT", "NODE_TYPE_HARDWARE_ASSET", "NODE_TYPE_SOFTWARE", "NODE_TYPE_SOFTWARE_SEAT", "NODE_TYPE_API_KEY", "NODE_TYPE_PERMISSION", "NODE_TYPE_EMAIL_GROUP", "NODE_TYPE_CLOUD_SERVER", "NODE_TYPE_CLOUD_SCOPE", "NODE_TYPE_CLOUD_GRANT", "NODE_TYPE_DOMAIN", ]