This commit is contained in:
@ -13,13 +13,14 @@ router = APIRouter(
|
|||||||
|
|
||||||
@router.post('/callback')
|
@router.post('/callback')
|
||||||
async def callback(request: Request):
|
async def callback(request: Request):
|
||||||
if not request.headers.get('content-type', '').startswith(
|
logger.info(request.headers.get('content-type', ''))
|
||||||
'application/xml'
|
# if not request.headers.get('content-type', '').startswith(
|
||||||
):
|
# 'application/xml'
|
||||||
logger.warning('Content-Type must be application/xml')
|
# ):
|
||||||
raise HTTPException(
|
# logger.warning('Content-Type must be application/xml')
|
||||||
status_code=400, detail='Content-Type must be application/xml'
|
# raise HTTPException(
|
||||||
)
|
# status_code=400, detail='Content-Type must be application/xml'
|
||||||
|
# )
|
||||||
|
|
||||||
body_bytes = await request.body()
|
body_bytes = await request.body()
|
||||||
if not body_bytes:
|
if not body_bytes:
|
||||||
|
|||||||
@ -14,6 +14,7 @@ from clients import clients as c
|
|||||||
from clients.tmk import schema as ts
|
from clients.tmk import schema as ts
|
||||||
from clients.vitacore import schema as vs
|
from clients.vitacore import schema as vs
|
||||||
from shared import exceptions as e
|
from shared import exceptions as e
|
||||||
|
from shared.redis import cache_response
|
||||||
from shared.redis import client as cache
|
from shared.redis import client as cache
|
||||||
|
|
||||||
from . import schema as s
|
from . import schema as s
|
||||||
@ -27,7 +28,13 @@ router = APIRouter(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@router.get('/getProfile', response_model=vs.ProfileModel)
|
@cache_response(ttl=600, namespace='main')
|
||||||
|
@router.get(
|
||||||
|
'/getProfile',
|
||||||
|
responses={
|
||||||
|
status.HTTP_200_OK: {'model': vs.ProfileModel},
|
||||||
|
},
|
||||||
|
)
|
||||||
async def get_profile(user: Annotated[User, Depends(login)]):
|
async def get_profile(user: Annotated[User, Depends(login)]):
|
||||||
"""
|
"""
|
||||||
Get profile of user.
|
Get profile of user.
|
||||||
@ -35,6 +42,7 @@ 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)
|
||||||
|
|
||||||
|
|
||||||
|
@cache_response(ttl=3600, namespace='main')
|
||||||
@router.get(
|
@router.get(
|
||||||
'/getDepartments',
|
'/getDepartments',
|
||||||
responses={
|
responses={
|
||||||
@ -48,7 +56,10 @@ async def get_departments():
|
|||||||
return await c.vitacore_api.getDepartments()
|
return await c.vitacore_api.getDepartments()
|
||||||
|
|
||||||
|
|
||||||
@router.get('/getWorkers', response_model=vs.WorkersModel)
|
@cache_response(ttl=3600, namespace='main')
|
||||||
|
@router.get(
|
||||||
|
'/getWorkers', responses={status.HTTP_200_OK: {'model': vs.WorkersModel}}
|
||||||
|
)
|
||||||
async def get_workers(
|
async def get_workers(
|
||||||
user: Annotated[User, Depends(login)], departmentId: str
|
user: Annotated[User, Depends(login)], departmentId: str
|
||||||
):
|
):
|
||||||
@ -58,7 +69,11 @@ async def get_workers(
|
|||||||
return await c.vitacore_api.getWorkers(departmentId)
|
return await c.vitacore_api.getWorkers(departmentId)
|
||||||
|
|
||||||
|
|
||||||
@router.get('/getSpecs', response_model=vs.SpecsV021Model)
|
@cache_response(ttl=3600, namespace='main')
|
||||||
|
@router.get(
|
||||||
|
'/getSpecs',
|
||||||
|
responses={status.HTTP_200_OK: {'model': vs.SpecsV021Model}},
|
||||||
|
)
|
||||||
async def get_specs(user: Annotated[User, Depends(login)]):
|
async def get_specs(user: Annotated[User, Depends(login)]):
|
||||||
"""
|
"""
|
||||||
Get list of specialties.
|
Get list of specialties.
|
||||||
@ -66,7 +81,9 @@ async def get_specs(user: Annotated[User, Depends(login)]):
|
|||||||
return await c.vitacore_api.getSpecsV021()
|
return await c.vitacore_api.getSpecsV021()
|
||||||
|
|
||||||
|
|
||||||
@router.get('/getEntries', response_model=vs.EntriesModel)
|
@router.get(
|
||||||
|
'/getEntries', responses={status.HTTP_200_OK: {'model': vs.EntriesModel}}
|
||||||
|
)
|
||||||
async def get_entries(user: Annotated[User, Depends(login)]):
|
async def get_entries(user: Annotated[User, Depends(login)]):
|
||||||
"""
|
"""
|
||||||
Get list of entries for user by id.
|
Get list of entries for user by id.
|
||||||
|
|||||||
@ -1,5 +1,45 @@
|
|||||||
|
from collections.abc import Callable, Coroutine
|
||||||
|
from functools import wraps
|
||||||
|
from typing import Any, TypeVar
|
||||||
|
|
||||||
|
from fastapi.responses import ORJSONResponse
|
||||||
|
from orjson import dumps, loads
|
||||||
from redis.asyncio import Redis
|
from redis.asyncio import Redis
|
||||||
|
|
||||||
|
from apps.users.models import User
|
||||||
from core.config import settings
|
from core.config import settings
|
||||||
|
|
||||||
client = Redis.from_url(settings.REDIS_URL)
|
client = Redis.from_url(settings.REDIS_URL)
|
||||||
|
T = TypeVar('T')
|
||||||
|
|
||||||
|
|
||||||
|
def cache_response(ttl: int = 60, namespace: str = 'main'):
|
||||||
|
def decorator(
|
||||||
|
func: Callable[..., Coroutine[Any, Any, T]],
|
||||||
|
) -> Callable[..., Coroutine[Any, Any, T | ORJSONResponse]]:
|
||||||
|
@wraps(func)
|
||||||
|
async def wrapper(*args: Any, **kwargs: Any):
|
||||||
|
cache_key = f'endpoints:{namespace}_{func.__name__}'
|
||||||
|
user = kwargs.get('user')
|
||||||
|
user_id = kwargs.get('user_id')
|
||||||
|
|
||||||
|
if user_id:
|
||||||
|
cache_key += f':{user_id}'
|
||||||
|
|
||||||
|
if isinstance(user, User):
|
||||||
|
cache_key += f':{user.id}'
|
||||||
|
|
||||||
|
cached_value = await client.get(cache_key)
|
||||||
|
if cached_value:
|
||||||
|
return ORJSONResponse(
|
||||||
|
content=loads(cached_value), headers={'X-Cache': 'hit'}
|
||||||
|
)
|
||||||
|
|
||||||
|
response = await func(*args, **kwargs)
|
||||||
|
await client.set(cache_key, dumps(response), ex=ttl)
|
||||||
|
|
||||||
|
return response
|
||||||
|
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|||||||
Reference in New Issue
Block a user