Skip to content

Commit 8c980a4

Browse files
committed
feat(fastapi): cover CreateRelation
1 parent 5dacbaa commit 8c980a4

File tree

4 files changed

+72
-3
lines changed

4 files changed

+72
-3
lines changed

src/tgdb/presentation/fastapi/common/error_handling.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
from fastapi import FastAPI, Response, status
22
from fastapi.responses import JSONResponse
33

4-
from tgdb.application.common.ports.relations import NoRelationError
5-
from tgdb.presentation.fastapi.common.schemas.error import NoRelationSchema
4+
from tgdb.application.common.ports.relations import (
5+
NoRelationError,
6+
NotUniqueRelationNumberError,
7+
)
8+
from tgdb.presentation.fastapi.common.schemas.error import (
9+
NoRelationSchema,
10+
NotUniqueRelationNumberSchema,
11+
)
612
from tgdb.presentation.fastapi.horizon.error_handling import (
713
add_horizon_error_handling,
814
)
@@ -22,3 +28,12 @@ def _(_: object) -> Response:
2228
schema.model_dump(mode="json", by_alias=True),
2329
status_code=status.HTTP_404_NOT_FOUND,
2430
)
31+
32+
@app.exception_handler(NotUniqueRelationNumberError)
33+
def _(_: object) -> Response:
34+
schema = NotUniqueRelationNumberSchema()
35+
36+
return JSONResponse(
37+
schema.model_dump(mode="json", by_alias=True),
38+
status_code=status.HTTP_409_CONFLICT,
39+
)

src/tgdb/presentation/fastapi/common/schemas/error.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,8 @@ class NoRelationSchema(BaseModel):
88
Relation was not created.
99
"""
1010

11-
type: Literal["NoRelation"] = "NoRelation"
11+
type: Literal["noRelation"] = "noRelation"
12+
13+
14+
class NotUniqueRelationNumberSchema(BaseModel):
15+
type: Literal["notUniqueRelationNumber"] = "notUniqueRelationNumber"

src/tgdb/presentation/fastapi/relation/routers.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from tgdb.presentation.fastapi.relation.routes.create_relation import (
2+
create_relation_router,
3+
)
14
from tgdb.presentation.fastapi.relation.routes.view_all_relations import (
25
view_all_relations_router,
36
)
@@ -7,6 +10,7 @@
710

811

912
relation_routers = (
13+
create_relation_router,
1014
view_all_relations_router,
1115
view_relation_router,
1216
)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from typing import Annotated
2+
3+
from dishka.integrations.fastapi import FromDishka, inject
4+
from fastapi import APIRouter, Query, status
5+
from fastapi.responses import Response
6+
from pydantic import BaseModel, Field, PositiveInt
7+
8+
from tgdb.application.relation.create_relation import CreateRelation
9+
from tgdb.entities.numeration.number import Number
10+
from tgdb.presentation.fastapi.common.schemas.error import (
11+
NotUniqueRelationNumberSchema,
12+
)
13+
from tgdb.presentation.fastapi.common.tags import Tag
14+
from tgdb.presentation.fastapi.relation.schemas.schema import SchemaSchema
15+
16+
17+
create_relation_router = APIRouter()
18+
19+
20+
class CreateRelationSchema(BaseModel):
21+
schema_: SchemaSchema = Field(alias="schema")
22+
23+
24+
@create_relation_router.post(
25+
"/relations/{relation_number}",
26+
status_code=status.HTTP_201_CREATED,
27+
responses={
28+
status.HTTP_201_CREATED: {"content": None},
29+
status.HTTP_409_CONFLICT: {"model": NotUniqueRelationNumberSchema},
30+
},
31+
summary="Create relation",
32+
description="Create relation with unique number.",
33+
tags=[Tag.relation],
34+
)
35+
@inject
36+
async def _(
37+
create_relation: FromDishka[CreateRelation],
38+
relation_number: Annotated[PositiveInt, Query(alias="relationNumber")],
39+
request_body: CreateRelationSchema,
40+
) -> Response:
41+
await create_relation(
42+
Number(relation_number),
43+
request_body.schema_.decoded(),
44+
)
45+
46+
return Response(status_code=status.HTTP_201_CREATED)

0 commit comments

Comments
 (0)