public_gateway.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import logging
  2. import uuid
  3. from constants import DEVICE_INVALID_MESSAGE
  4. from tools.query_order import QueryOrderTool
  5. from tools.query_track import QueryTrackTool
  6. from utils.security import hash_gateway_session_id
  7. logger = logging.getLogger(__name__)
  8. class PublicGatewayApp:
  9. def __init__(self, session_store, api_client, auth_client=None):
  10. self.session_store = session_store
  11. self.api_client = api_client
  12. self._tools = {
  13. 'query_order': QueryOrderTool(api_client=None),
  14. 'query_track': QueryTrackTool(api_client=None),
  15. }
  16. def list_tools(self):
  17. return [tool.metadata() for tool in self._tools.values()]
  18. def build_request_id(self, request_id=''):
  19. request_id = str(request_id or '').strip()
  20. return request_id or 'rq_{0}'.format(uuid.uuid4().hex[:16])
  21. def call_tool(self, gateway_session_id, name, arguments=None, request_id=''):
  22. if name not in self._tools:
  23. raise KeyError('tool not registered: {0}'.format(name))
  24. session = self.session_store.get(gateway_session_id)
  25. if not session or not session.get('mcp_token'):
  26. raise RuntimeError(DEVICE_INVALID_MESSAGE)
  27. tool = self._tools[name]
  28. request_id = self.build_request_id(request_id)
  29. session_hash = hash_gateway_session_id(gateway_session_id)[:12]
  30. admin_id = session.get('admin_id')
  31. company_id = session.get('company_id')
  32. logger.info(f"[AUDIT] tool_call: session_hash={session_hash}, admin_id={admin_id}, company_id={company_id}, tool={name}, request_id={request_id}")
  33. try:
  34. result = self.api_client.call_tool(
  35. token=session['mcp_token'],
  36. tool_code=tool.name,
  37. route_path=tool.route_path,
  38. payload=arguments or {},
  39. request_id=request_id,
  40. )
  41. if hasattr(self.session_store, 'touch_session'):
  42. self.session_store.touch_session(gateway_session_id)
  43. logger.info(f"[AUDIT] tool_success: session_hash={session_hash}, tool={name}, request_id={request_id}, code={result.get('code')}")
  44. return result
  45. except Exception as e:
  46. logger.error(f"[AUDIT] tool_error: session_hash={session_hash}, tool={name}, request_id={request_id}, error={str(e)}")
  47. raise