Skip to content

Commit dc3e8e9

Browse files
committed
implement cosmos db APIs
1 parent bb544ef commit dc3e8e9

File tree

5 files changed

+165
-3
lines changed

5 files changed

+165
-3
lines changed

backend/fastapi.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from backend.routers import azure_ai_document_intelligence as azure_ai_document_intelligence_router
55
from backend.routers import azure_ai_vision as azure_ai_vision_router
6+
from backend.routers import azure_cosmos_db as azure_cosmos_db_router
67
from backend.routers import azure_event_grid as azure_event_grid_router
78
from backend.routers import azure_openai as azure_openai_router
89
from backend.routers import azure_storage_blob as azure_storage_blob_router
@@ -19,6 +20,7 @@
1920
azure_openai_router.router,
2021
azure_storage_blob_router.router,
2122
azure_storage_queue_router.router,
23+
azure_cosmos_db_router.router,
2224
]:
2325
app.include_router(router)
2426

backend/internals/azure_cosmos_db.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,23 +22,31 @@ def get_client(self) -> CosmosClient:
2222
def get_database(self, database_id: str) -> DatabaseProxy:
2323
return self.get_client().get_database_client(database_id)
2424

25-
def get_container(self, database_id: str, container_id: str) -> ContainerProxy:
25+
def get_container(
26+
self,
27+
database_id: str,
28+
container_id: str,
29+
) -> ContainerProxy:
2630
return self.get_database(database_id=database_id).get_container_client(container=container_id)
2731

28-
def create_database(self, database_id: str) -> None:
32+
def create_database(
33+
self,
34+
database_id: str,
35+
) -> str:
2936
try:
3037
self.get_client().create_database_if_not_exists(
3138
id=database_id,
3239
)
3340
except AzureError as e:
3441
logger.error(e)
42+
return database_id
3543

3644
def create_container(
3745
self,
3846
database_id: str,
3947
container_id: str,
4048
partition_key_path="/id",
41-
) -> None:
49+
) -> str:
4250
try:
4351
self.get_database(database_id=database_id).create_container_if_not_exists(
4452
id=container_id,
@@ -48,6 +56,7 @@ def create_container(
4856
)
4957
except AzureError as e:
5058
logger.error(e)
59+
return container_id
5160

5261
def create_item(
5362
self,

backend/routers/azure_cosmos_db.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
from logging import getLogger
2+
3+
from fastapi import APIRouter
4+
5+
from backend.internals.azure_cosmos_db import Client
6+
from backend.schemas import azure_cosmos_db as azure_cosmos_db_schemas
7+
from backend.settings.azure_cosmos_db import Settings
8+
9+
logger = getLogger(__name__)
10+
11+
client = Client(
12+
settings=Settings(),
13+
)
14+
15+
router = APIRouter(
16+
prefix="/azure_cosmos_db",
17+
tags=["azure_cosmos_db"],
18+
responses={404: {"description": "Not found"}},
19+
)
20+
21+
22+
@router.post(
23+
"/database",
24+
response_model=azure_cosmos_db_schemas.CreateDatabaseResponse,
25+
status_code=200,
26+
)
27+
async def create_database(body: azure_cosmos_db_schemas.CreateDatabaseRequest):
28+
database_id = client.create_database(
29+
database_id=body.database_id,
30+
)
31+
return azure_cosmos_db_schemas.CreateDatabaseResponse(
32+
database_id=database_id,
33+
)
34+
35+
36+
@router.post(
37+
"/container",
38+
response_model=azure_cosmos_db_schemas.CreateContainerResponse,
39+
status_code=200,
40+
)
41+
async def create_container(body: azure_cosmos_db_schemas.CreateContainerRequest):
42+
container_id = client.create_container(
43+
container_id=body.container_id,
44+
database_id=body.database_id,
45+
)
46+
return azure_cosmos_db_schemas.CreateContainerResponse(
47+
container_id=container_id,
48+
)
49+
50+
51+
@router.post(
52+
"/item",
53+
response_model=azure_cosmos_db_schemas.CreateItemResponse,
54+
status_code=200,
55+
)
56+
async def create_item(body: azure_cosmos_db_schemas.CreateItemRequest):
57+
container = client.get_container(
58+
container_id=body.container_id,
59+
database_id=body.database_id,
60+
)
61+
created_item = client.create_item(
62+
container=container,
63+
item=body.item,
64+
)
65+
return azure_cosmos_db_schemas.CreateItemResponse(
66+
container_id=body.container_id,
67+
database_id=body.database_id,
68+
item=created_item,
69+
)

backend/schemas/azure_cosmos_db.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from logging import getLogger
2+
3+
from pydantic import BaseModel
4+
5+
logger = getLogger(__name__)
6+
7+
8+
class CreateDatabaseRequest(BaseModel):
9+
database_id: str
10+
11+
12+
class CreateDatabaseResponse(BaseModel):
13+
database_id: str
14+
15+
16+
class CreateContainerRequest(BaseModel):
17+
container_id: str
18+
database_id: str
19+
20+
21+
class CreateContainerResponse(BaseModel):
22+
container_id: str
23+
24+
25+
class CreateItemRequest(BaseModel):
26+
container_id: str
27+
database_id: str
28+
item: dict
29+
30+
31+
class CreateItemResponse(BaseModel):
32+
container_id: str
33+
database_id: str
34+
item: dict
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from logging import getLogger
2+
from uuid import uuid4
3+
4+
import pytest
5+
6+
from tests.utilities import RUN_TEST, client
7+
8+
logger = getLogger(__name__)
9+
10+
11+
@pytest.mark.skipif(RUN_TEST, reason="need to launch the backend server first")
12+
def test_azure_cosmos_db():
13+
path_format = "/azure_cosmos_db/{0}"
14+
database_id = str(uuid4())
15+
container_id = str(uuid4())
16+
17+
response = client.post(
18+
url=path_format.format("database"),
19+
json={
20+
"database_id": database_id,
21+
},
22+
)
23+
assert response.status_code == 200
24+
logger.info(f"response: {response.json()}")
25+
26+
response = client.post(
27+
url=path_format.format("container"),
28+
json={
29+
"database_id": database_id,
30+
"container_id": container_id,
31+
},
32+
)
33+
assert response.status_code == 200
34+
logger.info(f"response: {response.json()}")
35+
36+
response = client.post(
37+
url=path_format.format("item"),
38+
json={
39+
"database_id": database_id,
40+
"container_id": container_id,
41+
"item": {
42+
"id": str(uuid4()),
43+
"name": "test",
44+
},
45+
},
46+
)
47+
assert response.status_code == 200
48+
logger.info(f"response: {response.json()}")

0 commit comments

Comments
 (0)