Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"editor.formatOnSave": true,
"[python]": {
"editor.codeActionsOnSave": {
"source.organizeImports": true
"source.organizeImports": "explicit"
}
},
"isort.args": [
Expand Down
8 changes: 8 additions & 0 deletions src/mesh_sandbox/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
inbox,
inbox_count,
lookup,
mailbox_info,
outbox,
tracking,
update,
Expand Down Expand Up @@ -125,3 +126,10 @@ async def validation_exception_handler(request: Request, exc: RequestValidationE
tags=["update"],
responses={status.HTTP_403_FORBIDDEN: {"description": "Forbidden"}},
)

app.include_router(
mailbox_info.router,
prefix="/messageexchange/mailbox",
tags=["Mailbox"],
responses={status.HTTP_403_FORBIDDEN: {"description": "Forbidden"}},
)
10 changes: 1 addition & 9 deletions src/mesh_sandbox/handlers/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@

from ..common.messaging import Messaging
from ..dependencies import get_messaging
from ..models.mailbox import Mailbox
from ..models.message import (
Message,
MessageEvent,
Expand All @@ -14,7 +13,7 @@
MessageStatus,
MessageType,
)
from ..views.admin import AddMessageEventRequest, CreateReportRequest, MailboxDetails
from ..views.admin import AddMessageEventRequest, CreateReportRequest


class AdminHandler:
Expand Down Expand Up @@ -105,10 +104,3 @@ async def add_message_event(
message = await self.messaging.add_message_event(message, event, background_tasks)

return message

async def get_mailbox_details(self, mailbox_id: str) -> MailboxDetails:
mailbox: Optional[Mailbox] = await self.messaging.get_mailbox(mailbox_id)
if not mailbox:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)

return MailboxDetails.from_mailbox(mailbox)
20 changes: 20 additions & 0 deletions src/mesh_sandbox/handlers/mailbox_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from typing import Optional

from fastapi import Depends, HTTPException, status

from ..common.messaging import Messaging
from ..dependencies import get_messaging
from ..models.mailbox import Mailbox
from ..views.admin import MailboxDetails


class MailboxInfoHandler:
def __init__(self, messaging: Messaging = Depends(get_messaging)):
self.messaging = messaging

async def get_mailbox_details(self, mailbox_id: str) -> MailboxDetails:
mailbox: Optional[Mailbox] = await self.messaging.get_mailbox(mailbox_id)
if not mailbox:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND)

return MailboxDetails.from_mailbox(mailbox)
30 changes: 2 additions & 28 deletions src/mesh_sandbox/routers/admin.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from fastapi import APIRouter, BackgroundTasks, Depends, Path, Response, status
from fastapi import APIRouter, BackgroundTasks, Depends, Response, status

from ..dependencies import (
EnvConfig,
Expand All @@ -7,7 +7,7 @@
normalise_message_id_path,
)
from ..handlers.admin import AdminHandler
from ..views.admin import AddMessageEventRequest, CreateReportRequest, MailboxDetails
from ..views.admin import AddMessageEventRequest, CreateReportRequest
from .request_logging import RequestLoggingRoute

router = APIRouter(
Expand Down Expand Up @@ -109,29 +109,3 @@ async def add_message_event(
):
await handler.add_message_event(message_id, new_event, background_tasks)
return Response()


@router.get(
"/admin/mailbox/{mailbox_id}",
summary=f"Get mailbox details. {TESTING_ONLY}",
status_code=status.HTTP_200_OK,
response_model_exclude_none=True,
)
@router.get(
"/messageexchange/admin/mailbox/{mailbox_id}",
summary=f"Get mailbox details. {TESTING_ONLY}",
status_code=status.HTTP_200_OK,
response_model_exclude_none=True,
)
@router.get(
"/messageexchange/mailbox/{mailbox_id}",
summary="Get mailbox details.",
status_code=status.HTTP_200_OK,
response_model_exclude_none=True,
)
async def get_mailbox_details(
mailbox_id: str = Path(..., title="mailbox_id", description="The Mailbox ID of the mailbox to retrieve"),
handler: AdminHandler = Depends(AdminHandler),
) -> MailboxDetails:
mailbox = await handler.get_mailbox_details(mailbox_id)
return mailbox
38 changes: 38 additions & 0 deletions src/mesh_sandbox/routers/mailbox_info.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
from fastapi import APIRouter, Depends, Path, status

from ..common import MESH_MEDIA_TYPES
from ..handlers.mailbox_info import MailboxInfoHandler
from ..views.admin import MailboxDetails
from ..views.lookup import MailboxInfoView
from .request_logging import RequestLoggingRoute

router = APIRouter(
route_class=RequestLoggingRoute,
)


@router.get(
"/{mailbox_id}",
summary="Get mailbox details.",
status_code=status.HTTP_200_OK,
response_model_exclude_none=True,
responses={
status.HTTP_200_OK: {
"content": {
MESH_MEDIA_TYPES[2]: {
"schema": MailboxInfoView.schema(),
},
MESH_MEDIA_TYPES[1]: {
"schema": MailboxInfoView.schema(),
},
}
}
},
openapi_extra={"spec_order": 610},
)
async def get_mailbox_details(
mailbox_id: str = Path(..., title="mailbox_id", description="The Mailbox ID of the mailbox to retrieve"),
handler: MailboxInfoHandler = Depends(MailboxInfoHandler),
) -> MailboxDetails:
mailbox = await handler.get_mailbox_details(mailbox_id)
return mailbox
25 changes: 0 additions & 25 deletions src/mesh_sandbox/tests/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -337,28 +337,3 @@ def test_add_message_event(app: TestClient, tmp_path: str):
)
messages = res.json().get("messages", [])
assert messages == [message_id]


