from aiohttp import web from aiohttp_apispec import docs, headers_schema, json_schema from http import HTTPStatus as http_status from server.constants.core import BASE_API_PREFIX from server.db import db_session from server.db.models.users import Device from server.scenarios.devices import register_user_device from server.schemas.headers import AccountHeader from server.schemas.users.devices import UsersDevices, UsersDevicesDeactivateBulk router = web.RouteTableDef() @router.post(BASE_API_PREFIX + "/users/devices/register/") @docs( tags=["users", "devices"], summary="Register user device as ACTIVE.", ) @headers_schema(UsersDevices.RequestHeader) @json_schema(UsersDevices.Request) async def get_user_device(request: web.Request) -> web.Response: headers, data = request["headers"], request["json"] user_id, app_slug, app_version = headers["user_id"], headers["app"], headers["app_version"] expo_token, device_inner_id, os = data["expo_token"], data["device_inner_id"], data["os"] status = await register_user_device( expo_token=expo_token, inner_id=device_inner_id, os=os, user_id=user_id, app_slug=app_slug, app_version=app_version, ) return web.Response(status=status) @router.post(BASE_API_PREFIX + "/users/devices/unregister/") @docs( tags=["users", "devices"], summary="Register user device as INACTIVE.", ) @headers_schema(AccountHeader) @json_schema(UsersDevices.Request) async def update_user_device(request: web.Request) -> web.Response: headers, data = request["headers"], request["json"] user_id, app_slug = headers["user_id"], headers["app"] expo_token, device_inner_id, os = data["expo_token"], data["device_inner_id"], data["os"] async with db_session() as session: device = await Device.get( inner_id=device_inner_id, os=os, token=expo_token, account_id=Device.q_account_id(app_slug=app_slug, user_id=user_id), session=session, ) if not device: return web.Response( status=http_status.BAD_REQUEST, text=f"Can`t update users status. No such user with provided request data", ) device.status = False return web.Response() @router.put(BASE_API_PREFIX + "/users/devices/unregister/") @docs( tags=["users", "devices"], summary="Set user device as INACTIVE by device_id, bulk.", ) @json_schema(UsersDevicesDeactivateBulk.Request) async def deactivate_user_device(request: web.Request) -> web.Response: await Device.update_bulk(request["json"]["data"], bind_values=("status",), bind_filters=("id", "token")) return web.Response(status=http_status.ACCEPTED)