from aiohttp import web from aiohttp_apispec import docs, headers_schema, json_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 import config from server.constants.core import BASE_API_PREFIX from server.db.models import Application from server.db.models.messages import PushMessage from server.publishers.schemas.base import sns_common_messages_schema from server.publishers.schemas.messages import PushMessageBodySchema from server.scenarios.messages.create_bulk import create_multiple_messages_scenario from server.scenarios.messages.get_bulk import get_multiple_messages_scenario from server.schemas.messages import PushMessages router = web.RouteTableDef() @router.post(BASE_API_PREFIX + "/service/messages/push/list/") @docs( tags=["service", "push-message"], summary="Get multiple push messages by id.", ) @headers_schema(AppHeader) @json_schema(PushMessages.List.Request) @dump_response_schema(PushMessages.List.Response, apply=True) async def get_messages(request: web.Request) -> web.Response: return await get_multiple_messages_scenario(PushMessage, data=request["json"], app_slug=request["headers"]["app"]) @router.post(BASE_API_PREFIX + "/service/messages/push/") @docs( tags=["service", "push-message"], summary="Create multiple push messages.", ) @headers_schema(AppHeader) @json_schema(PushMessages.CreateBulk.Request) @dump_response_schema(PushMessages.CreateBulk.Response, apply=False) async def create_messages(request: web.Request) -> web.Response: public = request["json"]["public"] and config.ALLOW_PUSH_MESSAGES_PUBLISHING return await create_multiple_messages_scenario( PushMessage, data=request["json"], app_slug=request["headers"]["app"], code="push_messages_created", public=public, publish_schema=sns_common_messages_schema(message_body_schema=PushMessageBodySchema), ) @router.put(BASE_API_PREFIX + "/service/messages/push/") @docs( tags=["service", "push-message"], summary="Update multiple push messages.", ) @headers_schema(AppHeader) @json_schema(PushMessages.UpdateBulk.Request) async def update_messages(request: web.Request) -> web.Response: app_slug = request["headers"]["app"] app = await Application.get(slug=app_slug) if not app: raise NotFound(f"An application with the slug {app_slug} is not found.") await PushMessage.update_bulk( request["json"]["data"], bind_values=("status", "receipt", "receipt_id"), filters=(PushMessage.app_slug == app_slug,), bind_filters=("id",), ) return web.Response()