from aiohttp import web from aiohttp_apispec import docs, headers_schema, querystring_schema from server.cache.base import get_cache, get_value_by_str_key from server.constants import BASE_API_PREFIX, NONEXISTENT_DATE from server.schemas.auth import CheckSession, UserHeader from server.utils.response import dump_response_schema router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/auth/check-session/") @docs( tags=["auth"], summary="Get if an user authorized and last status update date.", ) @headers_schema(UserHeader) @querystring_schema(CheckSession.Request) @dump_response_schema(CheckSession.Response) async def get(request: web.Request) -> web.Response: redis_client = get_cache().cache_client t = request["querystring"]["t"] user_id = request["headers"]["user_id"] updated_at = await redis_client.get(f"auth0:user_{user_id}:updated_at") if updated_at and t is not None and int(updated_at) > t: response = {"need_authorize": True, "updated_at": updated_at} details = await redis_client.get(f"auth0:user_{user_id}:details") if details: if isinstance(details, bytes): details = str(details, "utf-8") response["details"] = details return response # if we do not have data in redis then return some old timestamp that can not exist for sure return web.json_response( { "need_authorize": updated_at is not None and t is None, "updated_at": int(updated_at) if updated_at else NONEXISTENT_DATE, } )