MeshChatX/tests/backend/http_api_response_registry.py

703 lines
23 KiB
Python

# SPDX-License-Identifier: 0BSD
"""Registry of HTTP JSON response contracts for GET /api/v1 routes."""
from __future__ import annotations
import re
from tests.backend.api_json_contract_schemas import (
ALTCHA_CHALLENGE_SCHEMA,
API_V1_APP_INFO_ENVELOPE_SCHEMA,
API_V1_STATUS_SCHEMA,
AUTH_STATUS_SCHEMA,
SELF_TEST_SCHEMA,
TELEPHONE_CONTACT_CHECK_SCHEMA,
TELEPHONE_CONTACTS_LIST_SCHEMA,
TELEPHONE_RINGTONE_STATUS_SCHEMA,
TELEPHONE_RINGTONES_LIST_SCHEMA,
TELEPHONE_VOICEMAIL_STATUS_SCHEMA,
TELEPHONE_VOICEMAILS_ENVELOPE_SCHEMA,
)
from tests.backend.http_api_contract_runtime import HttpJsonContract
from tests.backend.http_api_response_schemas import (
ACCESS_ATTEMPTS_SCHEMA,
ACTIVE_SESSIONS_SCHEMA,
ANNOUNCE_SINGLE_SCHEMA,
ANNOUNCES_LIST_SCHEMA,
BLACKHOLE_STATUS_SCHEMA,
BLOCKED_DESTINATIONS_ENVELOPE_SCHEMA,
BOTS_STATUS_SCHEMA,
BOTS_SUBPROCESS_LOG_SCHEMA,
CHANGELOG_SCHEMA,
COMMUNITY_INTERFACES_SCHEMA,
COMPORTS_ENVELOPE_SCHEMA,
CONFIG_ENVELOPE_SCHEMA,
CSRF_ENVELOPE_SCHEMA,
DATABASE_BACKUPS_SCHEMA,
DATABASE_HEALTH_SCHEMA,
DATABASE_SNAPSHOTS_SCHEMA,
DEBUG_LOGS_SCHEMA,
DESTINATION_DISPLAY_NAME_SCHEMA,
DESTINATION_PATH_SCHEMA,
DESTINATION_SIGNAL_METRICS_SCHEMA,
DESTINATION_STAMP_INFO_SCHEMA,
DISCOVERED_INTERFACES_SCHEMA,
DISCOVERY_CONFIG_SCHEMA,
DOCS_SEARCH_SCHEMA,
DOCS_STATUS_SCHEMA,
ERROR_ENVELOPE_SCHEMA,
FAVOURITES_SCHEMA,
GIFS_LIST_SCHEMA,
IDENTITIES_LIST_SCHEMA,
IDENTITY_BACKUP_BASE32_SCHEMA,
INTERFACE_STATS_SCHEMA,
INTERFACES_LIST_SCHEMA,
LICENSES_ENVELOPE_SCHEMA,
LXMF_CONVERSATION_MESSAGES_SCHEMA,
LXMF_CONVERSATION_PINS_SCHEMA,
LXMF_CONVERSATIONS_SCHEMA,
LXMF_FOLDERS_SCHEMA,
LXMF_MESSAGE_BLOCKLIST_SCHEMA,
LXMF_MESSAGE_URI_SCHEMA,
LXMF_PROPAGATION_NODES_SCHEMA,
LXMF_PROPAGATION_STATUS_SCHEMA,
LXMF_SIEVE_FILTERS_SCHEMA,
MAINTENANCE_MESSAGES_PURGE_PREVIEW_SCHEMA,
MAINTENANCE_MESSAGES_DUPLICATES_SCHEMA,
MAP_DATA_HEARD_SCHEMA,
MAP_DATA_PUBLISHED_SCHEMA,
MAP_DATA_STATUS_SCHEMA,
MAP_DRAWINGS_SCHEMA,
MAP_MBTILES_SCHEMA,
MAP_OFFLINE_SCHEMA,
MEMORY_DIAGNOSTICS_DISABLED_SCHEMA,
MEMORY_DIAGNOSTICS_SCHEMA,
MESHCHATX_DOCS_CONTENT_SCHEMA,
MESHCHATX_DOCS_LIST_SCHEMA,
MESSAGE_ENVELOPE_SCHEMA,
NOMADNET_ARCHIVES_SCHEMA,
NOTIFICATIONS_SCHEMA,
PAGE_NODE_DETAIL_SCHEMA,
PAGE_NODE_FILES_SCHEMA,
PAGE_NODE_PAGES_SCHEMA,
PAGE_NODES_LIST_SCHEMA,
PATH_TABLE_SCHEMA,
REPOSITORY_SERVER_LIST_SCHEMA,
REPOSITORY_SERVER_STATUS_SCHEMA,
RETICULUM_CONFIG_RAW_SCHEMA,
RETICULUM_INSTANCE_SCHEMA,
RNCP_STATUS_SCHEMA,
RNCP_TRANSFER_SCHEMA,
FILESYNC_ACL_SCHEMA,
FILESYNC_DIRECTORIES_SCHEMA,
FILESYNC_FILES_SCHEMA,
FILESYNC_PEERS_SCHEMA,
FILESYNC_STATUS_SCHEMA,
FILESYNC_TREE_SCHEMA,
RNPATH_RATES_SCHEMA,
RNPATH_TABLE_SCHEMA,
RNPATH_TRACE_SCHEMA,
RNSH_OUTPUT_SCHEMA,
RNSH_SESSIONS_SCHEMA,
RNSTATUS_SCHEMA,
RNX_OUTPUT_SCHEMA,
RNX_SESSIONS_SCHEMA,
RRC_ACTIVITY_SCHEMA,
RRC_HUBS_SCHEMA,
RRC_MEMBERS_SCHEMA,
RRC_MESSAGES_SCHEMA,
RRC_ROOM_KEYS_SCHEMA,
RRC_SERVERS_SCHEMA,
SERVER_SECURITY_SCHEMA,
SPAM_KEYWORDS_SCHEMA,
STICKER_PACK_DETAIL_SCHEMA,
STICKER_PACKS_LIST_SCHEMA,
STICKERS_LIST_SCHEMA,
SYSTEM_NETWORK_INTERFACES_SCHEMA,
TELEMETRY_HISTORY_SCHEMA,
TELEMETRY_LATEST_SCHEMA,
TELEMETRY_PEERS_SCHEMA,
TELEMETRY_TRACKING_SCHEMA,
TELEMETRY_TRUSTED_PEERS_SCHEMA,
TELEPHONE_AUDIO_PROFILES_SCHEMA,
TELEPHONE_CALL_MODES_SCHEMA,
TELEPHONE_CODEC2_STATUS_SCHEMA,
TELEPHONE_HISTORY_SCHEMA,
TELEPHONE_RECORDINGS_SCHEMA,
TELEPHONE_STATUS_SCHEMA,
TRANSLATOR_LANGUAGES_SCHEMA,
)
_HEX32 = "a" * 32
_HEX16 = "b" * 16
_HEX64 = "b" * 64
_NODE_ID = "1"
_ROOM = "lobby"
_HUB_ID = "1"
_SESSION_ID = "1"
_TRANSFER_ID = "1"
_PAGE_NAME = "index.mu"
HTTP_JSON_GET_CONTRACTS: tuple[HttpJsonContract, ...] = (
HttpJsonContract("GET", "/api/v1/status", API_V1_STATUS_SCHEMA),
HttpJsonContract("GET", "/api/v1/self-test", SELF_TEST_SCHEMA),
HttpJsonContract("GET", "/api/v1/app/info", API_V1_APP_INFO_ENVELOPE_SCHEMA),
HttpJsonContract("GET", "/api/v1/app/sessions", ACTIVE_SESSIONS_SCHEMA),
HttpJsonContract("GET", "/api/v1/app/changelog", CHANGELOG_SCHEMA),
HttpJsonContract("GET", "/api/v1/auth/status", AUTH_STATUS_SCHEMA),
HttpJsonContract("GET", "/api/v1/auth/csrf", CSRF_ENVELOPE_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/auth/altcha/challenge",
ALTCHA_CHALLENGE_SCHEMA,
allow_statuses=(200, 404, 503),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/server/security", SERVER_SECURITY_SCHEMA),
HttpJsonContract("GET", "/api/v1/config", CONFIG_ENVELOPE_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/maintenance/messages/purge-preview",
MAINTENANCE_MESSAGES_PURGE_PREVIEW_SCHEMA,
query={"older_than_days": "30"},
),
HttpJsonContract(
"GET",
"/api/v1/maintenance/messages/duplicates",
MAINTENANCE_MESSAGES_DUPLICATES_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/blocked-destinations",
BLOCKED_DESTINATIONS_ENVELOPE_SCHEMA,
),
HttpJsonContract("GET", "/api/v1/comports", COMPORTS_ENVELOPE_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/system/network-interfaces",
SYSTEM_NETWORK_INTERFACES_SCHEMA,
),
HttpJsonContract("GET", "/api/v1/reticulum/interfaces", INTERFACES_LIST_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/reticulum/interface-modules",
{
"type": "object",
"required": ["interfacepath", "modules"],
"properties": {
"interfacepath": {"type": "string"},
"modules": {"type": "array"},
},
"additionalProperties": True,
},
),
HttpJsonContract(
"GET",
"/api/v1/community-interfaces",
COMMUNITY_INTERFACES_SCHEMA,
),
HttpJsonContract("GET", "/api/v1/reticulum/discovery", DISCOVERY_CONFIG_SCHEMA),
HttpJsonContract("GET", "/api/v1/reticulum/instance", RETICULUM_INSTANCE_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/reticulum/management-identities",
{
"type": "object",
"required": ["identities"],
"properties": {"identities": {"type": "array"}},
"additionalProperties": True,
},
),
HttpJsonContract(
"GET",
"/api/v1/reticulum/discovered-interfaces",
DISCOVERED_INTERFACES_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/reticulum/config/raw",
RETICULUM_CONFIG_RAW_SCHEMA,
),
HttpJsonContract("GET", "/api/v1/reticulum/blackhole", BLACKHOLE_STATUS_SCHEMA),
HttpJsonContract("GET", "/api/v1/interface-stats", INTERFACE_STATS_SCHEMA),
HttpJsonContract("GET", "/api/v1/path-table", PATH_TABLE_SCHEMA),
HttpJsonContract("GET", "/api/v1/licenses", LICENSES_ENVELOPE_SCHEMA),
HttpJsonContract("GET", "/api/v1/docs/status", DOCS_STATUS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/docs/search",
DOCS_SEARCH_SCHEMA,
query={"q": "reticulum"},
),
HttpJsonContract("GET", "/api/v1/meshchatx-docs/list", MESHCHATX_DOCS_LIST_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/meshchatx-docs/content",
MESHCHATX_DOCS_CONTENT_SCHEMA,
query={"path": "en/getting-started.md"},
),
HttpJsonContract(
"GET",
"/api/v1/repository-server/status",
REPOSITORY_SERVER_STATUS_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/repository-server/list",
REPOSITORY_SERVER_LIST_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/database/health", DATABASE_HEALTH_SCHEMA),
HttpJsonContract("GET", "/api/v1/database/snapshots", DATABASE_SNAPSHOTS_SCHEMA),
HttpJsonContract("GET", "/api/v1/database/backups", DATABASE_BACKUPS_SCHEMA),
HttpJsonContract("GET", "/api/v1/debug/logs", DEBUG_LOGS_SCHEMA),
HttpJsonContract("GET", "/api/v1/debug/access-attempts", ACCESS_ATTEMPTS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/diagnostics/memory",
MEMORY_DIAGNOSTICS_SCHEMA,
alt_schemas=(MEMORY_DIAGNOSTICS_DISABLED_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/diagnostics/memory/heap",
MEMORY_DIAGNOSTICS_SCHEMA,
allow_statuses=(200, 400),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/diagnostics/memory/gc",
MEMORY_DIAGNOSTICS_SCHEMA,
alt_schemas=(MEMORY_DIAGNOSTICS_DISABLED_SCHEMA, MESSAGE_ENVELOPE_SCHEMA),
),
HttpJsonContract(
"GET",
"/api/v1/diagnostics/memory/referrers",
MEMORY_DIAGNOSTICS_SCHEMA,
allow_statuses=(200, 400),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/identities", IDENTITIES_LIST_SCHEMA),
HttpJsonContract(
"POST",
"/api/v1/identity/backup/base32",
IDENTITY_BACKUP_BASE32_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/announce",
ANNOUNCE_SINGLE_SCHEMA,
query={"aspect": "lxmf.delivery"},
),
HttpJsonContract("GET", "/api/v1/announces", ANNOUNCES_LIST_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/destination/{destination_hash}/path",
DESTINATION_PATH_SCHEMA,
match_info={"destination_hash": _HEX32},
),
HttpJsonContract(
"GET",
"/api/v1/destination/{destination_hash}/custom-display-name",
DESTINATION_DISPLAY_NAME_SCHEMA,
match_info={"destination_hash": _HEX32},
),
HttpJsonContract(
"GET",
"/api/v1/destination/{destination_hash}/lxmf-stamp-info",
DESTINATION_STAMP_INFO_SCHEMA,
match_info={"destination_hash": _HEX32},
),
HttpJsonContract(
"GET",
"/api/v1/destination/{destination_hash}/signal-metrics",
DESTINATION_SIGNAL_METRICS_SCHEMA,
match_info={"destination_hash": _HEX32},
),
HttpJsonContract("GET", "/api/v1/notifications", NOTIFICATIONS_SCHEMA),
HttpJsonContract("GET", "/api/v1/favourites", FAVOURITES_SCHEMA),
HttpJsonContract("GET", "/api/v1/nomadnet/archives", NOMADNET_ARCHIVES_SCHEMA),
HttpJsonContract("GET", "/api/v1/page-nodes", PAGE_NODES_LIST_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/page-nodes/{node_id}",
PAGE_NODE_DETAIL_SCHEMA,
match_info={"node_id": _NODE_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/page-nodes/{node_id}/files",
PAGE_NODE_FILES_SCHEMA,
match_info={"node_id": _NODE_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/page-nodes/{node_id}/pages",
PAGE_NODE_PAGES_SCHEMA,
match_info={"node_id": _NODE_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/page-nodes/{node_id}/pages/{page_name}",
PAGE_NODE_DETAIL_SCHEMA,
match_info={"node_id": _NODE_ID, "page_name": _PAGE_NAME},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/lxmf/conversations", LXMF_CONVERSATIONS_SCHEMA),
HttpJsonContract("GET", "/api/v1/lxmf/folders", LXMF_FOLDERS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/lxmf/conversation-pins",
LXMF_CONVERSATION_PINS_SCHEMA,
),
HttpJsonContract("GET", "/api/v1/lxmf/sieve-filters", LXMF_SIEVE_FILTERS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/lxmf/message-blocklist",
LXMF_MESSAGE_BLOCKLIST_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/lxmf/propagation-nodes",
LXMF_PROPAGATION_NODES_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/lxmf/propagation-node/status",
LXMF_PROPAGATION_STATUS_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/lxmf-messages/conversation/{destination_hash}",
LXMF_CONVERSATION_MESSAGES_SCHEMA,
match_info={"destination_hash": _HEX32},
),
HttpJsonContract(
"GET",
"/api/v1/lxmf-messages/{message_hash}/uri",
LXMF_MESSAGE_URI_SCHEMA,
match_info={"message_hash": _HEX64},
allow_statuses=(200, 404, 422),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/gifs", GIFS_LIST_SCHEMA),
HttpJsonContract("GET", "/api/v1/stickers", STICKERS_LIST_SCHEMA),
HttpJsonContract("GET", "/api/v1/sticker-packs", STICKER_PACKS_LIST_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/sticker-packs/{pack_id}",
STICKER_PACK_DETAIL_SCHEMA,
match_info={"pack_id": _NODE_ID},
allow_statuses=(200, 404),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/map/drawings", MAP_DRAWINGS_SCHEMA),
HttpJsonContract("GET", "/api/v1/map/offline", MAP_OFFLINE_SCHEMA),
HttpJsonContract("GET", "/api/v1/map/mbtiles", MAP_MBTILES_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/map/data/status",
MAP_DATA_STATUS_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/map/data/published",
MAP_DATA_PUBLISHED_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/map/data/heard",
MAP_DATA_HEARD_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/telemetry/peers", TELEMETRY_PEERS_SCHEMA),
HttpJsonContract("GET", "/api/v1/telemetry/tracking", TELEMETRY_TRACKING_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/telemetry/trusted-peers",
TELEMETRY_TRUSTED_PEERS_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/telemetry/latest/{destination_hash}",
TELEMETRY_LATEST_SCHEMA,
match_info={"destination_hash": _HEX32},
allow_statuses=(200, 404),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/telemetry/history/{destination_hash}",
TELEMETRY_HISTORY_SCHEMA,
match_info={"destination_hash": _HEX32},
),
HttpJsonContract("GET", "/api/v1/rrc/hubs", RRC_HUBS_SCHEMA),
HttpJsonContract("GET", "/api/v1/rrc/servers", RRC_SERVERS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/rrc/hubs/{hub_hash}/room-keys",
RRC_ROOM_KEYS_SCHEMA,
match_info={"hub_hash": _HEX32},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/rrc/hubs/{hub_hash}/rooms/{room}/messages",
RRC_MESSAGES_SCHEMA,
match_info={"hub_hash": _HEX32, "room": _ROOM},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/rrc/servers/{hub_id}/members",
RRC_MEMBERS_SCHEMA,
match_info={"hub_id": _HUB_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/rrc/servers/{hub_id}/activity",
RRC_ACTIVITY_SCHEMA,
match_info={"hub_id": _HUB_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/rrc/servers/{hub_id}/messages",
RRC_MESSAGES_SCHEMA,
match_info={"hub_id": _HUB_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/rncp/status", RNCP_STATUS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/rncp/transfer/{transfer_id}",
RNCP_TRANSFER_SCHEMA,
match_info={"transfer_id": _TRANSFER_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/filesync/status",
FILESYNC_STATUS_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/filesync/peers",
FILESYNC_PEERS_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/filesync/files",
FILESYNC_FILES_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/filesync/directories",
FILESYNC_DIRECTORIES_SCHEMA,
allow_statuses=(200, 400, 503),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/filesync/tree",
FILESYNC_TREE_SCHEMA,
allow_statuses=(200, 400, 503),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract(
"GET",
"/api/v1/filesync/acl",
FILESYNC_ACL_SCHEMA,
allow_statuses=(200, 503),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/rnpath/table", RNPATH_TABLE_SCHEMA),
HttpJsonContract("GET", "/api/v1/rnpath/rates", RNPATH_RATES_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/rnpath/trace/{destination_hash}",
RNPATH_TRACE_SCHEMA,
match_info={"destination_hash": _HEX32},
allow_statuses=(200, 500),
alt_schemas=(ERROR_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/rnsh/sessions", RNSH_SESSIONS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/rnsh/sessions/{session_id}/output",
RNSH_OUTPUT_SCHEMA,
match_info={"session_id": _SESSION_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/rnx/sessions", RNX_SESSIONS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/rnx/sessions/{session_id}/output",
RNX_OUTPUT_SCHEMA,
match_info={"session_id": _SESSION_ID},
allow_statuses=(200, 404),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/rnstatus", RNSTATUS_SCHEMA),
HttpJsonContract("GET", "/api/v1/bots/status", BOTS_STATUS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/bots/subprocess-log",
BOTS_SUBPROCESS_LOG_SCHEMA,
allow_statuses=(200, 400),
alt_schemas=(MESSAGE_ENVELOPE_SCHEMA,),
),
HttpJsonContract("GET", "/api/v1/spam-keywords", SPAM_KEYWORDS_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/translator/languages",
TRANSLATOR_LANGUAGES_SCHEMA,
),
HttpJsonContract("GET", "/api/v1/telephone/status", TELEPHONE_STATUS_SCHEMA),
HttpJsonContract("GET", "/api/v1/telephone/history", TELEPHONE_HISTORY_SCHEMA),
HttpJsonContract(
"GET",
"/api/v1/telephone/recordings",
TELEPHONE_RECORDINGS_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/telephone/audio-profiles",
TELEPHONE_AUDIO_PROFILES_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/telephone/call-modes",
TELEPHONE_CALL_MODES_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/telephone/codec2/status",
TELEPHONE_CODEC2_STATUS_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/telephone/voicemail/status",
TELEPHONE_VOICEMAIL_STATUS_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/telephone/voicemails",
TELEPHONE_VOICEMAILS_ENVELOPE_SCHEMA,
query={"limit": "50", "offset": "0"},
),
HttpJsonContract(
"GET",
"/api/v1/telephone/ringtones",
TELEPHONE_RINGTONES_LIST_SCHEMA,
),
HttpJsonContract(
"GET",
"/api/v1/telephone/ringtones/status",
TELEPHONE_RINGTONE_STATUS_SCHEMA,
query={},
),
HttpJsonContract(
"GET",
"/api/v1/telephone/contacts",
TELEPHONE_CONTACTS_LIST_SCHEMA,
query={"limit": "100", "offset": "0"},
),
HttpJsonContract(
"GET",
"/api/v1/telephone/contacts/check/{identity_hash}",
TELEPHONE_CONTACT_CHECK_SCHEMA,
match_info={"identity_hash": _HEX16},
),
)
HTTP_JSON_GET_CONTRACT_EXCLUDED: tuple[str, ...] = (
"/api/v1/database/backup/download",
"/api/v1/database/backups/{filename}/download",
"/api/v1/database/snapshots/{filename}/download",
"/api/v1/docs/export",
"/api/v1/docs/export/reticulum",
"/api/v1/identity/backup/download",
"/api/v1/identities/export-all",
"/api/v1/maintenance/messages/export",
"/api/v1/bots/export",
"/api/v1/gifs/export",
"/api/v1/lxmf/folders/export",
"/api/v1/lxmf/message-blocklist/export",
"/api/v1/stickers/export",
"/api/v1/sticker-packs/{pack_id}/export",
"/api/v1/telephone/contacts/export",
"/api/v1/filesync/content",
"/api/v1/favourites/layout",
"/api/v1/map/overlays",
"/api/v1/map/overlays/jobs/{job_id}",
"/api/v1/map/overlays/{overlay_id}/content",
"/api/v1/notification-sounds",
"/api/v1/notification-sounds/status",
"/api/v1/plugins",
"/api/v1/plugins/trusted-publishers",
"/api/v1/plugins/{plugin_id}/asset/{asset_path:.*}",
"/api/v1/sideband-plugins",
"/api/v1/sideband-plugins/config",
"/api/v1/lxmf-messages/attachment/{message_hash}/{attachment_type}",
"/api/v1/gifs/{gif_id}/image",
"/api/v1/stickers/{sticker_id}/image",
"/api/v1/map/tiles/{z}/{x}/{y}",
"/api/v1/map/export/{export_id}",
"/api/v1/map/export/{export_id}/download",
"/api/v1/telephone/recordings/{id}/audio/{side}",
"/api/v1/telephone/ringtones/{id}/audio",
"/api/v1/telephone/voicemail/greeting/audio",
"/api/v1/telephone/voicemails/{id}/audio",
"/api/v1/lxmf/propagation-node/sync",
"/api/v1/lxmf/propagation-node/stop-sync",
)
_HTTP_JSON_GET_EXCLUDED_PATTERNS: tuple[re.Pattern[str], ...] = (
re.compile(r"/download$"),
re.compile(r"/export$"),
re.compile(r"/image$"),
re.compile(r"/audio"),
re.compile(r"/tiles/"),
)
def is_excluded_json_get_route(path: str) -> bool:
if path in HTTP_JSON_GET_CONTRACT_EXCLUDED:
return True
return any(pattern.search(path) for pattern in _HTTP_JSON_GET_EXCLUDED_PATTERNS)
def registered_get_paths() -> set[str]:
return {contract.path for contract in HTTP_JSON_GET_CONTRACTS}