Beispiel #1
0
async def application():
    logger = get_logger(__name__)

    app = web.Application(logger=logger)
    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

    notification_queue_pool = await aioredis.create_pool(
        f'redis://{redis_config.host}:{redis_config.port}',
        password=redis_config.password,
        minsize=5,
        maxsize=10,
        db=redis_config.notification_queue.database,
    )

    storage = {
        'redis': {
            'notification_queue': notification_queue_pool,
        }
    }
    external = {}
    secret = {}
    resource_list = {
        '/devices': DevicesHttpResource,
        '/notifications': NotificationsHttpResource,
    }

    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
Beispiel #2
0
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)
Beispiel #3
0
import deserialize

from common.logger.logger import get_logger
from common.structure.job.messaging import DevicePlatform
from common.structure.job.notification import NotificationSentResultMessageArgs
from worker.notification.external.jraze.jraze import JrazeApi
from worker.notification.task import AbstractTask

logger = get_logger(__name__)


class UpdatePushResultTask(AbstractTask):
    def __init__(self, jraze_api: JrazeApi):
        self.jraze_api: JrazeApi = jraze_api

    async def run(self, kwargs: dict):
        task_args: NotificationSentResultMessageArgs = deserialize.deserialize(
            NotificationSentResultMessageArgs, kwargs)

        if task_args.device_platform == DevicePlatform.IOS:
            await self.jraze_api.increase_notification_sent(
                notification_uuid=task_args.notification_uuid,
                ios=task_args.sent,
            )
        elif task_args.device_platform == DevicePlatform.Android:
            await self.jraze_api.increase_notification_sent(
                notification_uuid=task_args.notification_uuid,
                android=task_args.sent,
            )
Beispiel #4
0
async def application():
    logger = get_logger(__name__)

    app = web.Application(logger=logger)
    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,
    )

    mongo_config = config.api_server.mongo
    mongo_client = motor.motor_asyncio.AsyncIOMotorClient(
        f'mongodb://{mongo_config.user}:{mongo_config.password}'
        f'@{mongo_config.host}:{mongo_config.port}'
    )[mongo_config.database]

    task_queue_config = config.api_server.task_queue
    task_queue_pool = await aiomysql.create_pool(
        host=task_queue_config.host,
        port=task_queue_config.port,
        user=task_queue_config.user,
        password=task_queue_config.password,
        db=task_queue_config.database,
        autocommit=False,
    )

    notification_task_queue_repository = TaskRepository(
        pool=task_queue_pool,
        topic_name='NOTIFICATION_TOPIC',
    )
    await notification_task_queue_repository.initialize()
    notification_task_queue = TasksDispatcher(
        repository=notification_task_queue_repository,
    )

    resource_list = {
        '/devices': DevicesHttpResource(
            device_dispatcher=DeviceDispatcher(
                database=mongo_client
            )
        ),
        '/notifications': NotificationsHttpResource(
            device_dispatcher=DeviceDispatcher(
                database=mongo_client
            ),
            notification_task_queue=notification_task_queue,
        ),
        '/internal': InternalHttpResource(
            internal_api_keys=config.api_server.internal_api_keys,
        ),
    }

    for path, resource in resource_list.items():
        resource: AbstractResource = resource  # NOTE(pjongy): For type hinting
        resource.route()
        plugin_app(app, path, resource.app)

    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