"""Action menu admin routes."""
import logging
from aiohttp import web
from aiohttp_apispec import docs, match_info_schema, request_schema, response_schema
from marshmallow import fields
from ....admin.request_context import AdminRequestContext
from ....connections.models.conn_record import ConnRecord
from ....messaging.models.base import BaseModelError
from ....messaging.models.openapi import OpenAPISchema
from ....messaging.valid import UUIDFour
from ....storage.error import StorageError, StorageNotFoundError
from .messages.menu import Menu
from .messages.menu_request import MenuRequest
from .messages.perform import Perform
from .models.menu_option import MenuOptionSchema
from .util import MENU_RECORD_TYPE, retrieve_connection_menu, save_connection_menu
LOGGER = logging.getLogger(__name__)
[docs]class ConnIdMatchInfoSchema(OpenAPISchema):
"""Path parameters and validators for request taking connection id."""
conn_id = fields.Str(
description="Connection identifier", required=True, example=UUIDFour.EXAMPLE
)
[docs]async def register(app: web.Application):
"""Register routes."""
app.add_routes(
[
web.post("/action-menu/{conn_id}/close", actionmenu_close),
web.post("/action-menu/{conn_id}/fetch", actionmenu_fetch),
web.post("/action-menu/{conn_id}/perform", actionmenu_perform),
web.post("/action-menu/{conn_id}/request", actionmenu_request),
web.post("/action-menu/{conn_id}/send-menu", actionmenu_send),
]
)
[docs]def post_process_routes(app: web.Application):
"""Amend swagger API."""
# Add top-level tags description
if "tags" not in app._state["swagger_dict"]:
app._state["swagger_dict"]["tags"] = []
app._state["swagger_dict"]["tags"].append(
{"name": "action-menu", "description": "Menu interaction over connection"}
)