async def main(): logger = get_logger(__name__) runner = web.AppRunner(await application()) await runner.setup() port = config.api_server.port site = web.TCPSite(runner, port=port, backlog=1024) await site.start() logger.debug(f"Run server / {port}") # Infinite loop for maintaining server alive # https://github.com/aio-libs/aiohttp/blob/master/aiohttp/web.py#L365 while True: await asyncio.sleep(100 * 3600)
import json import datetime import uuid import deserialize from aiohttp import web from jauth.exception.request import IncompleteParameterError, TypeConvertError from jauth.util.logger.logger import get_logger from jauth.util.util import datetime_to_kst_datetime, datetime_to_utc_datetime logger = get_logger(__name__) class ManualJSONEncoder(json.JSONEncoder): def default(self, o): if isinstance(o, datetime.datetime): r = datetime_to_kst_datetime( datetime_to_utc_datetime(o)).isoformat() return r if isinstance(o, uuid.UUID): return str(o) return super().default(o) def json_response( result=None, reason=None, status=200, headers=None, ):
async def application(): logger = get_logger(__name__) app = web.Application(logger=logger) logger.debug(object_to_dict(config)) mysql_config = config.api_server.mysql await init_db( host=mysql_config.host, port=mysql_config.port, user=mysql_config.user, password=mysql_config.password, db=mysql_config.database, ) user_repository = UserRepositoryImpl() token_repository = TokenRepositoryImpl() external = { "third_party": { "facebook": DummyThirdPartyRequest( { "dummy-facebook-token": "dummy-facebook-user-id", "dummy-facebook-token-dup": "dummy-facebook-user-id", }, UserType.FACEBOOK, ), "kakao": DummyThirdPartyRequest( { "dummy-kakao-token": "dummy-kakao-user-id", "dummy-kakao-token-dup": "dummy-kakao-user-id", }, UserType.KAKAO, ), "apple": DummyThirdPartyRequest( { "dummy-apple-token": "dummy-apple-user-id", "dummy-apple-token-dup": "dummy-apple-user-id", }, UserType.APPLE, ), "google": DummyThirdPartyRequest( { "dummy-google-token": "dummy-google-user-id", "dummy-google-token-dup": "dummy-google-user-id", }, UserType.GOOGLE, ), }, } secret = { "jwt_secret": config.api_server.jwt_secret, "internal_api_keys": config.api_server.internal_api_keys, } user_creation_callback_handler = DummyCallbackHandler() user_update_callback_handler = DummyCallbackHandler() resource_list: Dict[str, BaseResource] = { "/users": UsersHttpResource( user_creation_callback_handler=user_creation_callback_handler, user_update_callback_handler=user_update_callback_handler, user_repository=user_repository, secret=secret, external=external, ), "/token": TokenHttpResource( user_repository=user_repository, token_repository=token_repository, secret=secret, external=external, ), "/internal": InternalHttpResource( user_repository=user_repository, secret=secret, ), } async def cleanup(request): await User.all().delete() await Token.all().delete() return json_response(result={"status": "done"}) app.router.add_get("/storage/clean-up", cleanup) for path, resource in resource_list.items(): subapp = web.Application(logger=logger) resource.route(subapp.router) plugin_app(app, path, subapp) cors = aiohttp_cors.setup(app) allow_url = "*" for route in list(app.router.routes()): cors.add( route, { allow_url: aiohttp_cors.ResourceOptions( allow_credentials=True, allow_headers="*", allow_methods=[route.method], ) }, ) return app
async def application(): logger = get_logger(__name__) app = web.Application(logger=logger) logger.debug(object_to_dict(config)) mysql_config = config.api_server.mysql await init_db( host=mysql_config.host, port=mysql_config.port, user=mysql_config.user, password=mysql_config.password, db=mysql_config.database, ) user_repository = UserRepositoryImpl() token_repository = TokenRepositoryImpl() external = { "third_party": { "facebook": FacebookToken(), "kakao": KakaoToken(), "apple": AppleToken(), "google": GoogleToken(), }, } secret = { "jwt_secret": config.api_server.jwt_secret, "internal_api_keys": config.api_server.internal_api_keys, } user_creation_callback_handler = UserCreationCallbackHandler( config.api_server.event_callback_urls ) user_update_callback_handler = UserUpdateCallbackHandler( config.api_server.event_callback_urls ) resource_list: Dict[str, BaseResource] = { "/users": UsersHttpResource( user_creation_callback_handler=user_creation_callback_handler, user_update_callback_handler=user_update_callback_handler, user_repository=user_repository, secret=secret, external=external, ), "/token": TokenHttpResource( user_repository=user_repository, token_repository=token_repository, secret=secret, external=external, ), "/internal": InternalHttpResource( user_repository=user_repository, secret=secret, ), } for path, resource in resource_list.items(): subapp = web.Application(logger=logger) resource.route(subapp.router) plugin_app(app, path, subapp) cors = aiohttp_cors.setup(app) allow_url = "*" for route in list(app.router.routes()): cors.add( route, { allow_url: aiohttp_cors.ResourceOptions( allow_credentials=True, allow_headers="*", allow_methods=[route.method], ) }, ) return app
async def application(): logger = get_logger(__name__) app = web.Application(logger=logger) logger.debug(object_to_dict(config)) mysql_config = config.api_server.mysql await init_db( host=mysql_config.host, port=mysql_config.port, user=mysql_config.user, password=mysql_config.password, db=mysql_config.database, ) redis_config = config.api_server.redis token_cache: ConnectionsPool = await aioredis.create_pool( f'redis://{redis_config.host}:{redis_config.port}', password=redis_config.password, minsize=5, maxsize=10, db=redis_config.token_cache.database, ) storage = { 'redis': { 'token_cache': token_cache, } } external = { 'third_party': { 'facebook': FacebookToken(), 'kakao': KakaoToken(), 'apple': AppleToken(), 'google': GoogleToken(), }, } secret = { 'jwt_secret': config.api_server.jwt_secret, 'internal_api_keys': config.api_server.internal_api_keys, } resource_list = { '/users': UsersHttpResource, '/token': TokenHttpResource, '/internal': InternalHttpResource, } for path, resource in resource_list.items(): subapp = web.Application(logger=logger) resource( router=subapp.router, storage=storage, secret=secret, external=external, ).route() plugin_app(app, path, subapp) cors = aiohttp_cors.setup(app) allow_url = '*' for route in list(app.router.routes()): cors.add( route, { allow_url: aiohttp_cors.ResourceOptions(allow_credentials=True, allow_headers='*', allow_methods=[route.method]) }) return app