Skip to content

Commit 99a94d4

Browse files
committed
feat(commit_transaction): show InvalidRelationTupleError
1 parent 69243bc commit 99a94d4

4 files changed

Lines changed: 41 additions & 2 deletions

File tree

src/tgdb/application/horizon/commit_transaction.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ class CommitTransaction:
3838
async def __call__(self, xid: XID, operators: Sequence[Operator]) -> None:
3939
"""
4040
:raises tgdb.application.relation.ports.relations.NoRelationError:
41+
:raises tgdb.entities.relation.tuple_effect.InvalidRelationTupleError:
4142
:raises tgdb.entities.horizon.horizon.NoTransactionError:
4243
:raises tgdb.entities.horizon.horizon.TransactionCommittingError:
4344
:raises tgdb.entities.horizon.transaction.ConflictError:
@@ -61,6 +62,7 @@ async def _effect(
6162
) -> NewTuple | MutatedTuple | DeletedTuple | Claim:
6263
"""
6364
:raises tgdb.application.relation.ports.relations.NoRelationError:
65+
:raises tgdb.entities.relation.tuple_effect.InvalidRelationTupleError:
6466
"""
6567

6668
match operator:

src/tgdb/presentation/fastapi/horizon/routes/commit_transaction.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
TransactionCommittingSchema,
1515
TransactionConflictSchema,
1616
)
17+
from tgdb.presentation.fastapi.relation.schemas.error import (
18+
InvalidRelationTupleSchema,
19+
)
1720

1821

1922
commit_transaction_router = APIRouter()
@@ -42,7 +45,9 @@ class CommitTransactionSchema(BaseModel):
4245
responses={
4346
status.HTTP_204_NO_CONTENT: {"content": None},
4447
status.HTTP_404_NOT_FOUND: {"model": NoTransactionSchema},
45-
status.HTTP_400_BAD_REQUEST: {"model": TransactionCommittingSchema},
48+
status.HTTP_400_BAD_REQUEST: {
49+
"model": InvalidRelationTupleSchema | TransactionCommittingSchema
50+
},
4651
status.HTTP_409_CONFLICT: {"model": TransactionConflictSchema},
4752
},
4853
summary="Commit transaction",

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@
66
NotUniqueRelationNumberError,
77
)
88
from tgdb.application.relation.ports.tuples import OversizedRelationSchemaError
9+
from tgdb.entities.relation.tuple_effect import InvalidRelationTupleError
910
from tgdb.presentation.fastapi.relation.schemas.error import (
11+
InvalidRelationTupleSchema,
1012
NoRelationSchema,
1113
NotUniqueRelationNumberSchema,
1214
OversizedRelationSchemaSchema,
@@ -40,3 +42,12 @@ def _(_: object, error: OversizedRelationSchemaError) -> Response:
4042
schema.model_dump(mode="json", by_alias=True),
4143
status_code=status.HTTP_400_BAD_REQUEST,
4244
)
45+
46+
@app.exception_handler(InvalidRelationTupleError)
47+
def _(_: object, error: InvalidRelationTupleError) -> Response:
48+
schema = InvalidRelationTupleSchema.of(error)
49+
50+
return JSONResponse(
51+
schema.model_dump(mode="json", by_alias=True),
52+
status_code=status.HTTP_400_BAD_REQUEST,
53+
)

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
from typing import Literal
1+
from typing import Annotated, Literal
22

3+
from annotated_types import Ge
34
from pydantic import BaseModel, Field
45

56
from tgdb.application.relation.ports.tuples import OversizedRelationSchemaError
7+
from tgdb.entities.relation.scalar import Scalar
8+
from tgdb.entities.relation.tuple import TID
9+
from tgdb.entities.relation.tuple_effect import InvalidRelationTupleError
610

711

812
class NoRelationSchema(BaseModel):
@@ -30,3 +34,20 @@ def of(
3034
schemaSize=error.schema_size,
3135
schemaMaxSize=error.schema_max_size,
3236
)
37+
38+
39+
class InvalidRelationTupleSchema(BaseModel):
40+
type: Literal["invalidRelationTuple"] = "invalidRelationTuple"
41+
tid: TID
42+
scalars: tuple[Scalar, ...]
43+
relation_number: Annotated[int, Ge(0)]
44+
45+
@classmethod
46+
def of(
47+
cls, error: InvalidRelationTupleError
48+
) -> "InvalidRelationTupleSchema":
49+
return InvalidRelationTupleSchema(
50+
tid=error.tid,
51+
scalars=error.scalars,
52+
relation_number=int(error.relation_number),
53+
)

0 commit comments

Comments
 (0)