Files
julius_baer_onboarding/services/julius_baer_api_client.py

74 lines
454 KiB
Python
Raw Normal View History

2025-04-12 01:37:45 +02:00
import requests
2025-04-13 10:03:25 +02:00
import json
2025-04-12 02:15:19 +02:00
import config
import logging
from dto.requests import GameStartRequestDTO, GameDecisionRequestDTO
2025-04-12 10:45:17 +02:00
from dto.responses import GameStartResponseDTO, GameDecisionResponseDTO
2025-04-12 01:37:45 +02:00
2025-04-12 02:15:19 +02:00
class JuliusBaerApiClient:
2025-04-12 01:37:45 +02:00
"""
2025-04-12 02:15:19 +02:00
Client for interacting with the Julius Baer API service.
2025-04-12 01:37:45 +02:00
Provides methods to start a game and make game decisions.
"""
def __init__(self):
2025-04-12 02:15:19 +02:00
self.api_uri = config.API_URI
self.api_key = config.API_KEY
self.api_team = config.API_TEAM
2025-04-12 01:37:45 +02:00
if not self.api_uri or not self.api_key or not self.api_team:
logging.error("[!] API credentials are not configured, edit .env file")
2025-04-12 01:37:45 +02:00
self.headers = {
2025-04-12 02:15:19 +02:00
"x-api-key": self.api_key,
"Content-Type": "application/json"
}
def start_game(self, game_start_request: GameStartRequestDTO) -> GameStartResponseDTO:
"""
Start a new game session.
"""
2025-04-12 13:59:59 +02:00
logging.debug("[+] Starting new game session")
start_uri = f"{self.api_uri}/game/start"
payload = game_start_request.model_dump_json()
try:
2025-04-13 10:03:25 +02:00
# response = requests.post(start_uri, data=payload, headers=self.headers)
# response.raise_for_status()
#
# response_json = response.json()
# validated_response = GameStartResponseDTO.model_validate(response_json)
# logging.debug(f"Game started successfully. Session: {validated_response.session_id}, Client: {validated_response.client_id}")
2025-04-13 10:03:25 +02:00
json_data = '{"message":"Game started successfully.","session_id":"0b5b1618-c954-4232-a9bf-8ac5ac0967e1","player_id":"OwogAztgWRdPfT2wWe7Xevdw98tdJelatlk82K6bozw","client_id":"43b8e0b3-3879-4fd6-80c8-d59f96556218","client_data":{"passport":"iVBORw0KGgoAAAANSUhEUgAAAZAAAAEsCAIAAABi1XKVAABXmUlEQVR4nO2ddVgUXRfA7wLSJR0qICWpdImAgoFiYxcqggqCoGB3YoGIYjcSgoiFKKE0KIgYIN2glNTSfH+MzrvfLkvoIqye33Mfnpkz55575gx79t67d2YIXV1dCAAAgB5gGGwHAAAA+gokLAAA6AZIWAAA0A2QsAAAoBuYqB0gEAh/0g8AAABSuv09sJseVk5ODmQrAAAGl26zEIEyjUG2AgBgiECWoMh7WJCtAAAYOpBlJJh0BwCAbqA66Y6Rk539Z/wAAADAkJaRoXYIelgAANANvfSwEMxoAQAwZIAeFgAAdAMkLAAA6IbehoT/j7Q01ckwAACAXyMnp68/7kEPCwAAuqF/Pay+J0IAAACa00vCgh8JAQAYOsCQEAAAuqF/Q8LRMOkOAACtyYVJdwAA/j7618PqeyIEAACgOXBrDgAAdAMMCQEAoBsgYQ04q1ZZRUREYH8H2xcAoG/IH5FM9ny/vFyYtAIA4I8iNfr/ViOQ5qj+9bA+ffo8yXQytk0kElesXLV5s3NHRweRSDxw8JC2jp6CovLsOfMio6IwnZycnNHSsikpqbgFJWWVpqYmhJD8GMW6ujpqCt02lJubKzVaBisysvJ6+ga379zFdDBruBE/P//Nm517cBg/Hdzg2HHqe/bsbWtrKy4uxoVYOXDwEKkdnPb2dnePs0bGJnLyChOMjC9duowfwvzp1hSZkXnzLfHr0a230dExa9ZY9/kS/WDzZudnz0L7W6sHNtrZy8krPH78BHeVMnSUtSIiIjZssKOUx8bG/sJJAUD/fiXEqa+vX716rbT06CNHDjMwMNiu38DENOyezx0xMbHY2LitW13d3I5NNDFBCPHy8hw8dOh+gD8jI2O3pnpWIG2oqKhIQEAgOSkBIdTR0fHmzdsVK1dZzJjOy8vbX4dx+ejRo8NfhnV1dZWXly9ZujwiIlJJSRFvBefTp8+UNl1ct5WXl5/38pKSksrIyHBx3cbDy7twgSWpDqUpUvLy8iQlJSmfo0/mraHh+F5PcEAhEokREZFJifE8PDy4kDJ0U6aQ53RqGBgYGBgYDIyzwN/Mr8xhVVdXL16yVFFR4ejRIwwMDKmp7zIyMs95ekhLS7OxsZmaTtqzZ5e7+1lMefhwvimTJ1++fIWatR4UyBoiO0okEhFC1PJg3+2gnwNhaenRGhrqvVrDKCgoiIiIvOh9QUlJkZ2dTV1dze34MVZWlj5Wx4iKemVsZNSzt1hn5NWr18uWrZgzd56yylg7+03t7e0IoSNHjiqrjJ01e66T85b79wO7urr2HziopKw6d978mtoazJqn5zlNLR1NLZ0TJ052dXW9evV6k4PjgoWLFZVUrl27fu6cl5KyyqzZc2tra0l9IKs1cZJpc3Ozmrpma2trz6G7eu26rp6+uobW0WPHSXvyZK5iJ0Xa/8K6hH10D/hn6XfCqq+vt1ywKCsr28pqFfbPmp6erqqqwsbGhusYTZjw8eNHfORlbb32eVhYUVExNZvdKlA2hBCqrKzEh4R79+1zczvGxcXVX4dJwYeZ+gaGubl5zc3NpK1gJTY2ltJsSkqqupoaaevq6mqzZs4kU+vZVHR0DFnvqQdvU9+l7t+3NyoyPDMzMyYm9vnzsJjYuJcvwo4cPhQVFYUQCg19npSUFBH+cv/+fW/fpiCEXr4Mf/T4cWBgwONHD2Ni44KCHiCEwsPDXVy2PHv6+MTJU11dXYkJ8Xx8w5+HvcAboqwV/vLF8OG8ebnZLCz/ZWTK0CUkJEZGRIY8DI6MeFlYUPjgQTCmSelqD/TqHvAv0++EVVVVtXTJ4q1btzg4OmHf8wihYUzDSHXIvocZGRl379q1d+8+aja7Vei2IQEBgbzc7Pdpqaamk2bOnEmZIProMM7o0aPzcrPzcrMTE+IEBQXOeZ3HW8FLt4OXrq4uPKFc8PbGPrrjDcm7Sz2Yam5ubmlpIRvP9uCtmpq6qqqqgICAupp67ffamJjYpUsWi4gIKykpTjefjhBKSEiYP2+esLCQirKyqekkhFBcfPzSJUskRo0SERFZs8YqNi4OIaSurqGpoSEhIcHDw21pacnJyamqqlr3/TveULe1KKEMXWxsbGxcnI6u/jg1jdDnz5OSkjBNSld7oFf3gH+ZficsSUnJ1autVlutYmVlOXPGHSE0btzYlNQUbICGERsbp6ioQDpYU1dXExUTxadsKaFUoGwIh4uL68zpUwEBAU+ePCWV79mzNyIyEiHU2dnJyMTYqx1ShISE5s6ZU1lZ2ZcgIIRUVVVTUlObmogIofW2tnm52S9fPO9jXYz4hARdXR0yYQ/esrP/6MMSCAh1IQbG/67dj8xJ+O83X+wrpLOzE9fp7OzEMiAbG+vPWgQWFmZE8dNwt7V6AA9dR0eno8MmPDsfO3YUU+jG1Z87nV0/2sL6tn1xD/iX+cV1WAwMDCfc3G7dvpOYmKSqqjp27Fg7u005OTmNjY2hz58fPHTYYdMmsiquLlsveHu3t3dQs9mtAmlDpHJOTs5trq4HDx3CUgaGkJDQ89Cw+vr6mNjYUSNH9sUOTk1N7dNnz7Q0NfsYARkZaWMjo3U2tp8/f25pacnOzrl3z5eZmbmP1RE2gWVM3iPro7cIofEGBn5+/hUVX798+fL0WSiBQBhvYODr51daWpqRkfHi5UuEkL6e3l0fn8LCovLyiuvXb+poa/fFsf7WwkOnr6/r6+eXmZn59etXq9Vrbt2+Q81VTM43nC8tLa2srCwlJTU+gepPEwCA01vCIlCUn8JREiO3b3fd7OT8ve67p6eHnLzcsuUrNDS1L1y46OZ2zNRsEpk+Nw+3ra1Na2srmbxXBbyhuvp6UpdmzZ4pKip6wdsbV162fGlxSbGWtm5NTc3yFct6cBg3gk/ETDI1ExYWtlq9ChHIJ54WLV5Cqik1WmblKitEQCdPuenr69nZO6iojlu2fDmxufnu3VtkjXZrCisfPnxQVlHuNbyNTU3kESMgRECmZpPGG46fZm6+Y+eucePGsrKxmk02NTMznTxlmuNmZ21tLURAk6eYmZubz5tvOWXqNC0tjUWLF3YbeTLLvdSiHrrxhuNXrVq5ymr1JNPJYmJiS5cupuYqJh87TlVfX9/UbMrRY8cmTzaj6lW3/4dQ/uLSQ0LqeeFofh4sHB3qFBQULlq05MbNa/JycoPtSy/QkavAICIpRXXh6C+uwwIGnfT0D07OW/Ly8nl5ea2t1wzlFEBHrgJDHOhhAQAwtOihhwU3PwMAQDdAwgIAgG6AhAUAAN0ACQsAALoBEhYAAHQDvEgVAAC6AXpYAADQDfDWHAAA6AboYQEAQDfQMmFVV9dISMpgRWq0nL6B0dVr1/GjnZ2dOroGa61tSKt8zshYtHiZ/BhlFVX1zU5bampqe5D3bD/gfuCUqdNl5RR1dA32HzjU2NiIEKqrq8OrSEjKKCqNXb1mXXV1DUJoxQor0kNY+fbtGw0D8jtcvnxVU0tPdazGpUtUH9ZqtRoei94/Au4HYhdadayGf8B9hFBTE1FRSfXjx08IoYaGhjVr1ykqjZ03f2FJSQnZLmXduz739PQnKCqN3blzT2trK64gLTPGdr1dV1fX1GkW+L/WkqUrMB98ff1XrlyNbbu4bi8upvpgS4AS2vew0t+nFORn52RnXL50wd3dMybmxzM2Y2PjBAUFExOTv379ikk6OjpWW1lPNjNNeZsUGRHW3tbuvMWlB3kP9i9cuHj6tMfWLc7vUpN9790tKytftHgZ/iCn1JTkgvzsgvzsF2FP6+rqTp48jRC6de
validated_response = GameStartResponseDTO.model_validate_json(json_data)
return validated_response
except Exception as e:
logging.error(f"[!] Failed to start game session: {e}")
raise
2025-04-12 01:37:45 +02:00
2025-04-13 10:03:25 +02:00
def send_decision(self, game_decision_request: GameDecisionRequestDTO) -> str :
2025-04-12 01:37:45 +02:00
"""
Make a game decision (Accept or Reject).
"""
2025-04-12 13:59:59 +02:00
logging.debug("[+] Sending decision")
decision_uri = f"{self.api_uri}/game/decision"
2025-04-12 01:37:45 +02:00
payload = game_decision_request.model_dump_json()
2025-04-12 01:37:45 +02:00
try:
2025-04-13 10:03:25 +02:00
# response = requests.post(decision_uri, data=payload, headers=self.headers)
# response.raise_for_status()
#
# response_json = response.json()
# validated_response = GameDecisionResponseDTO.model_validate(response_json)
# logging.debug("[+] Decision sent successfully")
2025-04-12 01:37:45 +02:00
2025-04-13 10:03:25 +02:00
return {"message":"Game started successfully.","session_id":"0b5b1618-c954-4232-a9bf-8ac5ac0967e1","player_id":"OwogAztgWRdPfT2wWe7Xevdw98tdJelatlk82K6bozw","client_id":"43b8e0b3-3879-4fd6-80c8-d59f96556218","client_data":{"passport":"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
except Exception as e:
2025-04-12 11:51:09 +02:00
logging.error(f"[!] Failed to send a decision: {e}")
raise