112 lines
3.3 KiB
Python
112 lines
3.3 KiB
Python
from datetime import date
|
|
from logging import getLogger
|
|
from typing import Literal
|
|
|
|
from fastapi import status as st
|
|
from httpx import AsyncClient
|
|
|
|
from core.config import settings
|
|
from shared import exceptions as e
|
|
from shared.functions import clean_params
|
|
from shared.redis import client as cache
|
|
|
|
from . import schema as s
|
|
|
|
|
|
class TMK_API(AsyncClient):
|
|
def __init__(self):
|
|
self.logger = getLogger(__name__)
|
|
super().__init__(base_url=settings.TMK_BASE_URL, verify=False)
|
|
|
|
async def get_token(self):
|
|
token = await cache.get('tmk_token')
|
|
|
|
if token is None:
|
|
token = await self.login()
|
|
await cache.set('tmk_token', token, 10800)
|
|
|
|
else:
|
|
token = token.decode()
|
|
|
|
return token
|
|
|
|
async def login(self):
|
|
req = await self.post(
|
|
'/auth',
|
|
json={
|
|
'login': settings.TMK_LOGIN,
|
|
'password': settings.TMK_PASSWORD,
|
|
},
|
|
)
|
|
|
|
match req.status_code:
|
|
case st.HTTP_200_OK:
|
|
return s.AccessTokenModel.model_validate(
|
|
req.json()
|
|
).access_token
|
|
|
|
case _:
|
|
self.logger.error(req.json())
|
|
raise e.UnknownException
|
|
|
|
async def getQueue(
|
|
self,
|
|
code_mo: str | None = None,
|
|
doctor_spec: str | None = None,
|
|
doctor_snils: str | None = None,
|
|
doctor_snils_strict: Literal['y', 'n'] = 'n',
|
|
date_begin: date | None = None,
|
|
date_end: date | None = None,
|
|
patient_snils: str | None = None,
|
|
patient_fio: str | None = None,
|
|
patient_policy: str | None = None,
|
|
patient_phone: str | None = None,
|
|
patient_birthdate: date | None = None,
|
|
tk_status: str | None = None,
|
|
):
|
|
token = await self.get_token()
|
|
req = await self.get(
|
|
'/getQueue',
|
|
headers={'Authorization': f'Bearer {token}'},
|
|
params=clean_params(
|
|
{
|
|
'code_mo': code_mo,
|
|
'doctor_spec': doctor_spec,
|
|
'doctor_snils': doctor_snils,
|
|
'doctor_snils_strict': doctor_snils_strict,
|
|
'date_begin': date_begin,
|
|
'date_end': date_end,
|
|
'patient_snils': patient_snils,
|
|
'patient_fio': patient_fio,
|
|
'patient_policy': patient_policy,
|
|
'patient_phone': patient_phone,
|
|
'patient_birthdate': patient_birthdate,
|
|
'tk_status': tk_status,
|
|
}
|
|
),
|
|
)
|
|
|
|
match req.status_code:
|
|
case st.HTTP_200_OK:
|
|
return [s.QueueModel.model_validate(i) for i in req.json()]
|
|
|
|
case _:
|
|
self.logger.error(req.json())
|
|
raise e.UnknownException
|
|
|
|
async def getInfo(self, guid: str):
|
|
token = await self.get_token()
|
|
req = await self.get(
|
|
'/getTMKInfo',
|
|
headers={'Authorization': f'Bearer {token}'},
|
|
params={'guid': guid},
|
|
)
|
|
|
|
match req.status_code:
|
|
case st.HTTP_200_OK:
|
|
return s.QueueModel.model_validate(req.json())
|
|
|
|
case _:
|
|
self.logger.error(req.json())
|
|
raise e.UnknownException
|