{"record":{"id":"01b06b7049e6762f","repo":"infiniflow/ragflow","slug":"404","errorCode":"404","errorMessage":"User '{username}' not found","messagePattern":"User '(.+?)' not found","errorType":"http","errorClass":"UserNotFoundError","httpStatus":400,"severity":"error","filePath":"admin/server/services.py","lineNumber":239,"sourceCode":"            raise UserNotFoundError(username)\n        elif len(user_list) > 1:\n            raise AdminException(f\"Exist more than 1 user: {username}!\")\n        # check activate status different from new\n        usr = user_list[0]\n        if not usr.is_superuser:\n            return f\"{usr} isn't superuser, yet!\"\n        # update is_active\n        UserService.update_user(usr.id, {\"is_superuser\": False})\n        return \"Revoke successfully!\"\n\n\nclass UserServiceMgr:\n    @staticmethod\n    def get_user_datasets(username):\n        # use email to find user.\n        user_list = UserService.query_user_by_email(username)\n        if not user_list:\n            raise UserNotFoundError(username)\n        elif len(user_list) > 1:\n            raise AdminException(f\"Exist more than 1 user: {username}!\")\n        # find tenants\n        usr = user_list[0]\n        tenants = TenantService.get_joined_tenants_by_user_id(usr.id)\n        tenant_ids = [m[\"tenant_id\"] for m in tenants]\n        # filter permitted kb and owned kb\n        return KnowledgebaseService.get_all_kb_by_tenant_ids(tenant_ids, usr.id)\n\n    @staticmethod\n    def get_user_agents(username):\n        # use email to find user.\n        user_list = UserService.query_user_by_email(username)\n        if not user_list:\n            raise UserNotFoundError(username)\n        elif len(user_list) > 1:\n            raise AdminException(f\"Exist more than 1 user: {username}!\")\n        # find tenants","sourceCodeStart":221,"sourceCodeEnd":257,"githubUrl":"https://github.com/infiniflow/ragflow/blob/554fb1133ac3861732235ad9c377eb5e0a770665/admin/server/services.py#L221-L257","documentation":"UserNotFoundError (HTTP 404) raised by UserServiceMgr.get_user_datasets (admin/server/services.py:239) when query_user_by_email returns no rows. Dataset listing resolves the user first, then enumerates tenants via TenantService.get_joined_tenants_by_user_id to fetch knowledge bases; an unknown email stops before any tenant query.","triggerScenarios":"Listing datasets for a nonexistent, deleted, or typo'd email; passing a user id or nickname where the login email is required.","commonSituations":"Support tooling auditing a user's KBs after offboarding; environment drift; users whose stored email differs from what support expects (SSO aliases, profile edits).","solutions":["Confirm the account with get_user_details/get_all_users before listing datasets.","Treat 404 as an empty dataset list in reporting tools.","Use the exact stored email string.","Verify the target database/environment."],"exampleFix":"# before\nkbs = UserServiceMgr.get_user_datasets('user@example.com')  # 404\n\n# after\nfrom admin.server.exceptions import UserNotFoundError\ntry:\n    kbs = UserServiceMgr.get_user_datasets('user@example.com')\nexcept UserNotFoundError:\n    kbs = []","handlingStrategy":"try-catch","validationCode":"from api.db.services import UserService\n\ndef user_resolvable(email: str) -> bool:\n    return len(UserService.query_user_by_email(email.strip())) == 1","typeGuard":null,"tryCatchPattern":"from admin.server.exceptions import UserNotFoundError\ntry:\n    kbs = UserServiceMgr.get_user_datasets(email)\nexcept UserNotFoundError:\n    kbs = []","preventionTips":["Validate the email against get_all_users() before dataset audits.","Treat 404 as an empty result in support tooling.","Confirm environment targeting when a known user unexpectedly 404s."],"tags":["not-found","admin-api","datasets","user-management"],"backgroundTag":null,"analyzedSha":"554fb1133ac3861732235ad9c377eb5e0a770665","analyzedAt":"2026-08-15T09:20:16.380Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}