init commit

This commit is contained in:
prod-tech
2024-11-17 02:31:42 +03:00
commit cf933c770c
217 changed files with 19340 additions and 0 deletions
+208
View File
@@ -0,0 +1,208 @@
import typing
import uuid
import fastapi
import sqlmodel
import app.api.auth.deps
from app.api.transactions.routers import transactions_router
import app.core.db
import app.models.item
@transactions_router.get(
'/{event_id}/{transaction_id}',
response_model=app.models.transactions.OutputTransaction,
description='Get a transaction by its event and transaction id',
dependencies=[fastapi.Depends(app.api.auth.deps.get_current_user)],
responses={
fastapi.status.HTTP_404_NOT_FOUND: {
'model': app.models.base.BasicResponse,
'detail': r'Event \ transaction not found',
},
},
)
async def get_transaction(
event_id: uuid.UUID,
transaction_id: uuid.UUID,
):
with sqlmodel.Session(app.core.db.engine) as session:
event = session.get(app.models.event.Event, event_id)
if not event:
raise fastapi.HTTPException(
status_code=404, detail='Event not found'
)
transaction = session.get(
app.models.transactions.Transaction, transaction_id
)
output_transaction = app.models.transactions.OutputTransaction(
title=transaction.title,
payer=transaction.payer,
event_id=transaction.event_id,
closed=transaction.closed,
items=transaction.items,
id=transaction.id,
)
return output_transaction
@transactions_router.get(
'/{event_id}',
description='Get all transactions of an event',
dependencies=[fastapi.Depends(app.api.auth.deps.get_current_user)],
responses={
fastapi.status.HTTP_404_NOT_FOUND: {
'model': app.models.base.BasicResponse,
'detail': r'Event not found',
},
},
)
async def list_transactions(
event_id: uuid.UUID,
) -> list[app.models.transactions.OutputTransaction]:
with sqlmodel.Session(app.core.db.engine) as session:
event = session.get(app.models.event.Event, event_id)
if not event:
raise fastapi.HTTPException(
status_code=404, detail='Event not found'
)
output = []
for transaction in event.transactions:
output.append(
app.models.transactions.OutputTransaction(
title=transaction.title,
payer=transaction.payer,
event_id=transaction.event_id,
closed=transaction.closed,
items=transaction.items,
id=transaction.id,
)
)
return output
@transactions_router.post(
'/{event_id}',
response_model=app.models.transactions.OutputTransaction,
description='Create a transaction by a event id',
dependencies=[fastapi.Depends(app.api.auth.deps.get_current_user)],
responses={
fastapi.status.HTTP_404_NOT_FOUND: {
'model': app.models.base.BasicResponse,
'detail': 'Event not found',
},
},
)
async def create_transaction(
title: typing.Annotated[
str, fastapi.Body(description='Title of transaction')
],
event_id: uuid.UUID,
user: typing.Annotated[
app.models.user.User,
fastapi.Depends(app.api.auth.deps.get_current_user),
],
):
with sqlmodel.Session(app.core.db.engine) as session:
event = session.get(app.models.event.Event, event_id)
if not event:
raise fastapi.HTTPException(
status_code=404, detail='Event not found'
)
transaction = app.models.transactions.Transaction(
title=title,
payer_id=user.id,
event_id=event.id,
items=[],
)
session.add(transaction)
session.commit()
session.refresh(transaction)
output_transaction = app.models.transactions.OutputTransaction(
id=transaction.id,
title=transaction.title,
payer=transaction.payer,
event_id=transaction.event_id,
closed=transaction.closed,
items=transaction.items,
)
return output_transaction
@transactions_router.post(
'/{event_id}/{transaction_id}/items',
response_model=app.models.item.Item,
description='Create a transaction by a event id',
dependencies=[fastapi.Depends(app.api.auth.deps.get_current_user)],
responses={
fastapi.status.HTTP_404_NOT_FOUND: {
'model': app.models.base.BasicResponse,
'detail': r'Event \ transaction not found',
},
400: {
'model': app.models.base.BasicResponse,
'description': 'Invalid data format (ex. negative price)',
},
},
)
async def add_item_to_transaction(
event_id: uuid.UUID,
transaction_id: uuid.UUID,
title: str = fastapi.Body(description='Title of item'),
price: float = fastapi.Body(description='Price of item'),
add_all_users: bool = fastapi.Body(
description='Assign all users to this item', default=False
),
):
with sqlmodel.Session(app.core.db.engine) as session:
event = session.get(app.models.event.Event, event_id)
if not event:
raise fastapi.HTTPException(
status_code=404, detail='Event not found'
)
transaction = session.get(
app.models.transactions.Transaction, transaction_id
)
if not transaction:
raise fastapi.HTTPException(
status_code=404, detail='Transaction not found'
)
if transaction.event_id != event.id:
raise fastapi.HTTPException(
status_code=404,
detail='This transaction is not a child of this event',
)
item = app.models.item.Item(
title=title,
price=price,
assigned_to=[] if not add_all_users else event.users,
transaction_id=transaction_id,
)
if item.price <= 0:
raise fastapi.HTTPException(
detail='Price cannot be null or negative', status_code=400
)
session.add(item)
session.commit()
session.refresh(item)
return item