from aiohttp import web from aiohttp_apispec import docs, headers_schema, querystring_schema from apollo_utils.service.clients.aiohttp.utils.response import dump_response_schema from apollo_utils.service.exceptions import NotFound from apollo_utils.service.schemas.headers import AppHeader from server.constants.core import BASE_API_PREFIX from server.db.models.core import Account, Application from server.schemas.accounts.users import Accounts router = web.RouteTableDef() @router.get(BASE_API_PREFIX + "/v2/accounts/") @docs( tags=["accounts", "v2"], summary="Get or create an account.", ) @headers_schema(AppHeader) @querystring_schema(Accounts.Get.Request) @dump_response_schema(Accounts.Get.Response, apply=False) async def get_or_create_account(request: web.Request) -> web.Response: app_slug, params = request["headers"]["app"], request["querystring"] user_id, get_or_create = params["user_id"], params["get_or_create"] application = await Application.get(slug=app_slug) if not application: raise NotFound(f"Application with slug {app_slug} not found.") if get_or_create: account, is_created = await Account.get_or_create(user_id=user_id, app_slug=app_slug) else: account = await Account.get(user_id=user_id, app_slug=app_slug) if not account: raise NotFound(f"Account for application {app_slug} and user {user_id} not found.") is_created = False return web.json_response( {"id": account.id, "user_id": account.user_id, "app_slug": account.app_slug, "is_created": is_created} )