{"nodes": [{"id": "$graphify-root$_backend_app_services_encryption_py", "label": "encryption.py", "file_type": "code", "source_file": "backend/app/services/encryption.py", "source_location": "L1"}, {"id": "$graphify-root$_backend_app_services_encryption_get_keys", "label": "_get_keys()", "file_type": "code", "source_file": "backend/app/services/encryption.py", "source_location": "L9", "_callable": true}, {"id": "$graphify-root$_backend_app_services_encryption_get_fernet", "label": "_get_fernet()", "file_type": "code", "source_file": "backend/app/services/encryption.py", "source_location": "L25", "_callable": true}, {"id": "fernet", "label": "Fernet", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/backend/app/services/encryption.py"}, {"id": "multifernet", "label": "MultiFernet", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "$graphify-root$/backend/app/services/encryption.py"}, {"id": "$graphify-root$_backend_app_services_encryption_encrypt_token", "label": "encrypt_token()", "file_type": "code", "source_file": "backend/app/services/encryption.py", "source_location": "L32", "_callable": true}, {"id": "$graphify-root$_backend_app_services_encryption_decrypt_token", "label": "decrypt_token()", "file_type": "code", "source_file": "backend/app/services/encryption.py", "source_location": "L37", "_callable": true}, {"id": "$graphify-root$_backend_app_services_encryption_rotate_key", "label": "rotate_key()", "file_type": "code", "source_file": "backend/app/services/encryption.py", "source_location": "L48", "_callable": true}, {"id": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "label": "reencrypt_tokens()", "file_type": "code", "source_file": "backend/app/services/encryption.py", "source_location": "L58", "_callable": true}, {"id": "$graphify-root$_backend_app_services_encryption_rationale_10", "label": "Support multi-key mode for rotation. Env: ATLAS_FERNET_KEYS=\"key1,key2\" \u2014 first\u2026", "file_type": "rationale", "source_file": "backend/app/services/encryption.py", "source_location": "L10"}, {"id": "$graphify-root$_backend_app_services_encryption_rationale_33", "label": "Encrypt dan return sebagai str UTF-8 (aman disimpan di kolom Text).", "file_type": "rationale", "source_file": "backend/app/services/encryption.py", "source_location": "L33"}, {"id": "$graphify-root$_backend_app_services_encryption_rationale_38", "label": "Decrypt. Menerima str (Fernet) atau bytes mentah (compat SQLite lama).", "file_type": "rationale", "source_file": "backend/app/services/encryption.py", "source_location": "L38"}, {"id": "$graphify-root$_backend_app_services_encryption_rationale_49", "label": "Generate a new Fernet key and return it. Caller must re-encrypt all tokens with\u2026", "file_type": "rationale", "source_file": "backend/app/services/encryption.py", "source_location": "L49"}, {"id": "$graphify-root$_backend_app_services_encryption_rationale_59", "label": "Re-encrypt all tokens in the database with the new key. Args: db: SQLAlchemy\u2026", "file_type": "rationale", "source_file": "backend/app/services/encryption.py", "source_location": "L59"}], "edges": [{"source": "$graphify-root$_backend_app_services_encryption_py", "target": "cryptography_fernet", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L1", "weight": 1.0, "_python_import_module": "cryptography.fernet", "_python_import_bindings": [["Fernet", "Fernet"], ["MultiFernet", "MultiFernet"]]}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "$graphify-root$_backend_app_core_config_py", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L2", "weight": 1.0, "_python_import_module": "app.core.config", "_python_import_bindings": [["settings", "settings"]], "target_file": "$graphify-root$/backend/app/core/config.py"}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "os", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L3", "weight": 1.0, "_python_import_module": "os", "_python_import_bindings": [["os", "os"]], "_python_import_module_binding": true}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "logging", "relation": "imports", "context": "import", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L4", "weight": 1.0, "_python_import_module": "logging", "_python_import_bindings": [["logging", "logging"]], "_python_import_module_binding": true}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "$graphify-root$_backend_app_services_encryption_get_keys", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L9", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "$graphify-root$_backend_app_services_encryption_get_fernet", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L25", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_get_fernet", "target": "fernet", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L25", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_get_fernet", "target": "multifernet", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L25", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "$graphify-root$_backend_app_services_encryption_encrypt_token", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L32", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "$graphify-root$_backend_app_services_encryption_decrypt_token", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L37", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "$graphify-root$_backend_app_services_encryption_rotate_key", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L48", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_py", "target": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "relation": "contains", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L58", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_get_fernet", "target": "$graphify-root$_backend_app_services_encryption_get_keys", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L26", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_encrypt_token", "target": "$graphify-root$_backend_app_services_encryption_get_fernet", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L34", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_decrypt_token", "target": "$graphify-root$_backend_app_services_encryption_get_fernet", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L45", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "target": "$graphify-root$_backend_app_services_encryption_decrypt_token", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L80", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "target": "$graphify-root$_backend_app_services_encryption_encrypt_token", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L81", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_rationale_10", "target": "$graphify-root$_backend_app_services_encryption_get_keys", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L10", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_rationale_33", "target": "$graphify-root$_backend_app_services_encryption_encrypt_token", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L33", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_rationale_38", "target": "$graphify-root$_backend_app_services_encryption_decrypt_token", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L38", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_rationale_49", "target": "$graphify-root$_backend_app_services_encryption_rotate_key", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L49", "weight": 1.0}, {"source": "$graphify-root$_backend_app_services_encryption_rationale_59", "target": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "backend/app/services/encryption.py", "source_location": "L59", "weight": 1.0}], "raw_calls": [{"caller_nid": "$graphify-root$_backend_app_services_encryption_get_keys", "callee": "get", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L15", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_keys", "callee": "encode", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L17", "receiver": "k", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_keys", "callee": "split", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L17", "receiver": "keys_str", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_keys", "callee": "strip", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L17", "receiver": "k", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_keys", "callee": "get", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L19", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_keys", "callee": "RuntimeError", "is_member_call": false, "source_file": "backend/app/services/encryption.py", "source_location": "L21", "receiver": null}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_keys", "callee": "encode", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L22", "receiver": "key", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_fernet", "callee": "Fernet", "is_member_call": false, "source_file": "backend/app/services/encryption.py", "source_location": "L28", "receiver": null, "via_stub": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_fernet", "callee": "MultiFernet", "is_member_call": false, "source_file": "backend/app/services/encryption.py", "source_location": "L29", "receiver": null, "via_stub": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_get_fernet", "callee": "Fernet", "is_member_call": false, "source_file": "backend/app/services/encryption.py", "source_location": "L29", "receiver": null, "via_stub": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_encrypt_token", "callee": "decode", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L34", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_encrypt_token", "callee": "encrypt", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L34", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_encrypt_token", "callee": "encode", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L34", "receiver": "plaintext", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_decrypt_token", "callee": "str", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "backend/app/services/encryption.py", "source_location": "L39"}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_decrypt_token", "callee": "startswith", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L41", "receiver": "ciphertext", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_decrypt_token", "callee": "fromhex", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L42", "receiver": "bytes", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_decrypt_token", "callee": "encode", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L44", "receiver": "ciphertext", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_decrypt_token", "callee": "decode", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L45", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_decrypt_token", "callee": "decrypt", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L45", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_rotate_key", "callee": "decode", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L53", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_rotate_key", "callee": "generate_key", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L53", "receiver": "Fernet", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_rotate_key", "callee": "info", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L54", "receiver": "logger", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "split", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L69", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "get", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L69", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "append", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L71", "receiver": "current_keys", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "append", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L73", "receiver": "current_keys", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "join", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L74", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "all", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L77", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "query", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L77", "receiver": "db", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "UserToken", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "backend/app/services/encryption.py", "source_location": "L77"}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "error", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L83", "receiver": "logger", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "all", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L86", "receiver": null, "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "query", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L86", "receiver": "db", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "TmsCreds", "is_member_call": false, "indirect": true, "context": "argument", "source_file": "backend/app/services/encryption.py", "source_location": "L86"}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "error", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L92", "receiver": "logger", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "commit", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L94", "receiver": "db", "_python_receiver_shadowed": true}, {"caller_nid": "$graphify-root$_backend_app_services_encryption_reencrypt_tokens", "callee": "info", "is_member_call": true, "source_file": "backend/app/services/encryption.py", "source_location": "L95", "receiver": "logger", "_python_receiver_shadowed": true}], "_cached_target_files": ["$graphify-root$/backend/app/core/config.py"]}