@pytest.mark.parametrize("root_path", ["/admin/mailbox", "/messageexchange/admin/mailbox", "/messageexchange/mailbox"])
def test_get_mailbox_invalid_mailbox_returns_404(app: TestClient, root_path: str):
with temp_env_vars(STORE_MODE="canned"):
res = app.get(f"{root_path}/NotAMailboxId")
assert res.status_code == status.HTTP_404_NOT_FOUND


@pytest.mark.parametrize("root_path", ["/admin/mailbox", "/messageexchange/admin/mailbox", "/messageexchange/mailbox"])
def test_get_mailbox_happy_path(app: TestClient, root_path: str):
with temp_env_vars(STORE_MODE="canned"):
res = app.get(f"{root_path}/{_CANNED_MAILBOX1}")
assert res.status_code == status.HTTP_200_OK

get_mailbox = res.json()
assert len(get_mailbox) == 7

assert get_mailbox["mailbox_id"] == _CANNED_MAILBOX1
assert get_mailbox["mailbox_name"] == "TESTMB1"
assert get_mailbox["billing_entity"] == "England"
assert get_mailbox["ods_code"] == "X26"
assert get_mailbox["org_code"] == "X26"
assert get_mailbox["org_name"] == ""
assert get_mailbox["active"] is True
29 changes: 29 additions & 0 deletions src/mesh_sandbox/tests/mailbox_info_tests.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from fastapi import status
from fastapi.testclient import TestClient

from mesh_sandbox.tests import _CANNED_MAILBOX1

from .helpers import temp_env_vars


def test_get_mailbox_invalid_mailbox_returns_404(app: TestClient):
with temp_env_vars(STORE_MODE="canned"):
res = app.get("/messageexchange/mailbox/NotAMailboxId")
assert res.status_code == status.HTTP_404_NOT_FOUND


def test_get_mailbox_happy_path(app: TestClient):
with temp_env_vars(STORE_MODE="canned"):
res = app.get(f"/messageexchange/mailbox/{_CANNED_MAILBOX1}")
assert res.status_code == status.HTTP_200_OK

get_mailbox = res.json()
assert len(get_mailbox) == 7

assert get_mailbox["mailbox_id"] == _CANNED_MAILBOX1
assert get_mailbox["mailbox_name"] == "TESTMB1"
assert get_mailbox["billing_entity"] == "England"
assert get_mailbox["ods_code"] == "X26"
assert get_mailbox["org_code"] == "X26"
assert get_mailbox["org_name"] == ""
assert get_mailbox["active"] is True
38 changes: 37 additions & 1 deletion src/mesh_sandbox/views/lookup.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Union
from typing import Optional, Union
from uuid import uuid4

from pydantic import BaseModel, Field # pylint: disable=no-name-in-module
Expand Down Expand Up @@ -85,3 +85,39 @@ def workflow_search_response(mailboxes: list[Mailbox], model_version: int = 1) -
for mailbox in mailboxes
]
)


class MailboxInfoView(BaseModel):
mailbox_id: str
mailbox_name: str
active: bool
billing_entity: Optional[str] = None
ods_code: Optional[str] = ""
org_code: Optional[str] = ""
org_name: Optional[str] = ""

class Config:
title = "mailbox-info"
json_schema_extra = {
"example": {
"mailbox_id": "X26OT0ABC1",
"mailbox_name": "This is a mailbox for messages",
"active": True,
"billing_entity": "England",
"ods_code": "X26",
"org_code": "X36001",
"org_name": "SuperOrg",
}
}


def mailbox_info_response(mailbox: Mailbox, _accepts_api_version: int = 2) -> MailboxInfoView:
return MailboxInfoView(
mailbox_id=mailbox.mailbox_id,
mailbox_name=mailbox.mailbox_name,
active=mailbox.active,
billing_entity=mailbox.billing_entity,
ods_code=mailbox.ods_code,
org_code=mailbox.org_code,
org_name=mailbox.org_name,
)