init commit
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
from uuid import UUID
|
||||
|
||||
import fastapi
|
||||
import sqlmodel
|
||||
|
||||
import app.core.db
|
||||
from app.models.event import Event
|
||||
from app.models.item import Item
|
||||
from app.models.item import ItemRequest
|
||||
from app.models.item import OutputItem
|
||||
from app.models.transactions import Transaction
|
||||
|
||||
from ...models import BasicResponse
|
||||
from ..auth.deps import BearerAuth
|
||||
from .routers import items_router
|
||||
|
||||
|
||||
@items_router.get(
|
||||
'/{transaction_id}',
|
||||
description='Get items from transaction',
|
||||
responses={
|
||||
404: {
|
||||
'model': BasicResponse,
|
||||
'description': 'Transaction by this ID is not found',
|
||||
},
|
||||
403: {'model': BasicResponse, 'description': 'Unauthorized'},
|
||||
},
|
||||
)
|
||||
async def get_items(transaction_id: UUID) -> list[OutputItem]:
|
||||
with sqlmodel.Session(bind=app.core.db.engine) as session:
|
||||
transaction = session.get(Transaction, transaction_id)
|
||||
if not transaction:
|
||||
raise fastapi.HTTPException(
|
||||
detail='Transaction not found', status_code=404
|
||||
)
|
||||
|
||||
out = []
|
||||
for ti in transaction.items:
|
||||
out.append(OutputItem(
|
||||
title=ti.title,
|
||||
id=ti.id,
|
||||
price=ti.price,
|
||||
assigned_to=ti.assigned_to,
|
||||
transaction_id=ti.transaction_id
|
||||
))
|
||||
return out
|
||||
|
||||
|
||||
@items_router.post(
|
||||
'/{transaction_id}',
|
||||
description='Create item in transaction',
|
||||
responses={
|
||||
400: {
|
||||
'model': BasicResponse,
|
||||
'description': 'Invalid data format (ex. negative price)',
|
||||
},
|
||||
404: {
|
||||
'model': BasicResponse,
|
||||
'description': 'Transaction with this ID is not found',
|
||||
},
|
||||
403: {'model': BasicResponse, 'description': 'Unauthorized'},
|
||||
},
|
||||
)
|
||||
async def create_item(item: ItemRequest, transaction_id: UUID) -> OutputItem:
|
||||
if item.price <= 0:
|
||||
raise fastapi.HTTPException(
|
||||
detail='Price cannot be null or negative', status_code=400
|
||||
)
|
||||
|
||||
with sqlmodel.Session(bind=app.core.db.engine) as session:
|
||||
transaction = session.get(Transaction, transaction_id)
|
||||
if not transaction:
|
||||
raise fastapi.HTTPException(
|
||||
detail='Transaction not found', status_code=404
|
||||
)
|
||||
event = session.get(Event, transaction.event_id)
|
||||
|
||||
new_item = Item(
|
||||
title=item.title,
|
||||
price=item.price,
|
||||
assigned_to=[] if not item.all_users_selected else event.users,
|
||||
transaction_id=transaction.id,
|
||||
)
|
||||
session.add(new_item)
|
||||
session.commit()
|
||||
session.refresh(new_item)
|
||||
|
||||
return OutputItem(
|
||||
title=item.title,
|
||||
id=item.id,
|
||||
price=item.price,
|
||||
assigned_to=item.assigned_to,
|
||||
transaction_id=item.transaction_id
|
||||
)
|
||||
|
||||
|
||||
@items_router.get(
|
||||
path='/{transaction_id}/{item_id}',
|
||||
description='Get item by itself ID',
|
||||
dependencies=[fastapi.Depends(BearerAuth())],
|
||||
responses={
|
||||
404: {
|
||||
'model': BasicResponse,
|
||||
'description': 'Item with this ID is not found',
|
||||
},
|
||||
403: {'model': BasicResponse, 'description': 'Unauthorized'},
|
||||
},
|
||||
)
|
||||
async def get_item(transaction_id: UUID, item_id: UUID) -> OutputItem:
|
||||
with sqlmodel.Session(bind=app.core.db.engine) as session:
|
||||
item = session.get(Item, item_id)
|
||||
if not item:
|
||||
raise fastapi.HTTPException(
|
||||
detail='Item not found', status_code=404
|
||||
)
|
||||
|
||||
return OutputItem(
|
||||
id=item.id,
|
||||
title=item.title,
|
||||
price=item.price,
|
||||
assigned_to=item.assigned_to,
|
||||
transaction_id=transaction_id,
|
||||
)
|
||||
Reference in New Issue
Block a user