This commit is contained in:
@ -73,6 +73,6 @@ async def callback(session: AsyncSessionDep, code: str):
|
|||||||
user = existing_user
|
user = existing_user
|
||||||
|
|
||||||
access_token = secrets.token_urlsafe(32)
|
access_token = secrets.token_urlsafe(32)
|
||||||
cache.set(access_token, f'user:{user.id}')
|
await cache.set(access_token, f'user:{user.id}')
|
||||||
|
|
||||||
return s.Token(access_token=access_token)
|
return s.Token(access_token=access_token)
|
||||||
|
|||||||
@ -3,11 +3,11 @@ from shared.redis import client as cache
|
|||||||
|
|
||||||
|
|
||||||
async def token():
|
async def token():
|
||||||
access_token = cache.get('tdn_token')
|
access_token = await cache.get('tdn_token')
|
||||||
|
|
||||||
if access_token is None:
|
if access_token is None:
|
||||||
tokens = await c.tdn_api.signin()
|
tokens = await c.tdn_api.signin()
|
||||||
cache.set('tdn_token', tokens.accessToken, 60)
|
await cache.set('tdn_token', tokens.accessToken, 60)
|
||||||
|
|
||||||
return tokens.accessToken
|
return tokens.accessToken
|
||||||
|
|
||||||
|
|||||||
@ -16,12 +16,15 @@ async def login(
|
|||||||
session: AsyncSessionDep,
|
session: AsyncSessionDep,
|
||||||
credentials: Annotated[HTTPAuthorizationCredentials, Depends(BEARER)],
|
credentials: Annotated[HTTPAuthorizationCredentials, Depends(BEARER)],
|
||||||
):
|
):
|
||||||
user = cache.get(credentials.credentials)
|
user = await cache.get(credentials.credentials)
|
||||||
|
|
||||||
if user is None:
|
if user is None:
|
||||||
raise e.UnauthorizedException
|
raise e.UnauthorizedException
|
||||||
|
|
||||||
_, user_id = user.decode().split(':')
|
try:
|
||||||
|
_, user_id = user.decode().split(':')
|
||||||
|
except ValueError:
|
||||||
|
raise e.UnauthorizedException from None
|
||||||
|
|
||||||
user_model_stmt = select(User).where(User.id == int(user_id))
|
user_model_stmt = select(User).where(User.id == int(user_id))
|
||||||
user_model = (await session.execute(user_model_stmt)).scalar_one_or_none()
|
user_model = (await session.execute(user_model_stmt)).scalar_one_or_none()
|
||||||
|
|||||||
@ -31,7 +31,12 @@ async def get_profile(user: Annotated[User, Depends(login)]):
|
|||||||
return await c.vitacore_api.getProfile(user.vita_id)
|
return await c.vitacore_api.getProfile(user.vita_id)
|
||||||
|
|
||||||
|
|
||||||
@router.get('/getDepartments', response_model=list[vs.OrganizationsModel])
|
@router.get(
|
||||||
|
'/getDepartments',
|
||||||
|
responses={
|
||||||
|
status.HTTP_200_OK: {'model': vs.OrganizationsModel},
|
||||||
|
},
|
||||||
|
)
|
||||||
async def get_departments():
|
async def get_departments():
|
||||||
"""
|
"""
|
||||||
Get list of departments.
|
Get list of departments.
|
||||||
@ -346,7 +351,7 @@ async def measurement(
|
|||||||
'status': status,
|
'status': status,
|
||||||
}
|
}
|
||||||
cache_key = f'tdn:measurement:{user.id}:{created}'
|
cache_key = f'tdn:measurement:{user.id}:{created}'
|
||||||
cache.set(cache_key, dumps(data))
|
await cache.set(cache_key, dumps(data))
|
||||||
|
|
||||||
|
|
||||||
@router.get('/measurements')
|
@router.get('/measurements')
|
||||||
@ -354,6 +359,7 @@ async def measurements(
|
|||||||
user: Annotated[User, Depends(login)],
|
user: Annotated[User, Depends(login)],
|
||||||
):
|
):
|
||||||
data = [
|
data = [
|
||||||
cache.get(key) for key in cache.keys(f'tdn:measurement:{user.id}:*')
|
cache.get(key)
|
||||||
|
for key in await cache.keys(f'tdn:measurement:{user.id}:*')
|
||||||
]
|
]
|
||||||
return data
|
return data
|
||||||
|
|||||||
@ -102,8 +102,8 @@ class SeriesValueModel(BaseModel):
|
|||||||
realm: SeriesRealmModel
|
realm: SeriesRealmModel
|
||||||
createdAt: datetime
|
createdAt: datetime
|
||||||
updatedAt: datetime
|
updatedAt: datetime
|
||||||
nvalue: str | None
|
nvalue: int | None
|
||||||
fvalue: str | None
|
fvalue: float | None
|
||||||
svalue: str | None
|
svalue: str | None
|
||||||
filepath: str | None
|
filepath: str | None
|
||||||
mobileId: str | None
|
mobileId: str | None
|
||||||
|
|||||||
@ -19,11 +19,11 @@ class TMK_API(AsyncClient):
|
|||||||
super().__init__(base_url=settings.TMK_BASE_URL, verify=False)
|
super().__init__(base_url=settings.TMK_BASE_URL, verify=False)
|
||||||
|
|
||||||
async def get_token(self):
|
async def get_token(self):
|
||||||
token = cache.get('tmk_token')
|
token = await cache.get('tmk_token')
|
||||||
|
|
||||||
if token is None:
|
if token is None:
|
||||||
token = await self.login()
|
token = await self.login()
|
||||||
cache.set('tmk_token', token, 10800)
|
await cache.set('tmk_token', token, 10800)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
token = token.decode()
|
token = token.decode()
|
||||||
|
|||||||
@ -3,6 +3,7 @@ from logging import getLogger
|
|||||||
|
|
||||||
from fastapi import status as st
|
from fastapi import status as st
|
||||||
from httpx import AsyncClient, BasicAuth
|
from httpx import AsyncClient, BasicAuth
|
||||||
|
from orjson import dumps, loads
|
||||||
|
|
||||||
from core.config import settings
|
from core.config import settings
|
||||||
from shared import exceptions as e
|
from shared import exceptions as e
|
||||||
@ -17,16 +18,28 @@ class VITACORE_API(AsyncClient):
|
|||||||
super().__init__(base_url=settings.VITACORE_BASE_URL)
|
super().__init__(base_url=settings.VITACORE_BASE_URL)
|
||||||
|
|
||||||
async def get_token(self):
|
async def get_token(self):
|
||||||
token = cache.get('vitacore_token')
|
token = await self.get_cache('vitacore_token')
|
||||||
|
|
||||||
if token is None:
|
if token is None:
|
||||||
token = await self.login()
|
token = await self.login()
|
||||||
cache.set('vitacore_token', token, 10800)
|
await self.set_cache(
|
||||||
|
'vitacore_token', dumps({'token': token}).decode(), 10800
|
||||||
|
)
|
||||||
|
|
||||||
else:
|
return token
|
||||||
token = token.decode()
|
|
||||||
|
|
||||||
return token
|
return token['token']
|
||||||
|
|
||||||
|
async def get_cache(self, key: str):
|
||||||
|
data = await cache.get(key)
|
||||||
|
|
||||||
|
if data:
|
||||||
|
return loads(data.decode())
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
async def set_cache(self, key: str, value: str, ttl: int = 600):
|
||||||
|
await cache.set(key, value, ttl)
|
||||||
|
|
||||||
async def login(self):
|
async def login(self):
|
||||||
req = await self.post(
|
req = await self.post(
|
||||||
@ -45,6 +58,11 @@ class VITACORE_API(AsyncClient):
|
|||||||
raise e.UnknownException
|
raise e.UnknownException
|
||||||
|
|
||||||
async def findBySnils(self, snils: str):
|
async def findBySnils(self, snils: str):
|
||||||
|
data = await self.get_cache(f'vitacore_findBySnils:{snils}')
|
||||||
|
|
||||||
|
if data:
|
||||||
|
return s.PatientsModel.model_validate(data)
|
||||||
|
|
||||||
token = await self.get_token()
|
token = await self.get_token()
|
||||||
req = await self.get(
|
req = await self.get(
|
||||||
'/findBySnils',
|
'/findBySnils',
|
||||||
@ -54,12 +72,23 @@ class VITACORE_API(AsyncClient):
|
|||||||
|
|
||||||
match req.status_code:
|
match req.status_code:
|
||||||
case st.HTTP_200_OK:
|
case st.HTTP_200_OK:
|
||||||
return s.PatientsModel.model_validate(req.json())
|
model = s.PatientsModel.model_validate(req.json())
|
||||||
|
await self.set_cache(
|
||||||
|
f'vitacore_findBySnils:{snils}',
|
||||||
|
model.model_dump_json(),
|
||||||
|
14400,
|
||||||
|
)
|
||||||
|
return model
|
||||||
case _:
|
case _:
|
||||||
self.logger.error(req.json())
|
self.logger.error(req.json())
|
||||||
raise e.UnknownException
|
raise e.UnknownException
|
||||||
|
|
||||||
async def getProfile(self, patId: str):
|
async def getProfile(self, patId: str):
|
||||||
|
data = await self.get_cache(f'vitacore_getProfile:{patId}')
|
||||||
|
|
||||||
|
if data:
|
||||||
|
return s.ProfileModel.model_validate(data)
|
||||||
|
|
||||||
token = await self.get_token()
|
token = await self.get_token()
|
||||||
req = await self.get(
|
req = await self.get(
|
||||||
'/getProfile',
|
'/getProfile',
|
||||||
@ -69,12 +98,23 @@ class VITACORE_API(AsyncClient):
|
|||||||
|
|
||||||
match req.status_code:
|
match req.status_code:
|
||||||
case st.HTTP_200_OK:
|
case st.HTTP_200_OK:
|
||||||
return s.ProfileModel.model_validate(req.json())
|
model = s.ProfileModel.model_validate(req.json())
|
||||||
|
await self.set_cache(
|
||||||
|
f'vitacore_getProfile:{patId}',
|
||||||
|
model.model_dump_json(),
|
||||||
|
14400,
|
||||||
|
)
|
||||||
|
return model
|
||||||
case _:
|
case _:
|
||||||
self.logger.error(req.json())
|
self.logger.error(req.json())
|
||||||
raise e.UnknownException
|
raise e.UnknownException
|
||||||
|
|
||||||
async def getDepartments(self):
|
async def getDepartments(self):
|
||||||
|
data = await self.get_cache('vitacore_getDepartments')
|
||||||
|
|
||||||
|
if data:
|
||||||
|
return s.OrganizationsModel.model_validate(data)
|
||||||
|
|
||||||
token = await self.get_token()
|
token = await self.get_token()
|
||||||
req = await self.get(
|
req = await self.get(
|
||||||
'/getDepartments', headers={'Authorization': f'Bearer {token}'}
|
'/getDepartments', headers={'Authorization': f'Bearer {token}'}
|
||||||
@ -82,7 +122,13 @@ class VITACORE_API(AsyncClient):
|
|||||||
|
|
||||||
match req.status_code:
|
match req.status_code:
|
||||||
case st.HTTP_200_OK:
|
case st.HTTP_200_OK:
|
||||||
return s.OrganizationsModel.model_validate(req.json())
|
model = s.OrganizationsModel.model_validate(req.json())
|
||||||
|
await self.set_cache(
|
||||||
|
'vitacore_getDepartments',
|
||||||
|
model.model_dump_json(),
|
||||||
|
14400,
|
||||||
|
)
|
||||||
|
return model
|
||||||
case _:
|
case _:
|
||||||
self.logger.error(req.text)
|
self.logger.error(req.text)
|
||||||
raise e.UnknownException
|
raise e.UnknownException
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
from redis import Redis
|
from redis.asyncio import Redis
|
||||||
|
|
||||||
from core.config import settings
|
from core.config import settings
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user