client.py 2.14 KB
import json
import os
import time
from typing import Dict, Optional

import requests


class ApiClient:

	def __init__(self, base_url: str):
		self.base_url = base_url.rstrip('/')
		self.session = requests.Session()
		self.token_path = os.path.join(os.path.dirname(__file__), '.token.json')
		self.token: Optional[str] = None
		self._load_token()

	def _load_token(self) -> None:
		if os.path.exists(self.token_path):
			try:
				with open(self.token_path, 'r', encoding='utf-8') as f:
					data = json.load(f)
					self.token = data.get('token')
			except Exception:
				self.token = None

	def _save_token(self, token: str) -> None:
		self.token = token
		data = {
			'token': token,
			'saved_at': int(time.time())
		}
		with open(self.token_path, 'w', encoding='utf-8') as f:
			json.dump(data, f, ensure_ascii=False, indent=2)

	def set_token(self, token: str) -> None:
		self._save_token(token)

	def _headers(self, extra: Optional[Dict[str, str]] = None) -> Dict[str, str]:
		headers: Dict[str, str] = {
			'Content-Type': 'application/json'
		}
		if self.token:
			headers['Authorization'] = f'Bearer {self.token}'
		if extra:
			headers.update(extra)
		return headers

	def post(self, path: str, json_body: Dict, auth: bool = True) -> requests.Response:
		url = f"{self.base_url}{path}"
		headers = self._headers() if auth else {'Content-Type': 'application/json'}
		return self.session.post(url, headers=headers, json=json_body, timeout=30)

	def get(self, path: str, params: Optional[Dict] = None, auth: bool = True) -> requests.Response:
		url = f"{self.base_url}{path}"
		headers = self._headers() if auth else {}
		return self.session.get(url, headers=headers, params=params or {}, timeout=30)

	def put(self, path: str, json_body: Dict, auth: bool = True) -> requests.Response:
		url = f"{self.base_url}{path}"
		headers = self._headers() if auth else {'Content-Type': 'application/json'}
		return self.session.put(url, headers=headers, json=json_body, timeout=30)

	def delete(self, path: str, auth: bool = True) -> requests.Response:
		url = f"{self.base_url}{path}"
		headers = self._headers() if auth else {}
		return self.session.delete(url, headers=headers, timeout=30)