{"nodes": [{"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "label": "users.py", "file_type": "code", "source_file": "app/api/v1/users.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_change_my_password", "label": "change_my_password()", "file_type": "code", "source_file": "app/api/v1/users.py", "source_location": "L13", "_callable": true}, {"id": "changepasswordrequest", "label": "ChangePasswordRequest", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/v1/users.py"}, {"id": "currentuser", "label": "CurrentUser", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/v1/users.py"}, {"id": "userservicedep", "label": "UserServiceDep", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/v1/users.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "label": "reveal_my_subsonic_password()", "file_type": "code", "source_file": "app/api/v1/users.py", "source_location": "L24", "_callable": true}, {"id": "subsonicauthservicedep", "label": "SubsonicAuthServiceDep", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/v1/users.py"}, {"id": "subsonicpasswordresponse", "label": "SubsonicPasswordResponse", "file_type": "code", "source_file": "", "source_location": "", "origin_file": "/Users/senko/Work/mcma-compose/mcma-backend/app/api/v1/users.py"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "label": "rotate_my_subsonic_password()", "file_type": "code", "source_file": "app/api/v1/users.py", "source_location": "L35", "_callable": true}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rationale_1", "label": "Self-service user endpoints (the authenticated caller acts on themselves).", "file_type": "rationale", "source_file": "app/api/v1/users.py", "source_location": "L1"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rationale_27", "label": "Reveal the caller's Subsonic app-password for copying into a client. It's r", "file_type": "rationale", "source_file": "app/api/v1/users.py", "source_location": "L27"}, {"id": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rationale_38", "label": "Rotate the caller's Subsonic app-password (invalidates the previous one).", "file_type": "rationale", "source_file": "app/api/v1/users.py", "source_location": "L38"}], "edges": [{"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "target": "fastapi", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L3", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "target": "app_api_deps", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L5", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "target": "app_api_schemas_subsonic", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L6", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "target": "app_api_schemas_user", "relation": "imports_from", "context": "import", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L7", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_change_my_password", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_change_my_password", "target": "changepasswordrequest", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_change_my_password", "target": "currentuser", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_change_my_password", "target": "userservicedep", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L13", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L24", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "target": "currentuser", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L24", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "target": "subsonicauthservicedep", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L24", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "target": "subsonicpasswordresponse", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L24", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "relation": "contains", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L35", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "target": "currentuser", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L35", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "target": "subsonicauthservicedep", "relation": "references", "context": "parameter_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L35", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "target": "subsonicpasswordresponse", "relation": "references", "context": "return_type", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L35", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "target": "subsonicpasswordresponse", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L31", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "target": "subsonicpasswordresponse", "relation": "calls", "context": "call", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L39", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rationale_1", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_py", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L1", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rationale_27", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L27", "weight": 1.0}, {"source": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rationale_38", "target": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "relation": "rationale_for", "confidence": "EXTRACTED", "source_file": "app/api/v1/users.py", "source_location": "L38", "weight": 1.0}], "raw_calls": [{"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_change_my_password", "callee": "change_password", "is_member_call": true, "source_file": "app/api/v1/users.py", "source_location": "L16", "receiver": "users"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_reveal_my_subsonic_password", "callee": "reveal", "is_member_call": true, "source_file": "app/api/v1/users.py", "source_location": "L31", "receiver": "subsonic"}, {"caller_nid": "users_senko_work_mcma_compose_mcma_backend_app_api_v1_users_rotate_my_subsonic_password", "callee": "rotate", "is_member_call": true, "source_file": "app/api/v1/users.py", "source_location": "L39", "receiver": "subsonic"}]}